算法集锦(10)| 自动驾驶、机器人 | 物品图像动态检测算法实现

时间:2022-07-22
本文章向大家介绍算法集锦(10)| 自动驾驶、机器人 | 物品图像动态检测算法实现,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

今天,我们将介绍Google的Tensorflow物品检测API及Mask R-CNN技术,并将之应用于实际的物品动态检测中。

Tensorflow物品检测API

Tensorflow 物品检测API是在COCO数据集(Conmmon Objects in Context)上进行训练的。COCO数据集包含了30000张图片,涵盖了生活中大多数可以见到的物品。

图 COCO数据库部分物品

该API包括了5个不同的模型,每个模型在训练速度和边界框定位精度上各有不同。

这里的mAP(平均精度)是物品检测精度和边界框检测率的乘积,可以很好的度量模型对物品的敏感程度以及它的误报率。mPA得分越高,则模型越精确,但计算速度则会较慢。

API使用步骤

首先,我们介绍在图片上应用API的方法。以比较简单的sdd_mobilenet模型为例,使用该API的主要步骤如下:

(1)下载模型(.pb-protobuf)并加载到内存;

(2)根据helper code中的提示,加载labels,categories,visualization tools等;

(3)打开新的会话(Session),并在指定数据上运行模型

结果如下,可以看到API的识别效果非常好。

视频的应用方法

接下来,我们尝试在视频上运行该API。首先你需要安装Python的moviepy库,主要步骤如下。

(1)应用VideoFileClip函数从视频中提取图像,并检测

(2)应用fl_image函数将提取的图像更换成检测后并标识的图像

(3)将更换后的图像组装成新的视频

使用Google物品检测API,你可以用很少的几行代码来创建自己的物品检测引擎。下图为在视频上应用的结果。

Mask R-CNN技术

实例分割(Instance Segmentation)

Instance segmentation 最近逐渐成为一个新的热点问题。它要解决的问题是检测(Object Detection)和语义分割(Semantic Segmentation)综合的一个问题。比起检测,需要得到物体更精确的边界信息;比起语义分割,需要区分不同的物体个体。

在自动驾驶技术和机器人系统中,实现实例分割有很重要的意义。对于自动驾驶汽车,我们可以获得汽车以及行人的准确位置;而机器人在获得两个障碍物的准确位置后,则可以轻松实现障碍穿越。

实例分割算法有很多种,在最新的Tensorflow物品检测API中,Google使用了Mask R-CNN技术,从而可以实现对图像的像素级检测。

Mask R-CNN

Mask R-CNN是在Faster R-CNN基础上改进获得的,Mask R-CNN的基本思想很简单:Faster R-CNN在物体检测上效果很好,那么能否将其扩展并应用到像素级分割?

在Mask R-CNN中,Faster R-CNN的CNN特征顶部添加了一个完全卷积网络(Fully Convolutional Network),用来生成掩码(分割输出)。Mask R-CNN通过向Faster R-CNN网络添加一个分支来输出一个二进制掩码,来说明给定像素是否为对象的一部分。

上图中的白色分支仅仅是CNN特征图谱上的完全卷积网络。该模型的输入和输出分别为:

输入:CNN特征图。

输出:在像素属于对象的所有位置上都具有1s的矩阵,其他位置为0s,这种规则被称为二进制掩码。

Mask R-CNN作者发现,在最初的Faster R-CNN网络结构中, RoIPool所选择的特征图谱区域与原始图像的区域略微不对齐。由于图像分割需要像素级特异性,与边框确定过程不同,这自然就导致了不准确。Mask R-CNN模型则图像舍弃RoIPool技术,通过RoIAlign技术传递,使得由RoIPool选择的特征图谱区域更精准地对应原始图像的区域。

关于Mask R-CNN的详细进化史可参看:http://www.sohu.com/a/137444920_610300

在图片检测上的应用

为了测试该模型在图片上的应用效果,我们尝试了mask_rcnn_iception_v2_coco模型。你可以直接下载该模型并应用,注意使用前要升级到tensorflow1.5版本!测试结果如下:

可以看到,图片中的风筝和游人轮廓都得到了精准的检测,并用Mask进行覆盖显示。

视频物品检测

上面介绍了tensorflow物品检测API和Mask R-CNN技术,接下来我们就利用它们来实现一个玩具小车的动态检测。

步骤1:搜集数据并创建masks

通常的物品检测方法需要用一个边界框来标识物品的位置。而Mask R-CNN技术则要求输入一个mask图像(通常为PNG文件)。

图 Object Mask-玩具

利用该二值mask图像,模型不仅可以提取边界框的位置还能够实现物品像素级的定位。

Mask图像可以利用Pixel Annotation Tool来创建。你可以在工具包中打开玩具图片,然后用工具刷去“填充”玩具,从而获得整个玩具的轮廓。当然,玩具外的区域也要进行“填充”,从而突出感兴趣的区域。

步骤2:创建tensorflow记录(TF Records)

tensorflow物品检测模型需要输入TFRecord文件,该文件将图像、边界框、mask等因素整个压缩到一起,所以训练模型时仅需调用一个文件就可以了。参考TFRecord for Pets dataset,我们创建了自己的文件生成代码,可以很方便的生成想要的TFRecord文件。

此外,还需要创建一个label.pbtxt文件来讲标签(label)转换成数字ID。

item {
 id: 1
 name: ‘toy’
}

步骤3:设置超参数

现在,需要选择你所采用的模型。Tensorflow物品检测API提供了4种Mask模型,这里我们选择了Mask_RCNN_Inception_V2来进行检测。该模型虽然准确度不是最高,但好在运行速度是最快的。

通常模型参数都是存储在一个config文件中,我们设置超参数的方法是在COCO模型的config文件基础上修改了分类数量和文件路径,其他参数保持不变。

步骤4:训练模型

接下来就是训练模型了。我们在CPU上训练了几个小时,当损失函数趋近平缓时停止了训练。

你可以激活Tensorborad面板跟踪训练情况以及训练过程中样本图像的变化情况。下图显示了边界框和Mask在训练过程中的预测情况,可以看到随着训练的进行,标识结果越来越准确。

步骤5:最终结果

训练后的结果如下图所示,小车运行过程中的位置及轮廓被准确的识别了处理。你可以参照本文的方法和步骤,建立自己的训练模型,应用到自动驾驶或者机器人上。