本文首发自集智专栏python
只需10行Python代码,咱们就能实现计算机视觉中目标检测。git
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"] )
复制代码
没错,用这寥寥10行代码,就能实现目前AI产品中应用普遍的目标检测技术。github
看完了代码,下面容咱们聊聊目标检测背后的技术背景,并解读这10行Python代码的由来和实现原理。算法
人工智能的一个重要领域就是计算机视觉,它是指计算机及软件系统识别和理解图像与视频的科学。计算机视觉包含不少细分方向,好比图像识别、目标检测、图像生成和图像超分辨率等。其中目标检测因为用途普遍,在计算机视觉领域的意义最为深远。编程
目标检测是指计算机和软件系统可以定位出图像/画面中的物体,并识别出它们。目标检测技术已经普遍应用于人脸检测、车辆检测、人流量统计、网络图像、安防系统和无人车等领域。和其它计算机视觉技术同样,目标检测将来会进一步成为人工智能的重要组成部分,有着广阔的发展前景。数组
不过,在软件应用和系统中使用现代目标检测方法以及根据这些方法建立应用,并不是简单直接。早期的目标检测实现主要是应用一些经典算法,好比OpenCV中支持的算法。然而这些算法的表现并不稳定,在不一样状况下差别巨大。bash
2012年深度学习技术的突破性进展,催生了一大批高度精准的目标检测算法,好比R-CNN,Fast-RCNN,Faster-RCNN,RetinaNet和既快又准的SSD及YOLO。使用这些基于深度学习的方法和算法,须要理解大量的数学和深度学习框架。如今全世界有数以百万计的开发者在借助目标检测技术创造新产品新项目,但因为理解和使用较为复杂困难,仍有不少人不得要领。网络
为了解决这个困扰开发者们的问题,计算机视觉专家Moses Olafenwa带领团队推出了Python库ImageAI,能让开发人员只需寥寥数行代码就能很容易的将最早进的计算机视觉技术应用到本身的项目和产品中。框架
咱们开头所示的10行代码实现,就是要用到ImageAI。函数
使用ImageAI执行目标检测,你只需如下4步:
1.在电脑上安装Python
2.安装ImageAI及其环境依赖
3.下载目标检测模块文件
4.运行示例代码,就是咱们展现的那10行
下面咱们一步步详细讲解。
1)从Python官网下载和安装Python 3
2)经过pip安装以下环境依赖
1.Tensorflow
pip install tensorflow
复制代码
2.Numpy
pip install numpy
复制代码
3.SciPy
pip install scipy
复制代码
4.OpenCV
pip install opencv-python
复制代码
5.Pillow
pip install pillow
复制代码
6.Matplotlib
pip install matplotlib
复制代码
7.H5py
pip install h5py
复制代码
8.Keras
pip install keras
复制代码
9.ImageAI
pip install
复制代码
3)经过该连接下载RetinaNet 模型文件用于目标检测。
到了这里咱们已经安装好了全部依赖,就能够准备写本身的首个目标检测代码了。 建立一个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"] )
复制代码
而后运行代码,等待控制台打印结果。等控制台打印出结果后,就能够打开FirstDetection.py所在的文件夹,你就会发现有新的图像保存在了里面。好比下面两张示例图像,以及执行目标检测后保存的两张新图像。
目标检测以前:
咱们能够看到图像上显示了检测出的物体名称及几率。
解读10行代码
下面咱们解释一下这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.detectObjectFromImage函数返回的全部结果,而后打印出第二行中模型对图像上每一个物体的检测结果(名称和几率)。
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提供了不少功能,可以用于各种目标检测任务的自定义和生产部署。包括:
-调整最小几率:默认几率小于50%的物体不会显示,若有须要,你能够自行调整这个数字。
-自定义目标检测:使用提供的CustomObject类,你能够检测一个或多个特定物体。
-调整检测速度:能够经过将检测速度设为“快”“更快”“最快”三个不一样等级,调整检测速度。
-输入输出类型:你能够自定义图像的路径,Numpy数组或图像的文件流为输入输出。
诚然,单看这10行代码每一行,谈不上惊艳,也借助了很多库,可是仅用10行代码就能让咱们轻松实现以前很麻烦的目标检测,仍是能谈得上“给力”二字。
更多功能和详情,请查看GitHub
0806期《人工智能-从零开始到精通》
限时折扣中!
谈笑风生 在线编程 了解一下? (前25位同窗还可领取¥200优惠券哦)