使用预训练模型通过 OpenCV 和 ImageAI 检测人员
在本文中,我们将介绍一些可以在ImageAI中使用的预训练模型,以开始检测图像中的人物。
在本系列中,我们将学习如何使用Python、OpenCV(一个开源的计算机视觉库)和ImageAI(一个用于视觉的深度学习库)来训练AI,以检测工人是否佩戴了安全帽。在这个过程中,我们将创建一个可以用于实际生活中的端到端解决方案——这不仅仅是一个学术练习!
这是一个重要的应用场景,因为许多公司必须确保工人拥有适当的安全设备。但我们学到的内容不仅仅对检测安全帽有用。在本系列结束时,您将能够使用AI来检测图像或视频流中的几乎任何类型的物体。
您目前正在阅读6篇文章中的第3篇
- 为对象检测安装 OpenCV 和 ImageAI
- 为 OpenCV 和 ImageAI 对象检测查找训练数据
- 使用预训练模型通过OpenCV和ImageAI检测对象
- 为使用 OpenCV 和 ImageAI 的对象检测准备图像
- 使用OpenCV和ImageAI训练自定义模型
- 使用OpenCV和ImageAI检测自定义模型对象
既然我们已经加载并测试了OpenCV库,让我们来看看ImageAI中一些可以用来开始检测图像人物的预训练模型。
ImageAI提供了许多非常方便的方法,可以使用Keras、TensorFlow、OpenCV和训练好的模型来对图像和视频执行对象检测。
选择一个预训练模型
ImageAI的GitHub存储库存储了许多用于图像识别和对象检测的预训练模型,包括:
- ResNet – 一种卷积神经网络,专为高性能和高精度而构建,但检测时间较长
- YOLOv3 – 一个“You Only Look Once”(YOLO)算法的实现,专为中等的性能、精度和检测时间而构建
- TinyYOLOv3 – 另一个YOLO实现,但专为快速检测和高性能而构建,精度中等
由于我们希望构建一个合理准确的检测程序,并且可能需要处理视频,因此我们选择YOLOv3。开始一个新的代码块并输入以下内容:
modelRetinaNet = 'https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/resnet50_coco_best_v2.0.1.h5'
modelYOLOv3 = 'https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/yolo.h5'
modelTinyYOLOv3 = 'https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/yolo-tiny.h5'
if not os.path.exists('yolo.h5'):
r = req.get(modelYOLOv3, timeout=0.5)
with open('yolo.h5', 'wb') as outfile:
outfile.write(r.content)
我在代码块的设置中包含了所有三个链接,以便在必要时进行更改。使用与之前类似的方法,此代码块将下载相关模型并将其保存到项目的基目录中,以便使用。
检测人物
下载模型后,我们需要将其加载到我们的检测器中。我们真的只想加载一次,因为加载模型可能需要一些时间,所以我们创建一个单独的代码块来加载模型:
detector = ObjectDetection()
detector.setModelTypeAsYOLOv3()
detector.setModelPath('yolo.h5')
detector.loadModel()
此代码块使用以下内容将我们的模型加载到检测器变量中:
setModelTypeAsYOLOv3()
– 将我们用于检测对象的模型设置为YOLOv3;其他选项包括setModelTypeAsRetinaNet
或setModelTypeAsTinyYOLOv3
setModelPath()
– 提供模型的路径loadModel()
– 将模型加载到内存中
第一次使用检测器时,您会看到一些警告,因为TensorFlow的版本正在过时,但目前可以安全地忽略这些警告。当模型激活并准备就绪后,让我们随机选取一张图片并开始检测人物。创建一个新的代码块并添加以下内容:
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("--------------------------------")
此代码块分为三个部分。第一部分只是从我们的“people”目录中选取一个随机文件来执行检测。第二部分使用模型进行检测,通过:
- 使用
detectObjectsFromImage
方法,该方法可以返回一个NumPy数组(到第一个变量detectedImage
)或输出到图像文件。input_image
参数指定要执行检测的文件。minimum_percentage_probability
参数指定模型对对象匹配训练类型的置信度。- 该方法还将检测列表输出到变量
detections
。
- 将检测到的图像NumPy数组加载到OpenCV图像中。OpenCV使用BGR数组来存储数据,因此我们需要将RGB数组转换为BGR。
- 使用OpenCV中的
showImage
方法显示图像。
在显示图像后,最后一个代码块输出了不同的检测结果和覆盖它们的边界框。第一次运行检测时,您会注意到图像显示需要很长时间。这是因为模型正在“预热”。但是,如果您重新运行此代码块,图像应该会很快显示出来。此外,根据您的图像,您可能会发现模型检测到的不仅仅是人物。这是因为提供的YOLOv3模型是在大约80种不同类型的对象上训练的。
对象也都有标签。如果您按任意键关闭图像并查看输出的文本,您将看到三个值:
- 对象的名称。在这种情况下,大多数对象应该是“person”,但您可能会找到“cup”、“tie”、“handbag”等。
- 模型检测正确的置信度,可能是98%或44%,或其他任何值。
minimum_percentage_probability
设置了这里的阈值。 - 覆盖对象的边界框(以像素为单位),从左上角到右下角,例如X,Y到Z,W。
仅检测人物
这一切看起来都不错,但如果我们只想在源中检测人物呢?幸运的是,ImageAI提供了一个过滤对象的方法:detectCustomObjectsFromImage
。让我们修改之前代码块的第二部分,看看它是如何工作的:
peopleOnly = detector.CustomObjects(person=True)
detectedImage, detections = detector.detectCustomObjectsFromImage(custom_objects=peopleOnly, output_type="array", input_image="people/{0}".format(randomFile), minimum_percentage_probability=30)
convertedImage = cv.cvtColor(detectedImage, cv.COLOR_RGB2BGR)
showImage(convertedImage)
如果您运行此代码块几次,您会发现现在所有图像中都只检测到了人物。现在我们已经设置了一个合理的检测器,我们将创建自己的检测模型来查找佩戴安全帽的人。
接下来
我们已经看到了如何使用预训练模型来检测我们图像数据集中的人物。
接下来,我们将学习如何训练一个自定义AI模型。