使用OpenCV和ImageAI进行安全帽检测

在许多行业中,确保工人佩戴适当的安全设备是至关重要的。本文将介绍如何使用OpenCV和ImageAI这两个核心库来训练人工智能模型,以检测工人是否佩戴了安全帽。通过本教程,将学会如何使用预训练的模型以及如何开发自己的定制模型。

安装OpenCV和ImageAI进行对象检测

在开始之前,需要安装OpenCVImageAI库。这些库将帮助构建一个端到端的解决方案,用于检测图像或视频流中的任何对象。

寻找训练数据

为了训练模型,需要收集一组训练数据。这些数据将用于训练模型以识别安全帽。

使用预训练模型检测对象

OpenCV和ImageAI提供了一些预训练的模型,这些模型可以直接用于检测图像中的对象。

准备图像进行对象检测

在训练模型之前,需要对图像进行预处理。这包括调整图像大小、归一化等步骤。

训练自定义模型

使用收集的训练数据,可以训练一个自定义的模型来检测安全帽。

使用训练好的模型

现在已经有一个训练好的模型,可以定义一些新的代码块来使用它。首先,需要定义自定义检测模型。

from imageai.Detection.Custom import CustomObjectDetection detector = CustomObjectDetection() detector.setModelTypeAsYOLOv3() detector.setModelPath("hardhat/models/detection_model-ex-020--loss-0008.462.h5") detector.setJsonPath("hardhat/json/detection_config.json") detector.loadModel()

这段代码块与之前使用的预训练模型检测器类似,但为配置定义了模型路径和JSON路径。这允许ImageAI从配置文件中导入对象名称。接下来,复制之前用于检测图像中人物的代码块,并稍作修改以检测验证图像中的人物:

import random peopleImages = os.listdir("people") randomFile = peopleImages[random.randint(0, len(peopleImages) - 1)] detectedImage, detections = detector.detectObjectsFromImage(output_type="array", input_image="people/{0}".format(randomFile), minimum_percentage_probability=30) convertedImage = cv.cvtColor(detectedImage, cv.COLOR_RGB2BGR) showImage(convertedImage) for eachObject in detections: print(eachObject["name"], ": ", eachObject["percentage_probability"], ": ", eachObject["box_points"]) print("-------------------------------")

如果现在运行这两个代码块并查看结果图像,将看到即使只有20次迭代,模型也做得相当不错。如果多次运行随机图像代码块,将看到几乎所有戴安全帽的人物都被检测到了。

下一步

通过利用OpenCV和ImageAI这两个核心库,能够使用预训练的对象检测模型,并开发自己的定制模型来检测人们是否佩戴安全帽。

person_detector = ObjectDetection() person_detector.setModelTypeAsYOLOv3() person_detector.setModelPath('yolo.h5') person_detector.loadModel() hard_hat_detector = CustomObjectDetection() hard_hat_detector.setModelTypeAsYOLOv3() hard_hat_detector.setModelPath("hardhat/models/detection_model-ex-020--loss-0008.462.h5") hard_hat_detector.setJsonPath("hardhat/json/detection_config.json") hard_hat_detector.loadModel()

在这里,创建了两个检测器:一个用于检测所有人,一个用于检测戴安全帽的人。接下来,让加载一张随机图像并通过这两个检测器运行它:

peopleImages = os.listdir("people") randomFile = peopleImages[random.randint(0, len(peopleImages) - 1)] peopleOnly = person_detector.CustomObjects(person=True) _, person_detections = detector.detectCustomObjectsFromImage(custom_objects=peopleOnly, output_type="array", input_image="people/{0}".format(randomFile), minimum_percentage_probability=30) _, hard_hat_detections = detector.detectObjectsFromImage(output_type="array", input_image="people/{0}".format(randomFile), minimum_percentage_probability=30)

最后,将比较每张图像中的检测数量,以查看是否发现了未佩戴安全帽的人:

if len(person_detections) > len(hard_hat_detections): print("安全帽违规检测到!已派遣警察!") # 或者只是通过电子邮件通知老板违规情况

通过这种方式,成功地创建了一个工作的安全帽检测器。

扩展程序

安全帽检测程序相当简单,但可以通过以下方式扩展它:

  • 进行更多的迭代来训练模型。目前,模型能够很好地识别出戴安全帽的人,但数字大多在50%-80%的置信度水平上。通过花费更多的时间训练模型,可以将这些数字提高,使模型更准确。
  • 如果有NVIDIA GPU,可以通过安装Tensorflow的GPU支持版本来显著加速训练。如果没有兼容的GPU,可以在云端以较低的成本访问一个。有几个不错的选择:

Google Colab目前提供免费的GPU支持笔记本实例。

Paperspace Gradient提供免费的GPU支持Jupyter笔记本实例。

Azure Notebooks是另一个不错的选择,但可能需要付费才能使用GPU,除非有Azure积分。

ImageAI还提供了一些其他选项,可以提高模型的可用性:

  • detectObjectsFromImage()方法可以接收一个名为extract_detected_objects=True的参数。可以使用这个参数在迭代之前提取图像中的所有人,并测试他们是否佩戴了安全帽。如果没有,他们的个人图像可以发送给经理。
  • ImageAI还可以支持视频摄像头或实时流检测,使用VideoObjectDetection类。这个类的工作方式与ImageObjectDetection类类似,可以用于支持近乎实时的视频检查。
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485