目标检测中边界框的回归策略

 
 

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文主要讲述:1.无Anchor的目标检测算法:YOLOv1,CenterNet,CornerNet的边框回归策略;2.有Anchor的目标检测算法:SSD,YOLOv2,Faster R-CNN的边框回归策略。 

写在前面

目标检测包括目标分类和目标定位2个任务,目标定位一般是用一个矩形的边界框来框出物体所在的位置,关于边界框的回归策略,不同算法其回归方法不一。本文主要讲述:1.无Anchor的目标检测算法:YOLOv1,CenterNet,CornerNet的边框回归策略;2.有Anchor的目标检测算法:SSD,YOLOv2,Faster R-CNN的边框回归策略。如有错误和疑问,还望交流与指正!

无Anchor的目标检测算法边框回归策略

1. YOLOv1

原文链接:https://pjreddie.com/media/files/papers/yolo.pdf

解读链接:

https://zhuanlan.zhihu.com/p/75106112

YOLOv1先将每幅图片reshape到448x448大小,然后将图片分成7x7个单元格,每个格子预测2个边界框,而每个边界框的位置坐标有4个,分别是x,y,w,h。其中x,y是边界框相对于其所在单元格的偏移(一般是相对于单元格左上角坐标点的偏移,在这里每个正方形单元格的边长视为1,故x,y在[0,1]之间);w,h分别是预测的边界框宽,高相对于整张图片宽,高的比例,也是在[0,1]之间。YOLOv1中回归选用的损失函数是均方差损失函数,因此我们训练时,有了预测的边界框位置信息,有了gtbbox,有了损失函数就能按照梯度下降法,优化我们网络的参数,使网络预测的边界框更接近与gt_bbox。

16298edcf65425a3490522c328d3dc86.jpeg

2. CornerNet

原文链接:https://arxiv.org/pdf/1808.01244.pdf

代码链接:

https://github.com/umich-vl/CornerNet

这是在ECCV2018发表的一篇文章,文章将目标检测问题当作关键点检测问题来解决,具体来说就是通过检测目标框的左上角和右下角两个关键点得到预测框,因此CornerNet算法中也没有anchor的概念,在目标检测领域Anchor大行其道的时候,这种无Anchor的做法在目标检测领域是比较创新的而且取得的效果还很不错。此外,整个检测网络的训练是从头开始的,并没有基于预训练的分类模型,这使得用户能够自由设计特征提取网络,不用受预训练模型的限制。

  • 算法结构

bfab48b05ee5d0ff5bba8d34af2aaef4.jpeg

首先原图经过1个7×7的卷积层将输入图像尺寸缩小为原来的1/4(论文中输入图像大小是511×511,缩小后得到128×128大小的输出),然后经过特征提取网络Hourglass network提取特征,Hourglass module后会有两个输出分支模块,分别表示左上角点预测分支和右下角点预测分支,每个分支模块经过应该Corner pooling层后输出3个信息:Heatmaps、Embeddings和Offsets

1.Corner pooling:更好的定位角点,一个角点的定位不能只依靠局部信息,Corner pooling层有两组特征图,相同的像素点,汇集值一个是该像素水平向右的最大值,一个是垂直向下的最大值,之后两组特征图求和;

2.Heatmaps:预测角点位置信息,一个支路预测左上角,一个支路预测右下角。Heatmaps可以用维度为CxHxW的特征图表示,其中C表示目标的类别(不包含背景类),这个特征图的每个通道都是一个mask,mask的每个值是0到1,表示该点是角点的分数(注意一个通道只预测同一类别的物体的角点信息);

3.Embeddings:用来对预测的角点分组,也就是找到属于同一个目标的左上角角点和右下角角点,同一个预测框的一对角点的角距离短。如下图:

e7bf480b58d7fc291008b0d7c6c0f842.jpeg

4. Offsets:调整角点位置,使得获得的边界框更紧密。

  • Corner poolin

1)有无Corner pooling的预测框对比

b2030ab1c38dccc1fde8de293e5495ef.jpeg

可以看出有了Corner pooling,预测的目标边界框的角点,位置信息更加的精确了。

2)主要思想

20683522cb7b840bf2559aa635b0b43a.jpeg

如上图所示,通常一个目标的边界框的角点是不包含该目标的局部特征信息的,那么我们如何判断某一个位置的像素点是否是某一个目标的角点呢?拿左上角点来说,对于左上角点的上边界,我们需要从左往右看寻找目标的特征信息,对于左上角点的左边界,我们需要从上往下看寻找目标的特征信息(比如上图中的第一张图,左上角点的右边有目标顶端的特征信息:第一张图的头顶,左上角点的下边有目标左侧的特征信息:第一张图的手,因此如果左上角点经过池化操作后能有这两个信息,那么就有利于该点的预测,这就是Corner pooling的主要思想)。

3)具体做法

6332d6d3bf71cf0b400e54763b867f2c.jpeg ec3e31f90aabd6258371479494fb05f6.jpeg

如Figure3所示,Corner pooling层有2个输入特征图,特征图的宽高分别用W和H表示,假设接下来要对图中红色点(坐标假设是(i,j))做corner pooling,那么首先找到像素点以下(包括本身)即(i,j)到(i,H)(左角点的最下端)这一列中的最大值,然后将这张特征图中(i,j)位置的特征值用这个最大值替代,类似于找到Figure2中第一张图的左侧手信息;然后找到(i,j)到(W,j)(左角点的最右端)的最大值,然后将这张特征图中(i,j)位置的特征值用这个最大值替代,类似于找到Figure2中第一张图的头顶信息,然后将这2个特征图中的(i,j)位置的特征值相加,也就是将找到的这两个最大值相加得到(i,j)点的值(对应Figure3最后一个图的蓝色点)。对于,右下角点的Corner pooling操作类似,只不过找最大值变成从(i,j)到(0,j)和从(i,j)到(i,0)中找。比如Figure6中,第一张特征图,比如第2行的第1个点(值为2),其右边同一行的最大值是3,故经过Corener Pooling后,其值变为3,其他同理;第2张特征图,第2列的第一个点为3,其下面所在列的最大值(包括本身)也是3,因此经过Corener pooling之后,其中也变为3,最后将2张特征图对应位置的点的特征值相加,得到一张特征图。

  • Heatmaps

CornerNet的第一个输出是headmaps,网络一共输出2组Heatmap,一组预测左上角点,一组预测右下角点。每组Heatmap有C个通道,代表C类。每个角点,只要ground truth处的点为postive,其余位置为negative,因为在ground-truth附近的负样本也可以得到overlap较大的box,满足要求。因此,不同负样本的点的损失函数权重不是相等的,而是在以ground-truth为中心圆内呈非归一化高斯分布,圆半径以在圆内的点形成的box与ground-truth的IoU不小于t(t=0.7)为标准,如下图所示:

01a28e5ed61ac9ef320c482c40f388e2.jpeg 593ebd076e158e4c976bd56de4c5629f.jpeg

上图是针对角点预测(headmaps)的损失函数,整体上是改良版的Focal loss。几个参数的含义:N为整张图片中目标的数量 a6329cca053069edb86a06da04217e09.png4128c74cd55762b69365cd7ddfb5bd21.png为控制每个点的权重的超参数,具体来说,144f94d9ababb333cbda1e0c04ece70e.png参数用来控制难易分类样本的损失权重(在文章中efbc5a6184783638f897c900e4d55bd7.png 为2,7661e02156a540356bc6fa571aa691a3.png为4),pcij表示预测的heatmaps在第c个通道(类别c)的(i,j)位置的值,ycij表示对应位置的ground truth,ycij=1时候的损失函数就是focal loss;ycij等于其他值时表示(i,j)点不是类别c的目标角点,照理说此时ycij应该是0(大部分算法都是这样处理的),但是这里ycij不是0,而是用基于ground truth角点的高斯分布计算得到,因此距离ground truth比较近的(i,j)点的ycij值接近1,这部分通过β参数控制权重,这是和Focal loss的差别。为什么对不同的负样本点用不同权重的损失函数呢?这是因为靠近ground truth的误检角点组成的预测框仍会和ground truth有较大的重叠面积。

  • Offset

从heatmap层回到input image会有精度损失(不一定整除存在取整),对小目标影响大,因此预测location offset,调整corner位置。损失函数如下:

b1c089cdfe341e7cc39c8e920777112f.jpeg f8ff71a00767cf97f550269863ac8afa.jpeg

Xk,Yk是角点的坐标,n为下采样的倍数,公式中符合为向下取整。

O^k代表Offsets的predicted offset;Ok代表gt的offset。

  • Embeddings

负责检测哪个top-left corner和哪个bottom-right corner是一对,组成一个box,同一个box的corner距离短。top-left和bottom-right corner各预测一个embedding vector,距离小的corner构成一个box(一个图多个目标,多对点,因此确定group是必要的)embedding这部分的训练是通过两个损失函数实现的,如下图:

5c522faca9f4e6fbb4c4d9a6ecce4533.jpeg

etk表示第k个目标的左上角角点的embedding vector,ebk表示第k个目标的右下角角点的embedding vector,ek表示etk和ebk的均值。公式4用来缩小属于同一个目标(第k个目标)的两个角点的embedding vector(etk和ebk)距离。公式5用来扩大不属于同一个目标的两个角点的embedding vector距离。Pull loss越小,则同一object的左上角和右下角的embedding得分距离越小;Push loss越小,则不同object的左上角和右下角的embedding得分距离越大。

  • 总损失函数

04f30a836b159eb676758d42db015131.jpeg

其中,α, β, γ是超参数,分别取0.1, 0.1, 1。

  • 回归策略

说了那么多,CornerNet主要是通过预测目标的左上角点和右下角点,来完全目标的边界框预测。Corner pooling负责更好的找到角点位置,headmaps输出角点位置信息,Embeddings负责找到同一个目标的一组角点,Offsets用于对角点微调,使预测框更加精准。

  • 补充

CornerNet通过检测物体的左上角点和右下角点来确定目标,但在确定目标的过程中,无法有效利用物体的内部的特征,即无法感知物体内部的信息,因为在判断两个角点是否属于同一物体时,缺乏全局信息的辅助,因此很容易把原本不是同一物体的两个角点看成是一对角点,因此产生了很多错误目标框,另外,角点的特征对边缘比较敏感,这导致很多角点同样对背景的边缘很敏感,因此在背景处也检测到了错误的角点从而导致该类方法产生了很多误检 (错误目标框)。其实不光是基于关键点的 one-stage 方法无法感知物体内部信息,几乎所有的 one-stage 方法都存在这一问题。与下面介绍的CenterNet同名的还有一篇文章,文章主要基于CorenNet出现的误检问题,作了改进,文章除了预测左上角点和右下角点外,还额外预测了目标的中心点,用三个关键点而不是两个点来确定一个目标,使网络花费了很小的代价便具备了感知物体内部信息的能力,从而能有效抑制误检。大家可以参考以下资料:

论文:https://arxiv.org/pdf/1904.08189.pdf

代码:https://github.com/Duankaiwen/CenterNet

3. CenterNet

原文链接:https://arxiv.org/pdf/1904.07850.pdf

代码链接:

https://github.com/xingyizhou/CenterNet

这里区别一下呀,今年好像有2篇称CenterNet的论文,我要介绍的这篇名为“Objects as Points”,另外一篇就是上面提到的中科院牛津华为诺亚提出的,名为“CenterNet: Keypoint Triplets for Object Detection”是基于CornerNet作的改进。这篇CenterNet算法也是anchor-free类型的目标检测算法,基于点的思想和CornerNet是相似的,方法上做了较大的调整,与Corenet不同的是,CenterNet预测的是目标的中心点,然后再预测目标框的宽和高,来生成预测框。此外此网络还能作3D目标检测和人体姿态估计。

40564f12732102eed86ebf2e247dd60c.jpeg
  • 与CornerNet对比

1、CenterNet,从算法名也可以看出这个算法要预测的是目标的中心点,而不再是CornerNet中的2个角点;相同点是都采用热力图(heatmap)来实现,都引入了预测点的高斯分布区域计算真实预测值,同时损失函数一样(修改版Focal loss,网络输出的热力图也将先经过sigmod函数归一化成0到1后再传给损失函数)。另外CenterNet也不包含corner pooling等操作,因为一般目标框的中心点落在目标上的概率还是比较大的,因此常规的池化操作能够提取到有效的特征,这是其一。
2、CerterNet中也采用了和CornerNet一样的偏置(offset)预测,这个偏置表示的是标注信息从输入图像映射到输出特征图时由于取整操作带来的坐标误差,只不过CornerNet中计算的是2个角点的offset,而CenterNet计算的是中心点的offset。这部分还有一个不同点:损失函数,在CornerNet中采用SmoothL1损失函数来监督回归值的计算,但是在CenterNet中发现用L1损失函数的效果要更好,差异这么大是有点意外的,这是其二。
3、CenterNet直接回归目标框尺寸,最后基于目标框尺寸和目标框的中心点位置就能得到预测框,这部分和CornerNet是不一样的,因为CornerNet是预测2个角点,所以需要判断哪些角点是属于同一个目标的过程,在CornerNet中通过增加一个corner group任务预测embedding vector,最后基于embedding vector判断哪些角点是属于同一个框。而CenterNet是预测目标的中心点,所以将CornerNet中的corner group操作替换成预测目标框的size(宽和高),这样一来结合中心点位置就能确定目标框的位置和大小了,这部分的损失函数依然采用L1损失,这是其三。

  • 回归策略

CenterNet对目标框的回归策略,采用先预测目标的中心点位置,然后再预测目标框的宽和高来达到目标检测。预测中心点的偏移采用修改版的Focal loss,对于热力图中中心点到原图映射的偏差,采样L1损失函数,对于目标框宽和高的预测也是采用L1损失函数。

有Anchor的目标检测算法边框回归策略

1. Faster R-CNN

关于论文和解读,网上有很多大佬讲的很好(https://zhuanlan.zhihu.com/p/31426458),这里其他方面我就不说了,主要谈一下,Faster R-CNN的回归策略。

fbdbd7fbf03727bb1298c8b1f69597dd.jpeg a49fa9dc443f4fe6075feda79db67189.jpeg

X为预测框的中心点坐标,Xa为Anchor的中心点坐标,X为gt_bbox的中心点坐标(y,w,h同理),目标是使变换因子tx跟tx*差距最小,损失函数为Smooth L1损失函数。

2. YOLOv2

YOLOv2中作者引入了Faster R-CNN中类似的anchor,但是回归策略不同,对bbox中心坐标的预测不是基于anchor坐标的偏移量得到的,而是采用了v1中预测anchor中心点相对于对于单元格左上角位置的偏移,如下图

41a96432c14d9268747ea2e74988a648.jpeg

上图中tx,ty,tw,th为坐标变换系数,Cx,Cy为Anchor中心的坐标,Pw,Ph为Anchor的宽和高,tx和tw是Anchor中心点相对于其所在单元格左上角点坐标的偏移,在这里作者说之所以没有采样Faster R-CNN中的回归策略是因为Faster R-CNN对于预测框中心点的回归太不稳定了,而YOLOv2将中心点能够固定在单元格范围之内。损失函数采样的是MSE均方差损失函数,回归损失函数输入的参数分别是Anchor到预测框的坐标变换系数和Anchor到gt_bbox的坐标变换系数。

3. SSD

论文:https://arxiv.org/pdf/1512.02325.pdf

45d951c022955b8c3f481352b3dfee58.jpeg

回归策略基本和Faster R-CNN中一致,对边界框的回归的损失函数也是采样的Smooth L1损失函数,不过这里的先验框名字叫 Default Box和Faster R-CNN中的Anchor叫法不一样。

 
 

好消息!

小白学视觉知识星球

开始面向外开放啦👇👇👇

 
 

9a91b8bcfe615b495bce89ab0ad27433.jpeg

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。


下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。


下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。


交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值