使用 OpenCV 和 ImageAI 进行自定义模型对象检测
本文为您自己的对象检测项目提供了一个良好的起点。
在本系列文章中,我们将学习如何使用Python、OpenCV(一个开源计算机视觉库)和ImageAI(一个用于视觉的深度学习库)来训练AI,以检测工人是否佩戴安全帽。在这个过程中,我们将创建一个可以用于现实生活的端到端解决方案——这不仅仅是一个学术练习!
这是一个重要的用例,因为许多公司必须确保工人佩戴正确的安全设备。但我们学到的知识不仅限于检测安全帽。在本系列文章结束时,您将能够使用AI检测图像或视频流中的几乎任何类型的对象。
您目前在第6篇文章,共6篇
- 为对象检测安装 OpenCV 和 ImageAI
- 为 OpenCV 和 ImageAI 对象检测查找训练数据
- 使用预训练模型通过OpenCV和ImageAI检测对象
- 为使用 OpenCV 和 ImageAI 的对象检测准备图像
- 使用OpenCV和ImageAI训练自定义模型
- 使用OpenCV和ImageAI检测自定义模型对象
在前一篇文章中,我们训练了一个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能够从配置文件中导入对象名称。接下来,复制我们之前用于检测“people”目录中图片的的代码块,并对其进行 sedikit 修改,以便在我们的验证图像上进行检测。
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_hatdetections): print("hardhat non-compliance detected! Police have been dispatched!") # or perhaps just e-mail the boss to inform them of the violation
至此,我们成功创建了一个可用的安全帽检测器。
我们还可以对我们这个相对简单的安全帽检测程序做很多其他事情来扩展它。下一步可能是执行更多的迭代来训练我们的模型。目前,该模型能够很好地检测出佩戴安全帽的人,但置信度数字大多在50%-80%之间。
通过花费更多时间训练模型,我们可以提高这些数字,使我们的模型更加准确。
如果您拥有NVIDIA GPU,可以通过安装支持GPU的Tensorflow版本来显著加快训练速度。如果您没有兼容的GPU,可以廉价地在云端访问。有几种不错的选择:
- Google Colab目前免费提供支持GPU的笔记本实例。
- Paperspace Gradient提供免费的支持GPU的Jupyter笔记本实例。
- Azure Notebooks也是一个不错的选择,但除非您有Azure积分,否则可能无法免费使用GPU。
ImageAI提供的其他一些选项也可以提高模型的可用性。
detectObjectsFromImage()
方法可以接受一个名为extract_detected_objects=True
的参数。您可以使用此参数在迭代它们并测试它们是否佩戴安全帽之前,从图像中提取所有人。如果他们没有佩戴,他们的个人图像可以发送给经理。- ImageAI还可以使用
VideoObjectDetection
类支持视频摄像头或实时流检测。这个类的工作方式与ImageObjectDetection
类类似,可以用于支持近乎实时的视频检查。
该ImageAI文档非常全面,希望本文能为您自己的对象检测项目提供一个良好的起点。
总结
如果您从本系列的第一个故事开始就一直关注,那真是一段不短的旅程。但想想我们已经走了多远!从零开始,我们构建了一个在现实世界中获得良好效果的安全帽检测器。最好的消息是,我们学到的经验教训并不是针对安全帽检测的。使用不同的训练数据集,您可以训练模型来检测几乎任何东西!