人工智能的重要领域之一是计算机视觉。计算机视觉是研究利用计算机和软件系统,识别和理解的图像和场景的科学。计算机视觉包括下面几个方向:图像识别,对象检测,图像生成,图像超分辨率等。由于有大量实际应用场景,对象检测可能是计算机视觉研究最深入的领域。在本教程中,我将简要介绍现代对象检测的概念,软件开发人员面临的挑战,我的团队提供的解决方案以及执行高性能对象检测的代码教程。
对象检测是指计算机和软件系统在图像/场景中定位对象并识别每个对象的能力。对象检测已广泛用于面部检测、车辆检测、行人计数、网络图像、安全系统和无人驾驶汽车。在许多实践领域中,也可以使用多种方法进行对象检测。像其他所有计算机技术一样,对象检测的广泛的创造性应用得力于计算机程序员和软件开发人员的努力。
在应用程序和系统中使用现代对象检测方法,以及基于这些方法构建新应用程序并不是一件容易的事。对象检测的早期实现涉及经典算法的使用,例如流行的计算机视觉库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命令安装以下依赖包:
-Tensorflow
pip install tensorflow==2.4.0
-其他
pip install keras==2.4.3 numpy==1.19.3 pillow==7.0.0 scipy==1.4.1 h5py==2.10.0 matplotlib==3.3.2 opencv-python keras-resnet==0.2.0
-安装ImageAI库
pip install imageai --upgrade
3)下载用于目标检测的RetinaNet模型文件
链接地址:
https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/resnet50_coco_best_v2.0.1.h5
开启10行代码的目标检测
到这里你已经安装好了所有的依赖项,可以开始编写你的第一个目标检测的代码了。
创建一个Python文件并命名(如FirstDetection.py),然后将下面的代码写入该文件。将RetinaNet模型文件和要检测的图像复制到包含Python文件的文件夹中。
FirstDetection.py:
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.1.0.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"] )
然后运行代码,等待结果输出。结果显示后,就可以在FirstDetection.py所在的文件夹下找到保存下来的新图像。下面有两个新图像的示例。
目标检测前:
目标检测后:
以上图片处理的控制台结果:
人物 : 55.8402955532074
人物: 53.21805477142334
人物 : 69.25139427185059
人物 : 76.41745209693909
自行车 : 80.30363917350769
人物: 83.58567953109741
人物: 89.06581997871399
卡车: 63.10953497886658
人物: 69.82483863830566
人物: 77.11606621742249
公交车: 98.00949096679688
卡车: 84.02870297431946
小汽车: 71.98476791381836
以上图片处理的控制台结果:
人物 : 71.10445499420166
人物: 59.28672552108765
人物 : 59.61582064628601
人物 :75.86382627487183
自行车 : 60.1050078868866
公交车:99.39600229263306
小汽车: 74.05484318733215
人物: 67.31776595115662
人物: 63.53200078010559
人物 : 78.2265305519104
人物 : 62.880998849868774
人物 : 72.93365597724915
人物 : 60.01397967338562
人物 : 81.05944991111755
自行车:50.591760873794556
自行车:58.719027042388916
人物: 71.69321775436401
自行车 : 91.86570048332214
自行车 : 85.38855314254761
知其然知其所以然:代码解读
下面来解释一下这10行代码的工作原理:
from imageai.Detection import ObjectDetection
import os
execution_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"))
在以上5行代码中,我们在第一行中定义了一个目标检测类的实例;在第二行中将实例的模型类型设定为RetinaNet;在第三行中将模型路径设置为RetinaNet模型的路径;在第四行中将模型加载到目标检测类的实例中;在第五行中调用检测函数,并将文件输入输出路径作为参数传入。
for eachObject in detections:
print(eachObject["name"] , " : " , eachObject["percentage_probability"] )
在以上两行代码中,第一行用来对detector.detectObjectsFromImage 函数返回的所有结果进行迭代,第二行用来输出图片中检测到的每个目标的名字及其概率。
自定义目标检测
除此外,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数组的形式返回图像
你可以在上文给出的官方GitHub链接中找到如何使用上述功能以及ImageAI中包含的其他计算机视觉功能的详细信息和文档。
参考链接:
https://github.com/OlafenwaMoses/ImageAI
原文链接:
https://towardsdatascience.com/object-detection-with-10-lines-of-code-d6cb4d86f606
更多AI最新消息,请关注《派派AI学院》
https://www.pypyai.com/