文档章节

大话目标检测经典模型:Mark R-CNN

雪饼
 雪饼
发布于 2018/04/28 13:59
字数 1556
阅读 3369
收藏 9

在之前的文章中介绍了目标检测经典模型(R-CNN、Fast R-CNN、Faster R-CNN),目标检测一般是为了实现以下效果:
 
在R-CNN、Fast R-CNN、Faster R-CNN中,实现了对目标的识别和定位,如下图所示:
 
为了更加精确地识别目标,实现在像素级场景中识别不同目标,利用“图像分割”技术定位每个目标的精确像素,如下图所示(精确分割出人、汽车、红绿灯等):
 
Mask R-CNN便是这种“图像分割”的重要模型。

Mask R-CNN的思路很简洁,既然Faster R-CNN目标检测的效果非常好,每个候选区域能输出种类标签和定位信息,那么就在Faster R-CNN的基础上再添加一个分支从而增加一个输出,即物体掩膜(object mask),也即由原来的两个任务(分类+回归)变为了三个任务(分类+回归+分割)。如下图所示,Mask R-CNN由两条分支组成:
 
Mask R-CNN的这两个分支是并行的,因此训练简单,仅比Faster R-CNN多了一点计算开销。
分类和定位在Faster R-CNN中有介绍过了(详见文章:大话目标检测经典模型RCNN、Fast RCNN、Faster RCNN),在此就不再重复介绍,下面重点介绍一下第二条分支,即如何实现像素级的图像分割。

如下图所示,Mask R-CNN在Faster R-CNN中添加了一个全卷积网络的分支(图中白色部分),用于输出二进制mask,以说明给定像素是否是目标的一部分。所谓二进制mask,就是当像素属于目标的所有位置上时标识为1,其它位置标识为 0
 
从上图可以看出,二进制mask是基于特征图输出的,而原始图像经过一系列的卷积、池化之后,尺寸大小已发生了多次变化,如果直接使用特征图输出的二进制mask来分割图像,那肯定是不准的。这时就需要进行了修正,也即使用RoIAlign替换RoIPooling
 
如上图所示,原始图像尺寸大小是128x128,经过卷积网络之后的特征图变为尺寸大小变为 25x25。这时,如果想要圈出与原始图像中左上方15x15像素对应的区域,那么如何在特征图中选择相对应的像素呢?
从上面两张图可以看出,原始图像中的每个像素对应于特征图的25/128像素,因此,要从原始图像中选择15x15像素,则只需在特征图中选择2.93x2.93像素(15x25/128=2.93),在RoIAlign中会使用双线性插值法准确得到2.93像素的内容,这样就能很大程度上,避免了错位问题。
修改后的网络结构如下图所示(黑色部分为原来的Faster R-CNN,红色部分为Mask R-CNN修改的部分)
 
从上图可以看出损失函数变为
 
损失函数为分类误差+检测误差+分割误差,分类误差和检测(回归)误差是Faster R-CNN中的,分割误差为Mask R-CNN中新加的。
对于每个MxM大小的ROI区域,mask分支有KxMxM维的输出(K是指类别数量)。对于每一个像素,都是用sigmod函数求二值交叉熵,也即对每个像素都进行逻辑回归,得到平均的二值交叉熵误差Lmask。通过引入预测K个输出的机制,允许每个类都生成独立的mask,以避免类间竞争,这样就能解耦mask和种类预测。
对于每一个ROI区域,如果检测得到属于哪一个分类,就只使用该类的交叉熵误差进行计算,也即对于一个ROI区域中KxMxM的输出,真正有用的只是某个类别的MxM的输出。如下图所示:
 
例如目前有3个分类:猫、狗、人,检测得到当前ROI属于“人”这一类,那么所使用的Lmask为“人”这一分支的mask。

Mask R-CNN将这些二进制mask与来自Faster R-CNN的分类和边界框组合,便产生了惊人的图像精确分割,如下图所示:

Mask R-CNN是一个小巧、灵活的通用对象实例分割框架,它不仅可以对图像中的目标进行检测,还可以对每一个目标输出一个高质量的分割结果。另外,Mask R-CNN还易于泛化到其他任务,比如人物关键点检测,如下图所示:

从R-CNN、Fast R-CNN、Faster R-CNN到Mask R-CNN,每次进步不一定是跨越式的发展,这些进步实际上是直观的且渐进的改进之路,但是它们的总和却带来了非常显著的效果。
最后,总结一下目标检测算法模型的发展历程,如下图所示:

墙裂建议

2017年,Kaiming He 等人发表了关于Mask R-CNN的经典论文《Mask R-CNN》,在论文中详细介绍了Mask R-CNN的思想、原理和测试效果,建议阅读该论文以进一步了解该模型。

关注本人公众号“大数据与人工智能Lab”(BigdataAILab),然后回复“论文”关键字可在线阅读经典论文的内容

推荐相关阅读

© 著作权归作者所有

雪饼

雪饼

粉丝 407
博文 61
码字总数 134328
作品 0
广州
私信 提问
【AI实战】手把手教你训练自己的目标检测模型(SSD篇)

目标检测是AI的一项重要应用,通过目标检测模型能在图像中把人、动物、汽车、飞机等目标物体检测出来,甚至还能将物体的轮廓描绘出来,就像下面这张图,是不是很酷炫呢,嘿嘿 在动手训练自己...

雪饼
2018/08/14
10.8K
25
【AI实战】快速掌握TensorFlow(二):计算图、会话

在前面的文章中,我们已经完成了AI基础环境的搭建(见文章:Ubuntu + Anaconda + TensorFlow + GPU + PyCharm搭建AI基础环境),以及初步了解了TensorFlow的特点和基本操作(见文章:快速掌握...

雪饼
2018/08/20
1K
1
【AI实战】快速掌握TensorFlow(三):激励函数

到现在我们已经了解了TensorFlow的特点和基本操作(见文章:快速掌握TensorFlow(一)),以及TensorFlow计算图、会话的操作(见文章:快速掌握TensorFlow(二)),接下来我们将继续学习掌握...

雪饼
2018/08/30
1K
0
【图解AI:动图】各种类型的卷积,你认全了吗?

卷积(convolution)是深度学习中非常有用的计算操作,主要用于提取图像的特征。在近几年来深度学习快速发展的过程中,卷积从标准卷积演变出了反卷积、可分离卷积、分组卷积等各种类型,以适...

雪饼
06/20
339
0
【AI实战】快速掌握TensorFlow(四):损失函数

在前面的文章中,我们已经学习了TensorFlow激励函数的操作使用方法(见文章:快速掌握TensorFlow(三)),今天我们将继续学习TensorFlow。 本文主要是学习掌握TensorFlow的损失函数。 一、什...

雪饼
2018/09/02
2.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

Executor线程池原理与源码解读

线程池为线程生命周期的开销和资源不足问题提供了解决方 案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 线程实现方式 Thread、Runnable、Callable //实现Runnable接口的...

小强的进阶之路
25分钟前
4
0
maven 环境隔离

解决问题 即 在 resource 文件夹下面 ,新增对应的资源配置文件夹,对应 开发,测试,生产的不同的配置内容 <resources> <resource> <directory>src/main/resources.${deplo......

之渊
今天
8
0
详解箭头函数和普通函数的区别以及箭头函数的注意事项、不适用场景

箭头函数是ES6的API,相信很多人都知道,因为其语法上相对于普通函数更简洁,深受大家的喜爱。就是这种我们日常开发中一直在使用的API,大部分同学却对它的了解程度还是不够深... 普通函数和...

OBKoro1
今天
5
0
轻量级 HTTP(s) 代理 TinyProxy

CentOS 下安装 TinyProxy yum install -y tinyproxy 启动、停止、重启 # 启动service tinyproxy start# 停止service tinyproxy stop# 重启service tinyproxy restart 相关配置 默认...

Anoyi
今天
2
0
Linux创建yum仓库

第一步、搞定自己的光盘 #创建文件夹 mkdir -p /media/cdrom #挂载光盘 mount /dev/cdrom /media/cdrom #编辑配置文件使其永久生效 vim /etc/fstab 第二步,编辑yun源 vim /ect yum.repos.d...

究极小怪兽zzz
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部