刘辉 2019-1-31 ---- 2019-2-13
目的:如何建立一个简单、便宜的移动目标探测器。
这项研究的目的是确定在一个便宜的移动设备上的对象检测模型是否可以用于现实世界的任务。
作为一个移动平台,我们使用的是树莓派3B。树莓派是一款售价35美元的单板机,这意味着微处理器、内存、无线收音机和端口都在一块电路板上。它是一台Linux计算机,所以从技术上讲,它可以做Linux计算机能做的一切事情,比如运行电子邮件和网络服务器,充当网络存储,或者用于对象检测。与大多数具有内置硬盘或SSD存储选项的计算机不同,树莓派的操作系统安装在microSD卡上,而microSD卡是存放所有文件的地方,因为这块板不包含任何内置存储(不过,你可以添加USB硬盘驱动器)。通过交换microSD卡,这种结构可以方便地扩展存储空间并在不同操作系统之间切换。
作为目标探测器的硬件部分,我们使用了树莓派3B和树莓派助学金V2。我们需要安装Raspbian Stretch 9,因为在运行Raspbian 9时,TensorFlow 1.9正式支持树莓派。我们还需要一个至少16GB内存的microSD卡,因为构建OpenCV可能是一个非常消耗内存的过程。
目标检测模型
针对本课题,我们选择了以下型号:小型YOLO和SSD MobileNet lite。
YOLO(You Only Look Once)是在Darknet上实现的最先进的实时物体检测系统。先前的检测系统是重新利用分类器或定位器来执行检测的,而这些检测系统将模型应用于多位置和规模的图像。图像的高评分区域被视为检测结果。与基于分类器的系统相比,该模型具备几大优点。这个模型在测试时查看整个图像,因此它的预测是通过图像中的全局背景来实现的。除此之外,不像需要数千个单个图像才可进行预测的R-CNN系统一样,它也可以使用单一网络的评估进行预测。
为了执行检测,图像就划分为SxS网格(如左图所示)。每个单元将预测N个可能的“边界框”以及它们中的每一个的确定性(或概率)水平(图像在中心),这意味着需要计算SxSxN个正方形。绝大多数这些方形的预测率都非常低,这就是算法持续删除预测率低于特定最小阈值方块的原因。剩余的盒子通过“非极大值抑制”来消除可能的重复检测,因此只留下最精确的方块(如右图所示)。
SSD(Single Shot MultiBox Detector)是一种流行的物体检测算法。SSD通过消除对区域生成网络的需求来加速该过程。为了防止精度下降,SSD采用了包括多尺度功能和默认框在内的一些改进方法。这些改进使SSD能够以较低分辨率的图像匹配更快的R-CNN精度,从而进一步提高检测速度。带有MobileNet的SSD是一种针对移动设备推理进行了优化的对象检测模型。
这里的关键思想是采用单个网络(速度)而不需要区域提议。相反,它使用不同的边界框,然后作为预测的一部分调整边界框。网络的最后几层中的每一层都负责预测逐渐变小的边界框,并且最终预测是所有这些预测的并集,从而实现不同的边界框预测。
对于对象检测,我们使用OpencCV,Tensorflow Object Detection API和Darkflow。 TensorFlow的Object Detection API是一个非常强大的工具,任何人(特别是那些没有真正的机器学习背景的人)都可以快速构建和部署功能强大的图像识别软件。API为终端用户提供培训和在OCO数据集中运行检测模型和模型的仪器,如Faster R-CNN,SSD Mobile等。由于YOLO是在基于C ++的深度学习框架上实现的,所以我们使用Darknet的TensorFlow就翻译为为Darkflow。
环境设置
接下来,我们将设置环境。首先,在具有所有依赖项的Raspberry Pi 3上安装OpenCV。你可以在下面这个网站中找到一个不错的安装途径:
https://www.pyimagesearch.com/2017/09/04/raspbian-stretch-install-opencv-3-python-on-your-raspberry-pi/。
下一步是设置并启用相机。我们还需要安装一个名为picamera [array]的python模块。该模块提供了一个界面,用于将来自摄像机的图像表示为NumPy阵列。下面的网站是另一个不错的安装指南:
https://www.pyimagesearch.com/2015/03/30/accessing-the-raspberry-pi-camera-with-opencv-and-python/。
如上所述,TF 1.9+全面支持Raspberry Pi,但这并不意味着我们可以仅使用pip来进行安装。Pip仅能在0.11.0版本下安装,不满足目标检测API的要求。我们应该从源代码构建Tensorflow,但由于处理器速度慢且RAM有限,因此不建议在Raspberry Pi上构建。这需要很多时间。在更强大的主机上构建TensorFlow .whl包更容易,然后将其安装在Raspberry上。我们可以使用官方安装指南来构建软件包或下载已经构建的软件包。之后,将wheel文件复制到Raspberry Pi并使用pip安装它。
接下来,我们需要为YOLO配置环境。 YOLO在基于C的深度学习框架中实现,称为Darknet。为了避免在Raspberry Pi上构建Darknet,我们使用Darkflow作为Darknet转换来运行TensorFlow(这里is听译有误)。 Darkflow易于安装,因为其具有官方存储库的安装教程。此外,我们使用了来自Darkflow
(https://drive.google.com/drive/folders/0B1tW_VtY7onidEwyQ2FtQVplWEU)作者的YOLO预训练权重tiny-yolo-voc.weights 和来自Darkflow源存储库的网络配置tiny-yolo-voc.cfg。
现在,我们需要从TensorFlow检测模型表下载MobileNet SSDLite模型。所谓“模型表”,是Google的预训练对象检测模型集合,具有不同级别的处理速度和准确性。 Raspberry Pi具有弱处理器(weak听译有误)和有限的RAM,因此我们需要使用处理能力较低的模型。尽管该模型运行得更快,但它的精确度较低。我们尝试使用SSD MobileNet模型但是在加载模型图时它会导致内存分配异常,而Raspberry Pi并没有为此任务提供所需的内存量。然后,下载SSDLite-MobileNet模型并将其解压缩。我们需要唯一的frozen_inference_graph.pb文件。
model ZOO
部分代码如下
首先,为探测器定义一个抽象类别:
接下来,实现SSD和YOLO模型界面。对于SSD,我们使用来自目标检测API的代码。而YOLO对象检测器只是Darkflow TFNet类的包装。
现在我们实现一个检测脚本。首先初始化camera:
接下来,从stream中获取图像并对其进行检测。对结果可视化如下:
总结
我们运行了两个模型并得到了这些结果:
- YOLO tiny -0.32 FPS;
- SSD MobileNet Light -1.07 FPS。
因此,结合以上结果,我们可以得出结论——我们可以使用带有SSD MobileNet的移动探测器进行真实的简单行人跟踪,或者用于检测草坪上的猫的房屋安全系统。或者尺寸和功率使用更为关键的情况(1 FPS就足够了)。