只需 10 行 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"] )
复制代码
没错, 用这寥寥 10 行代码, 就能实现目前 AI 产品中应用广泛的目标检测技术.
看完了代码, 下面容我们聊聊目标检测背后的技术背景, 并解读这 10 行 Python 代码的由来和实现原理.
目标检测简介
人工智能的一个重要领域就是计算机视觉, 它是指计算机及软件系统识别和理解图像与视频的科学. 计算机视觉包含很多细分方向, 比如图像识别, 目标检测, 图像生成和图像超分辨率等. 其中目标检测由于用途广泛, 在计算机视觉领域的意义最为深远.
目标检测是指计算机和软件系统能够定位出图像 / 画面中的物体, 并识别出它们. 目标检测技术已经广泛应用于人脸检测, 车辆检测, 人流量统计, 网络图像, 安防系统和无人车等领域. 和其它计算机视觉技术一样, 目标检测未来会进一步成为人工智能的重要组成部分, 有着广阔的发展前景.
不过, 在软件应用和系统中使用现代目标检测方法以及根据这些方法创建应用, 并非简单直接. 早期的目标检测实现主要是应用一些经典算法, 比如 OpenCV 中支持的算法. 然而这些算法的表现并不稳定, 在不同情况下差异巨大.
2012 年深度学习技术的突破性进展, 催生了一大批高度精准的目标检测算法, 比如 R-CNN,Fast-RCNN,Faster-RCNN,RetinaNet 和既快又准的 SSD 及 YOLO. 使用这些基于深度学习的方法和算法, 需要理解大量的数学和深度学习框架. 现在全世界有数以百万计的开发者在借助目标检测技术创造新产品新项目, 但由于理解和使用较为复杂困难, 仍有很多人不得要领.
为了解决这个困扰开发者们的问题, 计算机视觉专家 Moses Olafenwa 带领团队推出了 Python 库 ImageAI, 能让开发人员只需寥寥数行代码就能很容易的将最先进的计算机视觉技术应用到自己的项目和产品中.
我们开头所示的 10 行代码实现, 就是要用到 ImageAI.
如何借助 ImageAI 轻松实现目标检测
使用 ImageAI 执行目标检测, 你只需以下 4 步:
1. 在电脑上安装 Python
2. 安装 ImageAI 及其环境依赖
3. 下载目标检测模块文件
4. 运行示例代码, 就是我们展示的那 10 行
下面我们一步步详细讲解.
1) 从 Python 官网下载和安装 Python 3
https://python.org/
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
复制代码
https://github.com/OlafenwaMoses/ImageAI/releases/download/2.0.1/imageai-2.0.1-py3-none-any.whl
3) 通过该链接 https://github.com/OlafenwaMoses/ImageAI/releases/download/1.0/resnet50_coco_best_v2.0.1.h5 下载 RetinaNet 模型文件用于目标检测.
到了这里我们已经安装好了所有依赖, 就可以准备写自己的首个目标检测代码了. 创建一个 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.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 行代码就能让我们轻松实现之前很麻烦的目标检测, 还是能谈得上 "给力" 二字.
来源: https://juejin.im/post/5b5445495188251acc230ac9