算法集锦(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:最终结果
训练后的结果如下图所示,小车运行过程中的位置及轮廓被准确的识别了处理。你可以参照本文的方法和步骤,建立自己的训练模型,应用到自动驾驶或者机器人上。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Yii2框架加载css和js文件的方法分析
- php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
- python如何求圆的面积
- php实现微信公众号企业转账功能
- PHP通过调用新浪API生成t.cn格式短网址链接的方法详解
- Python之Matplotlib文字与注释的使用方法
- Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
- python中return如何写
- PHP钩子实现方法解析
- 浅谈numpy中函数resize与reshape,ravel与flatten的区别
- PHP文件类型检查及fileinfo模块安装使用详解
- PHP封装的分页类与简单用法示例
- ThinkPHP3.2框架自带分页功能实现方法示例
- PHP获取访问设备信息的方法示例
- PHP实现微信提现功能