目标检测是指计算机和软件系统对图像或场景中的目标进行定位和识别的任务。
目标检测已广泛应用于人脸检测、车辆检测、人流量统计、网络图像、安防系统和无人驾驶等多个领域。
早期目标检测的实现基于经典算法,比如流行的计算机视觉库OpenCV中支持的算法。然而,这些经典算法在不同的条件下无法获得稳定的性能。
2012年深度学习的突破性进展和迅速普及,使得R-CNN、Fast-RCNN、Faster-RCNN、RetinaNet以及快速、高度准确的SSD、YOLO等目标检测算法应运而生。
这些基于深度学习、机器学习的算法,需要一定的数学以及深度学习框架基础。有数百万的专业计算机程序员和软件开发人员想要集成和创建基于目标检测算法的新产品。同时由于理解和实际使用较为复杂,一直无法实现。如何开发出高效的目标检测代码呢?
ImageAI就应运而生了。
ImageAI让代码变得简洁
ImageAI是一个python库,只需要几行代码,就可以让程序员和软件开发人员轻松地将最先进的计算机视觉技术集成到他们现有的或新的应用中,ImageAI已经在Github上开源。Github地址: https://github.com/OlafenwaMoses/ImageAI
ImageAI目前支持使用在ImageNet-1000数据集上训练的4种不同机器学习算法进行图像预测和训练。
ImageAI还支持使用在COCO数据集上训练的RetinaNet,YOLOv3和TinyYOLOv3进行对象检测,视频检测和对象跟踪。最后,ImageAI允许训练自定义模型,以执行新目标的检测和识别。
ImageAI库有依赖其他Python库,所以在使用ImageAI开发之前还需要导入其他的包。
准备工作
使用ImageAI实现目标检测,只需进行以下4步:- 在你的电脑上安装Python
- 安装ImageAI,配置依赖环境
- 下载目标检测模块文件
- 运行样例代码(只需10行)
(1)从Python官网下载并安装Python3
链接地址:https://python.org
(2)用pip命令安装以下依赖包:
pip install tensorflow
pip install numpy
pip install scipy
pip install opencv-python
pip install pillow
pip install matplotlib
pip install h5py
pip install keras
pip3 install imageai --upgrade
pip install imageai-2.0.2-py3-none-any.whl
(3)下载用于目标检测的RetinaNet模型文件
链接地址: https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/resnet50_coco_best_v2.0.1.h5
开启10行代码的目标检测
到这里你已经安装好了所有的依赖项,可以开始编写你的第一个目标检测的代码了。创建一个Python文件并命名(如FirstDetection.py),然后将下面的代码写入该文件。将RetinaNet模型文件和要检测的图像复制到包含Python文件的文件夹中。
from imageai.Detection import ObjectDetection import os execution_path = os.getcwd() detector=ObjectDetection() detector.setModelTypeAsRetinaNet() detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5")) detector.loadModel() detections = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image.jpg"), output_image_path=os.path.join(execution_path , "imagenew.jpg")) for eachObject in detections: print(eachObject["name"] , " : " , eachObject["percentage_probability"] )
下面有两个新图像的示例。
目标检测前:
目标检测后:
在Spyder编译器中运行结果如下所示:
输出的目标检测精度结果:
person : 57.20391869544983 person : 52.57977843284607 person : 70.81094980239868 person : 76.99859142303467 person : 79.40077781677246 bicycle : 81.0384213924408 person : 83.66722464561462 person : 89.41188454627991 truck : 60.61040759086609 person : 69.65749859809875 bus : 97.92424440383911 truck : 83.94358158111572 car : 72.50492572784424
在Spyder编译器中运行结果如下所示:
输出的目标检测精度结果:
person : 62.45866417884827 person : 58.67737531661987 person : 69.44932341575623 person : 71.84218168258667 person : 59.53381657600403 person : 54.65759038925171 motorcycle : 65.84504842758179 bus : 99.40318465232849 car : 72.41445779800415 person : 58.32530856132507 person : 54.449981451034546 person : 80.11815547943115 person : 74.30745959281921 person : 77.78302431106567 person : 71.15439772605896 bicycle : 69.92427110671997 person : 66.17957353591919 bicycle : 90.50283432006836 motorcycle : 94.09030675888062
代码解读
下面来解释一下这10行代码的工作原理:from imageai.Detection import ObjectDetectionimport osexecution_path = os.getcwd()
在以上3行代码中,在第一行导入了ImageAI的目标检测类;在第二行导入了Python的os类;在第三行中定义了一个变量,保存Python文件、RetinaNet模型文件以及图像所在文件夹的路径。
detector=ObjectDetection() detector.setModelTypeAsRetinaNet() detector.setModelPath( os.path.join(execution_path , "resnet50_coco_best_v2.0.1.h5")) detector.loadModel() detections = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image.jpg"), output_image_path=os.path.join(execution_path , "imagenew.jpg"))
for eachObject in detections: print(eachObject["name"] , " : " , eachObject["percentage_probability"] )
自定义目标检测
除此外,ImageAI也支持强大的自定义目标检测。其中之一是能够提取图像中检测到的每个物体。只需要将参数
extract_detected_objects=True
detectObjectsFromImage
detections, extracted_images = detector.detectObjectsFromImage(input_image=os.path.join(execution_path , "image.jpg"), output_image_path=os.path.join(execution_path , "imagenew.jpg"), extract_detected_objects=True)
将其应用到第一张图片上,得到如下结果:
所有行人都被很好地提取了出来,为了节约空间这里只显示了一部分。
ImageAI的其他功能
ImageAI提供了许多功能,可用于目标检测任务的自定义和部署。其支持的功能包括:
- 调整最小概率:默认情况下,概率小于50%的物体不会显示。对于需要高精度的情况,可以增加此值;对于需要检测所有可能对象的情况,可以减少此值。
- 自定义目标检测:通过提供的CustomObject类,可以使检测类检测一个或几个特定目标。
- 检测速度:通过将检测速度设置为“fast”、“faster”或“fastest”,可以减少检测图像所需的时间。
- 输入类型:可指定并解析图像的文件路径,以Numpy数组或图像文件流作为输入
- 输出类型:可指定detectObjectsFromImage函数以文件或Numpy数组的形式返回图像