目标检测中的Anchor-free回顾
点击上方“3D视觉工坊”,选择“星标”
干货第一时间送达
Anchor-free 的检测算法可分为anchor-point的算法和key-point的算法。Anchor-point 检测器通过预测目标中心点,边框距中心点的距离或目标宽高来检测目标,本质上和anchor-based算法相似,此类算法有FCOS,CenterNet等;而key-point方法是通过检测目标的边界点(如:角点),再将边界点组合成目标的检测框,典型的此类算法包括CornerNet, RepPoints等。
1 FCOS
论文链接:https://arxiv.org/abs/1904.01355
代码链接:https://github.com/tianzhi0549/FCOS/
FCOS是ICCV2019的一篇文章,其主干网络和RetinaNet的差不多,只是在分类分支上多了一个centerness 分支,用于确定当前点是否是检测目标的中心。因为是anchor-free的方法,最后分类分支和回归分支输出feature map 的 channel 也分别是 C(类别数) 和 4(l,t,r,b),不需要乘以anchor数(K),因此相比anchor based的输出,FCOS的输出可用减少K倍。
1.1 边界框的表示形式
一般目标检测的边界框使用(x,y,x,y) 和 (x,y,w,h) 之类的坐标表示,但FCOS是不同的,FCOS是从一个点开始,然后使用该点与ground truth之间的垂直和水平距离(l,t,r,b)来表示边界框的。通过用点标记,FCOS可以获取更多正样本样本以改善正负样本不平衡状况。具体如下图所示:
1.2 正负样本分配
Step1:分配目标给哪一层预测。引入了min_size和max_size,具体设置是0, 64, 128, 256, 512和无穷大。例如,对于输出的第一个预测层而言,其stride=8,负责最小尺度的物体,对于该层上面的任何一个点,如果有gt bbox映射到特征图上,满足0 < max(中心点到4条边的距离) < 64,那么该gt bbox就属于第1层负责,其余层也是采用类似原则。总结来说就是第1层负责预测尺度在0~64范围内的gt,第2层负责预测尺度在64~128范围内的gt,以此类推。通过该分配策略就可以将不同大小的gt分配到最合适的预测层进行学习。
Step2:确定正负样本区域。通过center_sample_radius参数,确定在半径范围内的样本都属于正样本区域,其余区域作为负样本。默认配置center_sample_radius=1.5。例如,第1层的stride=8,那么在该输出层上,对于任何一个gt,基于gt bbox中心点为起点,在半径为1.5*8=12个像素范围内点都属于正样本区域。
Step3:centerness找到目标的中心点。使得离目标中心越近,输出值越大,反之越小。Center-ness的定义如下公式:
可见最中心的点的centerness为1,距离越远的点,centerness的值越小。在推测的时候直接将中心度分数centerness乘到分类分数上,将偏离很远的检测框分值进行惩罚。
1.3 损失函数
网络的输出依然包括分类和检测分支,具体损失函数公式如下:
(1)分类任务
分类任务通过卷积输出是80维的向量,代表的是80个类别,并采用的是focal loss损失函数。
(2)检测任务
检测任务输出的4维的向量,分别对应点到上下左右边的距离(l, t, r, b),并采用IOU loss。
(3)Center-ness loss
由于中心度的大小在0–1之间,因此在训练的时候使用BCE loss将其加入到训练中。
1.4 小节
FCOS是从一个点开始,然后使用该点与ground truth之间的垂直和水平距离(l,t,r,b)来表示边界框的,并通过引入层、区域、中心确定正负样本的分配。
2 CenterNet
论文链接:https://arxiv.org/pdf/1904.07850.pdf
代码链接:https://github.com/xingyizhou/CenterNet
其实有两篇 CenterNet,分别是Objects as Points这一篇与Keypoint Triplets for Object Detection这一篇。数据上后者优于前者,方法也是后者比较复杂。本文介绍的是Objects as Points这一篇,Objects as Points和FCOS有些相似,但更为简洁流畅,是我很最喜欢的方法。
CenterNet的Head层默认是输出80个类、2个预测的中心点坐标、2个中心点的偏移量。如下官方源码:
(hm): Sequential((0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): ReLU(inplace)(2): Conv2d(64, 80, kernel_size=(1, 1), stride=(1, 1)))(wh): Sequential((0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): ReLU(inplace)(2): Conv2d(64, 2, kernel_size=(1, 1), stride=(1, 1)))(reg): Sequential((0): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))(1): ReLU(inplace)(2): Conv2d(64, 2, kernel_size=(1, 1), stride=(1, 1)))
其中,hm为heatmap、wh为对应中心点的width和height、reg为中心点的offset,特征图的大小分别为 :
2.1 边界框的表示形式
如上图所示,CenterNet采用中心点和宽高来表示一个物体。和FCOS很相似,最大区别在于CenterNet使用的是中心点。
2.2 正负样本分配
与FCOS不同的是,CenterNet引入高斯热图确定正负样本。令中心点为 p,其计算方式为,对于经过网络下采样后的坐标,设为(R 为输出对应原图的步长,本文中R为4),然后将GT坐标通过高斯核分布到热图上,高斯核的计算公式如下:
其中,sigma 是一个与目标大小(也就是w和h)相关的标准差,而c 是在类别数目,如在COCO数据集上,c 的值为80,代表当前有80个类别。
生成的高斯热图如下所示,绿色框是GT,白色的椭圆是高斯核。
因此,对于Yxyc=1,表示在当前中心点 (x, y)位置的物体类别是 c ,Yxyc=0 则表示当前这个坐标点不存在类别为 c 的物体,而 Yxyc=(0,1) 的坐标点是困难样本。
那么为什么学习高斯热图,而不是0-1图?
在目标检测中,中心点附近的点其实都非常相似,如果直接将这些点标为负样本,会给网络的训练带来困扰;如果将其用高斯函数做一个“软化”,网络就会更好收敛。高斯热图能够给网络训练增加一个方向性的引导,距离目标点越近,权重就越大,这一点和FCOS的centerness的作用基本一致。
因此,CenterNet中正样本就是高斯核的中心点,高斯核中心附近的点是困难样本,不在高斯核内的都就是负样本。至于困难样本是正样本还是负样本,我认为很难界定。
2.3 分类任务
目标函数如下,使用的是像素级的Focal Loss来处理样本不平衡的问题:
其中,alpha和beta是Focal Loss的超参数,实验中分别设为2和4,N是图像中物体的个数,除以N主要为了将所有Focal Loss归一化。
2.4 offset回归
Offset回归和ROIAlign的出发点是相似的,图像下采样的时候,ground truth会因数据的取整而产生偏差,因此,需要对每个中心点预测偏移量,所有类别共享这个偏移预测分支,这个偏移用L1 Loss来训练:
2.5 wh回归
假设图像上的第k个物体的类别为c,它的包围框为(x1,y1,x2,y2),中心点为pk,对于这个物体,预测一个尺寸sk=(x2-x1,y2-y1),那么L1损失函数可以表示为:
因此,整个网络的损失函数由中心点loss、offset loss和wh loss的组成,并使用不同的权重参数。
2.5 小节
CenterNet可以看作是FCOS的进阶,确定了center和构造高斯热图的重要性。
3 RepPoints
论文链接:https://arxiv.org/abs/1904.11490
代码链接:https://github.com/microsoft/RepPoints
RepPoints是ICCV2019的一篇文章,提出了一种使用representative points表示图像中的目标的方法,相比于CenterNet(Objects as Points)这篇文章,虽然都是用points表示目标,但其实原理大相径庭。
RepPoints 思路很简单。给定靠近物体中心的源点(如下图,以红色标记点),将一个 3x3 的卷积应用于这个点的图像特征上,回归出多个目标点和中心源点的偏移值,这些目标点共同构成代表性点集(RepPoints)。
RPDet采用FPN结构,如下图展示了其中一个尺度。具体来说,RPDet其实有两个阶段:
第一阶段,将feature map上的点作为初始点(图中的绿色点),预测9个offset (Δx,Δy)参数(图中的蓝色点);
第二阶段,在这9个点的基础上进行refine,通过conv预测相对于第一阶段(Δx,Δy)的offset,得到最终的RepPoints。
3.1 目标表示
如下左图表示一般目标检测算法使用边界框来表示目标位置信息,如SSD,FCOS等等,而右图则表示了RepPoints使用representative points的方法来表示目标位置。这种新的表示方法称为代表性点集(RepPoints),优势是能适应物体姿态或形状的变化,从而提供了一个对物体更加细致的几何描述,同时这些点也能用于提取对识别有用的图像特征。
RepPoints是如何表示object的呢?
对于一个object,本文用点集表示其空间位置:论文中,默认 k=9,然后利用9个点生成的pseudo box(虚拟框)。文中给出了三种不同的生成方式,分别是:
Min-max function:在RepPoints上执行两个轴上的Min-max操作以确定pseudo box,等效于所有采样点上的边界框值;
Partial min-max function:在两个轴上分别对样本点的子集进行最小-最大运算,以获得pseudo box;
Moment-based function:使用RepPoints的平均值和标准偏差用于pseudo box的中心点和比例计算。
3.2 正负样本分配
第一阶段的正样本分配原则为:(1)计算每一层的feature map bin:
其中,是GT框的宽高。
(2)目标的GT中心落在对应的feature map bin的都是正样本;
第二阶段的正样本分配原则:将 GT 和 第一阶段产生的伪框的IoU大于0.5的认为是正样本,小于0.4为负样本,在此之间的忽略不计。
3.3 分类任务
使用Focalloss处理样本不平衡的问题。
3.4 回归任务
第一阶段和第二阶段都是先将respoint转换为伪框(pseudo box),然后计算伪框的左上角和右下角和GT的point损失,损失函数是SmoothL1Loss。
3.5 小节
RepPoints是key-point类的检测器,不过可以看作是CenterNet的进阶。因为如果RepPoints如果只预测两个点,那么就等价于预测左上和右下角了,这样又有了centernet的影子。具体细节上差异其实真的不少,毕竟 RepPoints 使用了点集表示目标物体,和使用边界框从出发点来看是不一样的。
4 总结
事实上,anchor free的方法有很多,而且不像anchor方法那样整洁,本文也仅整理了一小部分内容。但无论是anchor还是anchor free,检测任务无非就是这样的思路:
(1)表示:如何表示图像上的物体,如bbox,conner,center,reppoints等;
(2)分配:如何分配正负样本:IOU、高斯热图、centerness等;
(3)分类:分类任务计算物体类别损失,解决样本不平衡的问题;
(4)回归:回归任务计算物体尺度、offset等等,以进行一些修正。
Anchor free可以看做是检测算法的进阶资料,因为anchor引入了先验框这种很强的假定,而anchor free则发散到了这套检测思路的本质,如何表示?如何分配?如何计算loss?尽管anchor free的方法很杂,但都是在围绕这几个问题展开。有些人认为FCOS和CenterNet等是single anchor,因为使用a point进行预测,这种说法也是有道理的,不过我认为没有必要care这些。
这篇文章先到这里,如果要评价anchor和anchor-free到底孰优孰劣,真的很不容易,数据和算法也往往都是成对的。
检测的话题还真的不少,下一篇,计划讨论label assign和disalignment。如果您有感兴趣的话题,可以在讨论区中发布,或许就是我们接下来的写作方向。
yw
本文仅做学术分享,如有侵权,请联系删文。
下载1
在「3D视觉工坊」公众号后台回复:3D视觉,即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。
下载2
在「3D视觉工坊」公众号后台回复:3D视觉github资源汇总,即可下载包括结构光、标定源码、缺陷检测源码、深度估计与深度补全源码、点云处理相关源码、立体匹配源码、单目、双目3D检测、基于点云的3D检测、6D姿态估计源码汇总等。
下载3
在「3D视觉工坊」公众号后台回复:相机标定,即可下载独家相机标定学习课件与视频网址;后台回复:立体匹配,即可下载独家立体匹配学习课件与视频网址。
重磅!3DCVer-学术论文写作投稿 交流群已成立
扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。
同时也可申请加入我们的细分方向交流群,目前主要有3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流等微信群。
一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。
▲长按加微信群或投稿
▲长按关注公众号
3D视觉从入门到精通知识星球:针对3D视觉领域的知识点汇总、入门进阶学习路线、最新paper分享、疑问解答四个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近2000星球成员为创造更好的AI世界共同进步,知识星球入口:
学习3D视觉核心技术,扫描查看介绍,3天内无条件退款
圈里有高质量教程资料、可答疑解惑、助你高效解决问题
觉得有用,麻烦给个赞和在看~
目标检测中的Anchor-free回顾相关推荐
- anchor free 目标检测_《目标检测》系列之二:目标检测中的Anchor机制回顾
前段时间,YOLOv4&v5大火,很多人忽视了yolov5在anchor上的一些细节变化,因此,本文从Faster RCNN着手,逐步分析SSD.YOLOv4&v5的anchor机制. ...
- 全面理解目标检测中的anchor
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 来源丨CV技术指南 编辑丨极市平台 导读 anchor是一个晦涩难懂 ...
- 目标检测中的Anchor
前言: 在计算机视觉四大基本任务(检测.分类.定位.分割)中,图像的目标检测受到的了研究者们越来越多的关注.今天我们就来聊一聊在目标检测中一项重要的机制--Anchor.Anchor机制在凯明大神提出 ...
- CVPR2020 | MAL:联合解决目标检测中的定位与分类问题,自动选择最佳anchor
点击上方"AI算法修炼营",选择"星标"公众号 精选作品,第一时间送达 本文是收录于CVPR2020的工作,其实文章在去年就挂在了网上,整体思路还算不错.具体来 ...
- 目标检测中的anchor-based 和anchor free
目标检测中的anchor-based 和anchor free anchor-free 和anchor-based 区别 深度学习目标检测通常都被建模成对一些候选区域进行分类和回归的问题.在单阶段检测 ...
- 目标检测中Anchor的本质分析
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨东林钟声@知乎 来源丨https://zhuanlan.zhihu.com/p/84398108 ...
- 目标检测中Anchor如何映射到原图
Anchor在目标检测中是比较常见的,引入Anchor主要是为了让检测更精准,当然现在有很多Anchor Free的方法也达到了较好的结果,但是最近项目中用的是基于Anchor的方法,但是置于Anch ...
- 综述:解决目标检测中的样本不均衡问题
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨SFXiang 来源丨AI算法修炼营 编辑丨极市平台 极市导 ...
- 【TPAMI2020】目标检测中的不平衡问题:综述论文,34页pdf
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 作者:ChenJoya 知乎链接:https://zhuanlan.zhihu.c ...
最新文章
- Linux 用户和用户组配置说明
- [Python] sys.argv[] 用法
- 干货 | 携程异地多活-MySQL实时双向(多向)复制实践
- iptv直播_全球IPTV高清直播网络电视+4K频道
- 【移动开发】安卓Lab2(02)
- IDC:2015年全球专用备份一体机市场稳健增长
- ssl2648-线段树练习5【线段树】
- php如何减缓gc_管理信息传播-使用数据科学减缓错误信息的传播
- C/C++中从文件末尾反向读取N行文件记录(末尾读取文件)
- keras ConvLSTM2D 的简单应用
- 推荐两份学习 Kotlin 和机器学习的资料
- c语言中函数指针用法,C语言函数指针的用法
- 实现音乐播放器歌词显示效果
- mcgs 施耐德tm218 变频器cv3100通过modbus连接控制
- 对称加密算法(DES、3DES、AES)
- Word快捷键列表之Ctrl+
- 用canvas制作表情包
- Golang 的 mgo 连接池
- Java jdk源代码的Math包
- 有趣的海盗分金问题(博弈论)
热门文章
- linux有趣的命令播放电影,常用的Linux命令片段
- Android4.4电池管理
- pcs增加mysql资源_pcs命令配置示例(详细版)
- threejs封装加载 .glb 格式模型,修改贴图
- 冒泡排序图解-Java实现
- linux 没有可用软件包,Linux中“没有可用的软件包XX,但是它被其他软件包引用”的解决方法...
- (Vulnhub练习)-- fristileaks渗透实战
- 浏览器主页被2345劫持解决
- 国内物联网平台(7):Ablecloud物联网自助开发和大数据云平台
- [实践篇]13.8 如何解析gcore?