在 Android 上运行图像识别

目标检测(Object Detection,检测识别图像中的物体,下称图像识别)神经网络之一 YOLO 已经发布了第三版(YOLOv3),他名称挺有意思:You Only Look Once,你只看一次。他的作者也挺有意思,Darknet 项目的 LICENSE.fuck 看上去有着一种随意、不讲究的个性。随着神经网络技术的兴起,机器视觉软件库之一 OpenCV 在其 3.3 版本中正式添加了 DNN 模块,以支持神经网络算法应用。他能够支持多种机器学习(包括深度学习)框架的预训练神经网络模型,对图像、视频应用神经网络算法。

在 Android 运行图像识别的方案之一是使用 OpenCV 导入 YOLO 预训练模型,对图像执行目标检测。相比与机器学习框架而言,OpenCV 对视觉、图像处理提供更加广泛的支持,DNN 模块能够支持多种机器学习框架的神经网络模型,此外也支持移动设备。使用机器学习框架设计、训练、优化神经网络,使用机器视觉软件库来应用神经网络算法,也是不错的方案。

YOLO 自带 Demo,图片来自 YOLO 官网

你可能见过上面的图片,这是在 PC 上运行 Darknet 框架加载 YOLO 预训练模型对一张图片进行检测的结果。YOLO 作者提供了 COCO 数据集和 VOC 数据集的预训练模型下载,还有一个支持 9000 种物体检测的模型不过有段时间没有维护。使用 COCO 数据集预训练模型能识别(COCO 数据集范围内的)80 种物体,而使用 VOC 数据集预训练模型能识别(VOC 数据集范围内的)20 种物体。

YOLOv3 的改进提升了速度和精度,输出数据也有点变化,已发布的 OpenCV 3.4.1 已不能兼容 YOLOv3,不过最新的代码已经修复兼容性问题。如果要使用 OpenCV 运行 YOLOv3 神经网络模型的话,需要下载最新的 OpenCV 代码并编译库文件,新的版本号已经是 4.0 开头。此外,如果想让 OpenCV 支持 Nvidia 图形硬件 CUDA 计算加速的话,需要安装 CUDA Toolkit,编译时间会长很多。

上面的几张图你应该没见过,这是在 Android 手机上运行 YOLO 的效果,使用 OpenCV 导入 YOLO 对摄像头画面做图像识别。在都没有 OpenCL 计算加速的情况下,Android(835 CPU)手机的速度比 Windows 10 笔记本(i7 低电压版)快些。最后的视频不是 YOLO 而是 MobileNet 的效果,MobileNet 数量少速度快拿来演示流畅些,效果都差不多,当然也可以做更深入的应用。

参考:

COCO DataSet http://cocodataset.org/
YOLOv3 Paper https://pjreddie.com/media/files/papers/YOLOv3.pdf
Darknet https://pjreddie.com/darknet/
OpenCV https://github.com/opencv/opencv


2018-05-13