目标检测特殊层:ROI Align层详解
ROI Align 是在Mask-RCNN这篇论文里提出的一种区域特征聚集方式, 很好地解决了ROI Pooling操作中两次量化造成的区域不匹配(mis-alignment)的问题。实验显示,在检测测任务中将 ROI Pooling 替换为 ROI Align 可以提升检测模型的准确性。
如果roi大小为(7,6),而roipooling是分成了(6,6)的部分,(7,6)到(6,6)的转换必然带来了边缘某像素的损失。而roialign利用双线性插值,将roi(7,6)插值扩充到(12,12),此时再做(6,6)的roipooling,会提高精度,充分利用了roi的像素。
1. ROI Pooling 的局限性分析
在常见的两级检测框架(比如Fast-RCNN,Faster-RCNN,RFCN)中,ROI Pooling 的作用是根据预选框的位置坐标在特征图中将相应区域池化为固定尺寸的特征图,以便进行后续的分类和包围框回归操作。由于预选框的位置通常是由模型回归得到的,一般来讲是浮点数,而池化后的特征图要求尺寸固定。故ROI Pooling这一操作存在两次量化的过程。
- 将候选框边界量化为整数点坐标值。
- 将量化后的边界区域平均分割成 k x k 个单元(bin),对每一个单元的边界进行量化。
事实上,经过上述两次量化,此时的候选框已经和最开始回归出来的位置有一定的偏差,这个偏差会影响检测或者分割的准确度。在论文里,作者把它总结为“不匹配问题(misalignment)。
下面我们用直观的例子具体分析一下上述区域不匹配问题。如 图1 所示,这是一个Faster-RCNN检测框架。输入一张800*800的图片,图片上有一个665*665的包围框(框着一只狗)。图片经过主干网络提取特征后,特征图缩放步长(stride)为32。因此,图像和包围框的边长都是输入时的1/32。800正好可以被32整除变为25。但665除以32以后得到20.78,带有小数,于是ROI Pooling 直接将它量化成20。接下来需要把框内的特征池化7*7的大小,因此将上述包围框平均分割成7*7个矩形区域。显然,每个矩形区域的边长为2.86,又含有小数。于是ROI Pooling 再次把它量化到2。经过这两次量化,候选区域已经出现了较明显的偏差(如图中绿色部分所示)。更重要的是,该层特征图上0.1个像素的偏差,缩放到原图就是3.2个像素。那么0.8的偏差,在原图上就是接近30个像素点的差别,这一差别不容小觑。
图 1
2. ROI Align 的主要思想和具体方法
为了解决ROI Pooling的上述缺点,作者提出了ROI Align这一改进的方法(如图2)。ROI Align的思路很简单:取消量化操作,使用双线性内插的方法获得坐标为浮点数的像素点上的图像数值,从而将整个特征聚集过程转化为一个连续的操作,。值得注意的是,在具体的算法操作上,ROI Align并不是简单地补充出候选区域边界上的坐标点,然后将这些坐标点进行池化,而是重新设计了一套比较优雅的流程,如 图3 所示:
- 遍历每一个候选区域,保持浮点数边界不做量化。
- 将候选区域分割成k x k个单元,每个单元的边界也不做量化。
- 在每个单元中计算固定四个坐标位置,用双线性内插的方法计算出这四个位置的值,然后进行最大池化操作。
这里对上述步骤的第三点作一些说明:这个固定位置是指在每一个矩形单元(bin)中按照固定规则确定的位置。比如,如果采样点数是1,那么就是这个单元的中心点。如果采样点数是4,那么就是把这个单元平均分割成四个小方块以后它们分别的中心点。显然这些采样点的坐标通常是浮点数,所以需要使用插值的方法得到它的像素值。在相关实验中,作者发现将采样点设为4会获得最佳性能,甚至直接设为1在性能上也相差无几。事实上,ROI Align 在遍历取样点的数量上没有ROIPooling那么多,但却可以获得更好的性能,这主要归功于解决了misalignment的问题。值得一提的是,在做实验的时候发现,ROI Align在VOC2007数据集上的提升效果并不如在COCO上明显。经过分析为造成这种区别的原因是COCO上小目标的数量更多,而小目标对misalignment问题的影响更为明显(比如,同样是0.5个像素点的偏差,对于较大的目标而言显得微不足道,但是对于小目标,误差的影响就要高很多)
图 2
图 3
目标检测特殊层:ROI Align层详解相关推荐
- 深度学习之目标检测(五)-- RetinaNet网络结构详解
深度学习之目标检测(五)-- RetinaNet网络结构详解 深度学习之目标检测(五)RetinaNet网络结构详解 1. RetinaNet 1.1 backbone 部分 1.2 预测器部分 1. ...
- 睿智的目标检测8——yolo3的loss组成详解
睿智的目标检测8--yolo3的loss组成详解 学习前言 参考源码 计算loss所需参数 1.y_pre 2.y_true loss的计算过程 学习前言 只会预测是不够的,对于只有会了训练才能训练出 ...
- 【目标检测】单阶段算法--YOLOv4详解
论文题目 :<YOLOv4: Optimal Speed and Accuracy of Object Detection> 论文地址:https://arxiv.org/pdf/2004 ...
- YOLOv5在无人机/遥感场景下做旋转目标检测时进行的适应性改建详解(踩坑记录)...
作者丨略略略@知乎(已授权) 来源丨https://zhuanlan.zhihu.com/p/358441134 编辑丨极市平台 文章开头直接放上我自己的项目代码: https://github.co ...
- 目标检测之Faster-RCNN的pytorch代码详解(模型准备篇)
十月一的假期转眼就结束了,这个假期带女朋友到处玩了玩,虽然经济仿佛要陷入危机,不过没关系,要是吃不上饭就看书,吃精神粮食也不错,哈哈!开个玩笑,是要收收心好好干活了,继续写Faster-RCNN的代码 ...
- 【目标检测】单阶段算法--YOLOv2详解
论文题目:<YOLO9000: Better, Faster, Stronger> 论文地址:https://arxiv.org/pdf/1612.08242.pdf 一文读懂YOLOv1 ...
- 【目标检测】单阶段算法--YOLOv1详解
论文题目:<You Only Look Once:Unified, Real-Time Object Detection> 论文地址:https://arxiv.org/pdf/1506. ...
- 目标检测模型的评估指标mAP详解(附代码)
https://zhuanlan.zhihu.com/p/37910324 对于使用机器学习解决的大多数常见问题,通常有多种可用的模型.每个模型都有自己的独特之处,并随因素变化而表现不同. 每个模型在 ...
- 无人机巡检场景小目标检测与量化加速部署方案详解
在社会活动和社会生产中,巡检是一个必不可少的环节.然而,传统的人工巡检方式存在效率低下.成本高昂.安全风险大等问题,限制了巡检的效果和范围.无人机巡检因其高效.灵活.安全的特点被越来越多的企业采用 ...
- 目标检测算法之Fast R-CNN算法详解
在介绍Fast R-CNN之前我们先介绍一下SPP Net 一.SPP Net SPP:Spatial Pyramid Pooling(空间金字塔池化) 众所周知,CNN一般都含有卷积部分和全连接部分 ...
最新文章
- 【微服务架构】SpringCloud之Feign
- 激光雷达,马斯克看不上,却又无可替代?
- 解决svn的working copy locked并且cleanup恢复不能的情况
- 多线程:线程之间的协作(join、wait、notify、notifyAll、await、signal、signalAll)
- linux centos7 mysql_Linux centos7环境下安装MySQL的步骤详解
- 关于写博客的原因以及一点个人说明。
- poi中文api文档
- oracle一页显示15行,oracle rownum分页与显示记录小测
- 光华科技光刻胶_光刻胶概念走强,6天5板!21只光刻胶概念出炉!(名单)
- npm + webpack +react
- C#中对 API函数的调用
- git中使用emacs和vimdiff/Ediff工具
- Java基础知识汇总(持续更新)
- keepalived+LVS 详解(3) -- VRRP协议简介
- oracle+tm+下载,腾讯TM2014官方下载|腾讯TM2013官方最新版 2013.7277 - 系统天堂
- 中国知网论文破解下载 (附:常用的网址)
- nginx容器通过docker内置DNS实现动态负载
- 3dmax制作玻璃杯液体材质
- linux 写操作系统 pdf,Linux操作系统概述.pdf
- 《中国文房四宝之宣纸》:是你未曾见过的东方之美
热门文章
- boost::mpl::greater_equal相关的测试程序
- boost::geometry模块实现显示不同类型的点的测试程序
- boost::fusion::as_map用法的测试程序
- boost::function_types::is_function_pointer用法的测试程序
- Boost.Flyweight 键值测试的类
- boost::coroutine2模块实现layout的测试程序
- GDCM:解析XPATH文件的测试程序
- boost::core::has_single_bit的测试
- QDoc包括外部代码includingexternalcode
- C语言实现通用堆栈(附完整源码)