The evolution process from RCNN to ATSS
基本知识点
计算感知野的一个网站:Fomoro Visual Inspection
空洞卷积:总结-空洞卷积(Dilated/Atrous Convolution) - 知乎
低层的特征语义信息比较少,但是目标位置准确;高层的特征语义信息比较丰富,但是目标位置比较粗略。
语义分割:如上图所示,图像中是一只可爱的猫在草地上散步。输出结果应该是,对于每个像素,确定它属于猫、草地或者天空,或者背景亦或其他分类。语义分割并不区分同类目标。也就是说,不会区分第二幅图的这两头牛,这是语义分割的缺点。
底层到高层依次反映出:边缘块状、纹理、物体部分、物体分类
相应的卷积核特征:强调边缘、强调纹理、强调物体的一部分、强调分类
卷积层(池化层也可以看成一个卷积层)接受任意尺寸的输入。卷积层使用滑动的特征过滤器,它们的输出基本保持了原始输入的比例关系。它们的输出就是特征图,它们不仅涉及响应的强度,还包括空间位置。
经过卷积池化后,物体的位置几乎不变,由于大多数情况下无法整除,会上取整数,所以位置会有偏差。层数越高偏差越大,位置信息越不准确。
较浅的卷积层感知域较小,学习到一些局部区域的特征,底层网络可以预测更多的位置信息,因为他的感受野小可以看到小的 pixels,定位更准;较深的卷积层具有较大的感知域,能够学习到更加抽象一些的特征,但是由于stride较大,故其映射回原图后定位不准确,例如anchor会稀疏问题。
低层位置信息准确,高分辨率,高层低分辨率
基本概念:
IOU、mAP:参考深度学习笔记(八):目标检测性能评价指标(mAP、IOU..)_小熊猫的博客-CSDN博客_map越大越好
注意:IOU的重叠与内容无关,不是内容的重叠,而是大小的重叠!
fine-tune(微调):参考CNN入门讲解:什么是微调(Fine Tune)? - 知乎
NMS:非极大值抑制
ground truth:真实目标的位置、标签
hard negative mining(难例挖掘):参考图像处理中的hard negative mining(难例挖掘)_热带巨兽的博客-CSDN博客_难例挖掘
feature map:特征图
anchor box:由RPN网络产生的不同尺寸的包围框
anchor-free:不需要anchor boxes
top1、top5:参考top-1和top-5正确率与错误率以及目标检测评价指标_xiaobumi123的博客-CSDN博客_top1指标
AR(average recall)
10-view(Spp论文中出现):即通过裁剪和变形产生的10种不同的region。
two stage:两阶段目标检测算法,即先提取候选框,然后进行识别检测。
one stage:直接进行识别检测,一步完成。
object detection papers
1、RCNN:2014
上图反映的其实是个测试流程,具体的训练流程更复杂一些
1、给定一张图,通过选择性搜索(Selective Search)方法提取2000个特征,提取的每个region proposal 都有一个对应的Bounding Box,region proposals用四元数组进行定义,即(r, c, h, w),即窗口的左上坐标、高、宽、右下坐标。Region proposal大小各异,由于RCNN才去的backbone为Alexnet,其输入必须为227*227的格式。经过作者一系列实验表明采用padding=16的各向异性变形效果最好,能使mAP提升3-5%。各向异性变形,简单粗暴对图像就行缩放至227×227。这种做法其实会造成图像的失真,改变了图像的原始特征,这一点也是后续改进算法的一个突破口。其次这2000张图像的提取非常耗时,而且耗内存。
2、将2000个候选区域(region proposals)通过预训练完成后的基于Alexnet的网络,生成2000*4096的特征向量。
3、将这组已经学得的特征向量抽出,去用已训练完成的SVM进行分类,SVM会对4096维特征对应于类进行打分,最终得到4096*20的权重矩阵,将这2个大矩阵相乘,形成2000*20的得分矩阵。
然后对每一类进行NMS处理,完成目标检测的识别任务,具体的,这里参考【深度学习】:R-CNN论文详解_Vermont_的博客-CSDN博客
① 对2000×20维矩阵中每列按从大到小进行排序;
② 从每列(同一类)最大的得分建议框开始,分别与该列后面的得分建议框进行IoU计算,若IoU>阈值,则剔除得分较小的建议框(说明重叠率很大,两个建议框被视为描述一个目标,此时只保留最大得分建议框),否则(说明重叠率很小),则认为图像中存在多个同一类物体;
③ 从每列次大的得分建议框开始,重复步骤②(这里的次大得分建议框的起始位置应该是在大的得分建议框后,或者在满足”若IoU>阈值,则剔除得分较小的建议框“里的建议框后);
④ 重复步骤③直到遍历完该列所有建议框;
⑤ 遍历完2000×20维矩阵所有列,即所有物体种类都做一遍非极大值抑制(保留了同一个目标最高的得分建议框,即剔除了同一目标满足重叠率非最大得分的建议框);
⑥ 最后剔除各个类别中剩余建议框得分少于该类别阈值的建议框。
4、对每一个框进行bbox回归,对框的位置进行调整,得到其真实位置,即ground true。
训练流程
1、迁移学习:首先选择在大数据下训练好的模型及参数,然后在小数据集上进行微调,这也是RCNN最主要的一个创新点,对后续的目标检测算法有着深远的影响。因为绝大多数情况下,我们并没有很大的数据集,相反,我们手上的数据集相对较小
一个较大的识别库(ImageNet ILSVC 2012):标定每张图片中物体的类别。一千万图像,1000类。
一个较小的检测库(PASCAL VOC 2007):标定每张图片中,物体的类别和位置。一万图像,20类。
提取在 ILSVRC 2012 的模型和权重,然后在 VOC 上进行 fine-tune。需要注意的是,这里在 ImageNet 上训练的是模型识别物体类型的能力,而不是预测 bbox 位置的能力。
具体微调实现:
因此只需要改变最后一层全连接层:(4096)->(1000)改为(4096)->(21),因为VOC数据集上只有21个分类。因此我们只需去训练最后一层。为了保证不影响前面几层已经训练好的参数权重,以Pytorch实现为例,只需要设置权重的required_grad=False。
对于每一个候选框,计算与其标定框的IOU,若大于0.5,则为该标定框的类别,为正样本,IOU小于0.5,则为负样本。对每一张训练集图片都一样的处理。
每一个batch由32个正样本(那20个类)和96个负样本(背景),采用lr=0.001去训练新网络去学习到那21个类的4096维新特征。
至此,微调就结束了。与重新训练一整个模型相比,微调更容易就能获得一个高正确率的识别网络。因为我们都知道,深度网络中主要消耗计算量的在卷积层,主要消耗存储量的在全连接层。
But,RCNN的实现过程中,分类并不是用softmax去实现的,而是SVM,故接下来需要去训练一个SVM,从这来看,RCNN并不是一个纯正的深度学习算法。
2、SVM的训练
对每张图片的2000个候选区域,分别计算它们与标定框的IOU,若IOU大于0.7,则为正样本(20个类中的一个),若IOU<0.3,则为负样本(背景),中间0.3-0.7的忽略不计。对每一种类别的图片都这么做,经过hard negetive mining训练,可以得到一个较强的SVM二分类器。
以同样的方式去训练其余20个分类器,最终得到21个SVM分类器。
为什么SVM对正负样本的定义与预训练的不一样呢?
首先,由于SVM适用于小样本,因此对于正负样本的阈值需要定义的更严格一些。
其次,SVM分类的原理是让间距最大化,因此越难分的数据越有利于SVM的训练,所以对样本的定义比较严格。
3、bbox回归
经过NMS的筛选,我们得出了几个与图中groundtruth相近的候选框,所以接下来就是去预测候选框的精确位置。显示这是一个回归问题。由于最后检测框(即从SVM训练的NMS之后剩余的框)与groundtruth比较接近,所以可以认为是个线性回归问题,这里需要注意,只有相近才可以看成线性回归问题。
为什么要用bbox回归?前面的步骤不是可以找到目标了吗?原因看下图:
红色框为region propasal,是我们找到的建议框,绿色为真实的目标,即groundtruth,虽然建议框识别出了目标,但是由于定位不准确,所以被认为是无法正确定位目标,因为目标检测是识别+精确定位。为了解决这个问题,我们需要对建议框进行调整,使之接近绿色框的坐标。
训练回归器的输入为N对值,为候选区域的框坐标和真实的框坐标。虽然经过了卷积池化,但是候选框未经网络前和pool5中的位置信息特征几乎不变,只是从一个大框变成一个小框罢了。
回归训练:
设候选框为P(Px,Py,Pw,Ph)(在选择性搜索的时候就有),分别为中心坐标x,y,框的宽度,框的高度。真实框G(Gx,Gy,Gw,Gh)(这是VOC样本自带的),这里的Proposal必须和Ground Truth的IoU>0.6。
即R-CNN论文里面的:
Gx = Px + dx(P) * Pw
Gy = Py + dy(P) * Ph
Gw = Pw * exp(dw(P))
Gh = Ph * exp(dh(P))
dx(P)、dy(P)、dw(P)、dh(P)就是我们需要去学习的4个参数。
上述4个变换可以用
d(P) = W * ,就是pool5输出的feature map,W就是我们要学习的参数。
该回归器的损失函数为:
正则化参数为10000。
上式中的可以通过如下公式求出:
所以通过输入的特征值训练,从而求出,就可以得到回归器
论文中作者还提出了对pool5输出特征图的可视化
思路是挑选一个特征出来,把它直接当成一个物体分类器,然后计算它们处理不同的候选区域时,activation 的值,这个值代表了特征对这块区域的响应情况,然后将 activation 作为分数排名,取前几位,然后显示这些候选区域,自然也可以清楚明白,这个 feature 大概是什么。
R-CNN 作者将 pool5 作为可视化对象,它的 feature map 是 6x6x255 的规格,可以理解为有 256 个小方块,每个方块对应一个特征。
下面的图表中显示了这以可视化的效果,这里只显示了 256 个特征中的 6 个,每个特征取 activation 值最高的 16 个区域。
博主对原文中作者说的物体分类器是这么理解的:就像kNN的原理一样,kNN中,计算当前特征向量与已知特征向量的距离,最后取前几个距离的点的类别概率最大分类为当前点的类别。这里的距离就相当于论文中的acitivation。两个特征向量越是接近,其acitivation自然越高。
可见该层滤波器激活的都是物体的部分信息。
RCNN不足:
1、重复计算。通过selective search 提取近2000左右的候选框,即今2000个ROI,RCNN对每个ROI,都跑一遍CNN,计算量很大,而且其实这些ROI之间是有overlap,显然有大量计算是重复的。(所以SPP-Net和Fast-RCNN对其进行改进)。
2、multiple-stage pipeline:训练分为多个阶段:特征提取->特征向量提取->SVM分类->回归。
3、训练耗时,占有磁盘空间大。提取的特征、卷积出来的特征数据还要保持至本地磁盘。
4、RCNN的输入图片必须通过裁剪crop和变形warp成固定尺寸,造成图片失真,失去了原始特征信息。
2、SPPnet:2015.4.23
空间金字塔池化网络
由于RCNN重复计算问题以及进入网络前每次需要提取2000个,耗时且耗内存问题。
第二个问题在于RCNN的输入图片必须通过裁剪crop和变形warp成固定尺寸,然后输入网络,这会造成图片失真,失去了原始特征信息。
固定尺寸归根到底在于后面的FC层输入必须为256*6*6的神经元个数,而卷积池化层则不需要固定尺寸,并且他可以产生各种尺寸。Spp的提出主要用于消除输入为固定尺寸的问题。
何凯明于2015年提取空间金字塔池化算法,用于解决上述这2个问题。如上图所示,Sppnet在pool5后加入一层Spatial pyramid pooling。R-CNN的特征计算十分耗时,因为他对每张图片中的上千个变形后的区域的像素反复调用CNN。论文中,只需要在整张图片上运行一次卷积网络层(不关心窗口的数量),然后再使用SPP-net在特征图上抽取特征。这个方法缩减了上百倍的耗时。
Spp层的强大在于,对于任意尺寸的输入特征图,都能输出固定长度的特征向量,正是这一原理,完美解决了RCNN每次都需要处理成固定尺寸(227*227)的候选框问题。
对深度CNNs而言,SPP有几个突出的优点:
- SPP能在输入尺寸任意的情况下产生固定大小的输出,而以前的深度网络中的滑窗池化(sliding window pooling)则不能;
- SPP使用了多级别的空间块(bins),而滑窗池化则只用了一个窗口尺寸。多级池化对于物体的变形十分鲁棒[15];
- 由于其对输入的灵活性,SPP可以池化从各种尺度抽取出来的特征。
为了实现一个单一网络能够接受各种输入尺寸,我们使用 多个共享所有权重的网络来近似得到这种效果,不过,这里的每个网络分别使用固定输入尺寸进行训练。每个 epoch 使用固定的尺寸训练这个网络,下一轮使用另一个尺寸来训练。实验表明,这种多尺度的训练与传统的单体型训练是的收敛速度是一样的,但是带来更好的测试精度。
上图特征图来自于conv5层的一些过滤器。图2(c)显示了ImageNet数据集中激活最强的若干图像。可以看到一个过滤器能够被一些语义内容激活。例如,第55个过滤器(图2,左下)对圆形十分敏感;第66层(图2,右上)对∧形状特别敏感;第118个过滤器(图2,右下)对V形状非常敏感。这些输入图像中的形状会激活相应位置的特征图(图2中的箭头)。从图中我们还可以看出经过卷积池化后,物体的位置几乎不变。
接下来就是空间金字塔池化的原理:
如上图所示,Spp层中,每个空间块都会对任意尺寸的feature map进行最大池化。第一个为4*4,第二个为2*2,第三个为1*1,三个空间块的大小都和输入feature map一样大。以4*4分析为例,每一个格子的计算结果都是不一样的,由于pool5输出6*6*256的feature map,4*4的空间块将6*6的输入分成4*4=16个格子,在这里,你将每一个格子看成一个256维的特征向量,这样就提取了16个256维的特征向量,然后进行拼接成16*256维向量。同理2*2、1*1也一样。最后Spp层输出多组合的
(16+4+1)*256=5376维向量。
因为一共有3块,且大小不一样,称为3层金字塔结构。
有了空间金字塔池化,输入图像就可以是任意尺寸了。不但允许任意比例关系,而且支持任意缩放尺度。
Spp性能分析:
网络训练:
理论上将上述网络结构可以用标准的反向传播进行训练[1],与图像的大小无关。但实践中,GPU的实现更适合运行在固定输入图像上。接下来,我们描述我们的训练方法能够保持空间金字塔池化行为,同时还能充分利用GPU的优势。(训练时是基于固定尺寸的输入)
单一尺度(即输入图片大小固定,如227*227)训练
输入尺寸13*13*256,bins:3*3、2*2、1*1,则输出特征向量(9+4+1)*256=3584维
对于除不尽的(如13/3),论文给出的方法是向上取整,即13/3=5
另外,Sppnet如何实现呢?代码层面就还是一个滑窗过程,关键控制好stride。
下面这个是论文中的Spp处理过程:
单一尺寸训练的主要目的是:开启多级别池化行为。实验表明这是获取精度的一个原因。
多尺度训练(输入180*180和224*224):
224×224的区域图像变为180×180大小。这样,不同尺度的区域仅仅是分辨率上的不同,而不是内容和布局上的不同。
对于接受180×180输入的网络,我们实现另一个固定尺寸的网络。本例中,conv5输出的特征图尺寸是10×10。我们仍然使用win = 上取整[a/n],str = 下取整[a/n],实现每个金字塔池化层。这个180网络的空间金字塔层的输出的大小就和224网络的一样了。这样,这个180网络就和224网络拥有一样的参数了。换句话说,训练过程中,我们通过使用共享参数的两个固定尺寸的网络实现了不同输入尺寸的SPP-net。在每个网络上训练一个完整的epoch,然后在下一个完成的epoch再切换到另一个网络(权重保留)。依此往复。实验中我们发现多尺寸训练的收敛速度和单尺寸差不多。
上面的单尺寸或多尺寸方法只用于训练阶段。在测试阶段,是直接对各种尺寸的图像应用SPP-net的。
多层次(金字塔的层数)的测试结果:4种基本架构只是最后卷积层之后的池化层,被替换成了SPP层,{6x6, 3×3, 2×2, 1x1}(总共50个块)
使用标准的10-view预测法,每个view都是一个224×224的裁切。
结论:
多尺寸训练提升准确度。多层次池化带来的提升不只是因为更多的参数;而是因为多层次池化对:对象的变形和空间布局更加鲁棒[15]。为了说明这个,论文中使用一个不同的4层金字塔({4×4, 3×3, 2×2, 1×1},供30个块)训练另一个ZF-5网络。这个网络有更少的参数,因为他的全连接层fc6有30×256维输入而不是36×256维。 网络的top-1/top-5错误率分别是35.06/14.04和50块的金字塔网络相近,明显好于非SPP基准网络(35.99/14.76)。
多尺度测试结果:
表2(c)展示了多尺寸训练的结果。训练尺寸是224和180,测试尺寸是224。我们还使用标准的10-view预测法。所有架构的top-1/top-5错误率进一步下降。SPP-net(Overfeat-7)的Top-1 错误率降到29.68%,比非SPP网络低了2.33%,比单尺寸训练降低了0.68%。
多视图:(可以应用于目标检测)
在测试阶段,我们调整图像的大小,使min(w; h)= s,其中s代表预定义比例(如256)。然后我们计算整个图像的卷积特征图。对于翻转视图的使用,我们还计算翻转图像的特征图。给定图像中的任何视图(窗口),我们将这个窗口到特征图(映射的方式在下面Spp层用于目标检测有写),然后使用SPP从这个窗口汇集特征。汇集的特征然后被馈送到fc层以计算该窗口的softmax分数。这些分数求平均可以得到最终预测值(每个视图通过softmax得到一组概率值,一幅图的所有view组概率值求平均,最大值为最终预测值。然后多测几组,最终计算top-1和top-5)。对于标准的10视图,我们使用s = 256,并且视图是224×224窗口,在角落或中心。实验表明,特征图上裁剪的10视图预测的top5 error与在图像上的原始10视图预测,误差在0.1%附近。
进一步应用这种方法从多个尺度中提取多个视图。我们将图像重新调整为六个规模{224, 256, 300, 360, 448, 560}(6种图像大小)并为每个比例计算整个图像的特征图。我们使用224×224作为任何比例的视图大小,因此对于不同比例,这些视图在原始图像上具有不同的相对大小。 我们对每个比例使用18个视图view:一个在中心,四个在角落,四个在每一侧的中间,有/没有翻转(当s = 224时,有6个不同的视图)。(因为存在翻转,所以view还要乘以2)
这96个视图的组合将top-5 error从10.95%减少到9.36%。 组合两个全图像视图(翻转)进一步将前5个错误减少到9.14%。96个视图可以结合是因为只是改变了分辨率,没改变图像内容,等效于同一张图中96个不同的视图。
结论:
多视图组合确实可以提高准确度。
Spp层用于目标检测:
只在整张图像上抽取一次特征。然后在每个特征图的候选窗口上应用空间金字塔池化,形成这个窗口的一个固定长度表示。因为只应用一次卷积网络,我们的方法快得多。
1、首先通过选择性搜索,对待检测的图片进行搜索出2000个候选窗口。(这一步和RCNN一样)
2、把整张待检测的图片,输入CNN中,进行一次性特征提取,得到特征图,然后在特征图中找到各个候选框的区域,再对各个候选框采用空间金字塔池化,提取出固定长度的特征向量。而R-CNN输入的是每个候选框,然后在进入CNN,因为SPP-Net只需要一次对整张图片进行特征提取,速度会大大提升。
3、最后一步,采用SVM算法进行特征向量分类识别。(后面的步骤也和RCNN类似)
对于从原始图到pool5输出的feature map的映射,论文中给出了一个公式:
假设(x’,y’)表示特征图上的坐标点,坐标点(x,y)表示原输入图片上的点,那么它们之间有如下转换关系,这种映射关心与网络结构有关:
( x , y ) = ( S ∗ x ’ , S ∗ y ’ ) (x,y)=(S*x’,S*y’)(x,y)=(S∗x’,S∗y’)
反过来,我们希望通过(x,y)坐标求解(x’,y’),那么计算公式如下:
Left、Top: x ′ = ⌊ x / S ⌋ + 1
Right、Bottom: x ′ = ⌈ x / S ⌉ − 1
其中S就是CNN中所有的strides的乘积,包含了池化、卷积的stride。
结论:
优点:
1、可以看出Sppnet增加了对输入尺寸的灵活性,输出固定长度的特征向量。
2、只需输入一张图像,节约了RCNN多次使用卷积层的耗时性。
不足:
1、但其余操作仍需分多步骤进行,也就是说,仍需要对全连接层的特征向量进行提取并保存在磁盘,然后用SVM去分类,最后还得需要bbox回归。这仍是需要去被改善的地方。
2、region propasal仍需要用选择性搜索去产生,耗时耗内存的问题仍未解决。
3、Fast-RCNN:2015
Backbone:从RCNN的Alexnet到VGG16,Conv5的输入feature map是7x7的
(VGG网络就不说了,没了解过的可以去看下VGG的基础Pytorch入门之CNN和七大CNN网络_Ton的博客-CSDN博客_cnn和pytorchVGG11部分)
从上图中我们可以看出
首先,和RCNN和Sppnet类似,Fast-RCNN对于region propasals的提取仍然是选择性搜索产生。然后和Sppnet一样,输入整张图像,节省重复卷积的时间,然后映射到feature map,接着利用rol pooling(Sppnet简化版本)产生固定长度的特征向量输出给FC层。最后同时进行softmax回归与bbox回归。
所以,可以说Fast-RCNN = RCNN + Sppnet。
具体的(见上图):(feature map向右那个是映射)
- 输入是224×224的固定大小图片;
- 经过5个卷积层+2个降采样层(分别跟在第一和第二个卷积层后面);
- 进入ROIPooling层(其输入是conv5层的输出和region proposal,region proposal个数大约为2000个);
- 再经过两个output都为4096维的全连接层;
- 分别经过output各为21和84维的全连接层(并列的,前者是分类输出,后者是回归输出);
- 最后接上两个损失层(分类是softmax函数,回归是smoothL1函数);
Roipooling层就是sppnet的一个核心思想体现出来的层,具体操作和Sppnet文章中的处理方式相同,或者可以直接看
ROI Pooling原理及实现_Elag的专栏-CSDN博客_roipooling。
预训练:
1、最后的最大池化层要替换成RoI池化层,配置的参数H和W要与网络的第一个全连接层相适应(eg,对于VGG16来说,就是H=W=7)。
2、网络的最后一个卷积层和softmax(1000路ImageNet分类)层要替换成两个并行的层。一个是全连接层并输出K+1路的softmax,一个是类别相关的约束框回归器。
3、网络修改为接受两个数据输入:一组图像和一组这些图像的RoI,即region propasal。
4、采用SGD,每个mini-batch包含2张图像和128个region proposal(即ROI,64个ROI/张,测试的时候还是2000),其中大约32个(16个/1张)的ROI和ground truth的IOU值大于0.5(即正样本),且只通过随机水平翻转进行数据增强。此时的样本有一个对应的Ground-truth bounding box与Ground-truth class label,其它的就作为背景样本。
5、网络的最终输出是针对每一个region proposal的。对于每一个region proposal会输出一个类别标签,就是这个region proposal框内框住的目标是属于什么类别,同时对每一个region proposal还进行边框回归,输出一个四维元组,即,代表预测输出的偏移量,而其对应的ground-truth bounding box的真实偏移量为,在进行边框回归的时候,利用smooth L1 loss计算回归损失。(关于t的计算和RCNN类似,X为conv5输出的feature map)。
多任务回归损失(Multi-task Loss)
1、回归的loss和R-CNN基本一样。
2、Fast R-CNN使用在微调期间学习的softmax分类器,而不是像在R-CNN和SPPnet中那样训练一对多线性SVM。为了理解这一选择的影响
3、为什么需要bbox回归:
4、总损失L中中括号含义:当u>1,输出1,否则输出0,规定当当前框属于背景,则为0,即背景不参与bbox回归。
如上所说,从region proposal映射到rol pooling输出,由于取整的问题,会造成feature map大小偏差。因此需要用回归器去学习这种偏差,预测出接近groundtruth的bbox。
总结:
优点:
1、Fast-RCNN是一个将特征提取,目标分类、候选框回归三部分可以同时进行的端到端(end-to-end)训练。
2、采用SCD分解加速FC层的计算。(本文没讲,详见论文)。
3、论文在回归问题上并没有用很常见的L2范数作为回归,而是使用smoothL1范数作为损失函数。
4、对于整张图像先提取了泛化特征,这样减少了大量的计算量。
不足:
1、仍然采用选择性搜索作为候选框提取的方式,耗时耗内存,生成一个候选框需要2-3秒。这也是后续Faster-RCNN的改进点。
4、RPN:伴随Faster-RCNN
Region Proposal Network,即提取候选框网络,专门用来提取候选框
上图为RPN的作用机制图,一个特征图经过sliding window处理,得到256维特征,然后通过两次全连接得到结果2k个分数和4k个坐标
1、RPN的输入特征图是最后一个卷积层输出的feature Map。
2、3x3的sliding window看作是对特征图做了一次3x3的卷积操作,最后得到了一个通道256的特征图,尺寸和feature map相同,我们假设是(256,H,W)。因此可以说RPN是个窗口固定的滑动检测器。
3、把这个特征图看作有H x W个向量,每个向量是256维(这是第二次这么去看特征向量了,第一次在Sppnet中形成固定长度向量),那么图中的256维指的就是其中一个向量,然后我们要对每个特征向量做两次全连接操作,一个得到2个分数,一个得到4个坐标,由于我们要对每个向量做同样的全连接操作,等同于对整个特征图做两次1 x 1的卷积,得到一个2 x H x W和一个4 x H x W大小的特征图,换句话说,有H x W个结果,每个结果包含2个分数和4个坐标。1*1卷积大多都是为了改变通道。
4、2个分数,即物体为前景的分数、物体为背景的分数。
5、4个原图坐标。代表anchor boxes在原图中左上角和右下角坐标。首先我们知道有H x W个结果,我们随机取一点,它跟原图肯定是有个一一映射关系的,由于原图和特征图大小不同,所以特征图上的一个点对应原图肯定是一个框,然而这个框很小,比如说8 x 8,这里8是指原图和特征图的比例,所以这个并不是我们想要的框,那我们不妨把框的左上角或者框的中心作为锚点(Anchor),然后想象出一堆框有K个,这也就是图中所说的K个anchor boxes(由锚点产生的K个框);换句话说,H x W个点,每个点对应原图有K个框,那么就有H x W x k个框默默的在原图上,那RPN的结果其实就是判断这些框是不是物体以及他们的偏移;那么K个框到底有多大,长宽比是多少?这里是预先设定好的,共有9种组合,所以k等于9,最后我们的结果是针对这9种组合的,所以有H x W x 9个结果,也就是18个分数和36个坐标;9个矩形共3种比例1:1、1:2、2:1。
anchor boxes如下:
例子:VGG16网络,S=16,对于原图为800*600的大小,求一共多少个anchor boxes?
(800/16)*(600/16)* 9 = 50 * 38 * 9 = 17100个。
效果如下图:
总结:
1、RPN网络将输入的feature map 转为一大堆在原图上的anchor boxes。
2、基于锚框的检测器由于大的步伐导致低召回率:最终结果只可能来自于anchor,如果anchor铺设得太稀了,就有可能anchor就没有把那个物体overlap到,那么最终的结果也不可能出现那个物体了,所以recall就一定会变低。
继续解释下这段话,导致anchor变稀的主要原因是stride太大,stride太大可以从2方面去理解,第一个,卷积层对feature map的缩放力度(stride)太大了,导致最后提取anchor的那个feature map太小,这样的话,点就太少了,映射到原图的anchor自然就少了。第二个理解就是,还记得RPN网络中选点的时候是基于那个3*3的滑动窗口吗,如果滑动的stride太大的话,选的点自然就少了,这样映射回原图的anchor自然就稀疏了。
第二个recall的降低,通俗的讲就是漏掉了很多anchor。具体的,首先要知道recall是怎么算的,在基于anchor的算法中,将anchor与GT的IOU>0.7为正样本(即含有物体),小于0.3为负样本(背景),然后通过卷积层,产生分数,然后送到RPN网络的softmax做训练。训练的结果就是学习到对于正样本(IOU>0.7)其作为物体的分数就会打的很高,作为背景的分数打的很低。那么当一个小物体的anchor测试送入网络的时候,由于其IOU很小,所以softmax会判定为负样本(背景),而实际上他是个包含物体的,recall公式中的分母是真实的正例总数,分子式判定为正例个数,显然漏掉了小物体,自然recall下降。知道了原理后,我们来看当anchor稀疏的时候,将测试图片的anchor送入RPN检测,分母还是那个图片中的真实应该很有物体的anchor总数,但实际预测出来为正例的个数显然漏掉了很多因为稀疏导致没有被anchor框定的物体,所以其recall肯定很低,也就是说其recall很低是因为漏掉了很多应该判定为正例的anchor。
5、Faster-RCNN:2016.01.06
Faster-RCNN = Fast-RCNN + RPN
Faster-RCNN分5块
1、卷积池化层。对于任意一幅P*Q的图像,首先进行resize成大小为M*N,然后进行卷积池化。
note:1、生成的feature map被RPN层和Rol pooling层共享。
2、所有的conv层都是:kernel_size=3,pad=1,stride=1,所有的pooling层都是:kernel_size=2,pad=0,stride=2,这意味着经过这20层后,图片大小成(M/16)*(N/16)。
2、RPN:用于生成较精确度region proposal
如上图所示,
RPN首先将共享的feature map进行滑动窗口3*3的卷积(可能是更加鲁棒和改变通道)。然后每个点在原图产生以这个点映射回原图形成的框为中心的9个anchor boxes,anchor boxes有2种分数4种坐标。
接下来分2路分析:
第一路:分数分别是某个anchor box是物体(正例)的分数和是背景(反例)的分数(经过softmax输出的概率叫分类置信度),分数保存在经过1*1卷积(为了改变通道)后的(9*2,M/16,N/16)feature map中。然后经过softmax回归去二分类产生positive和negative。至此初步提取出positive anchors作为候选区域。
第二路:4个坐标值(x1,y1,x2,y2)分别为anchor box左上角和右下角的坐标,保存在经过1*1卷积(为了改变通道)后的(9*4,M/16,N/16)feature map中。然后进行bbox回归去修正anchor box的位置。
note:1、Faster-RCNN共有2次bbox回归去修正候选框的位置,这是第一次。
2、关于分数,训练的时候将anchor box与ground truth的IOU>0.7为正例,小于0.3为反例,随机选取128个postive anchors+128个negative anchors。这些anchor进过卷积池化会产生2个学习而来的分数,当训练完成时候,作为物体的分数会打一个较高的分数;而作为背景的分数,则会打的很低。(想不通的时候想想用1个FC层区做10分类,分数就是FC输出产生的,是一步步学习而来的。)
3、关于bbox回归,和上述RCNN、Fast-RCNN中的bbox回归一模一样。采用多任务损失函数
从上图可看出,对于softmax判定出来的反例(背景)是不参与bbox回归修正的。
对于Y=WX,这里的X是每个anchor对应的feature map。其次窗口的位置定义是(x,y,w,h),分别是中心点坐标、框宽、框高,和anchor初始的位置定义不一样的(但问题不大)。输入是anchor对应的feature map,监督信号是Anchor与GT的偏移大小。即训练目标是:输入feature map的情况下使网络输出与监督信号尽可能接近。那么当bouding box regression工作时,再输入feature map时,回归网络分支的输出就是每个Anchor的偏移量,显然即可用来修正Anchor位置了。
由此第一阶段的训练完成了,接下去就是通过proposal layer去滤除多余的框。
3、proposal layer:属于后处理阶段
Proposal Layer负责综合所有 偏移量和positive anchors,计算出精准的proposal,送入后续RoI Pooling Layer。同时剔除太小和超出边界的proposals,最后以分类置信度为指标进行NMS。还有一个输入是im_info,对于一副任意大小PxQ图像,传入Faster -RCNN前首先reshape到固定MxN,im_info=[M, N, scale_factor]则保存了此次缩放的所有信息。然后经过卷积池化变为(M/16)x(N/16)大小,其中feature_stride=16则保存了该信息,用于计算anchor偏移量。
具体的:(测试)
1、生成anchors,对所有的anchors做bbox regression回归(这里的anchors生成和训练时完全一致)。
2、按照输入的positive softmax scores(分类置信度)由大到小排序anchors,提取前pre_nms_topN(e.g. 6000)个anchors,即提取修正位置后的positive anchors。
3、限定超出图像边界的positive anchors为图像边界,防止后续roi pooling时proposal超出图像边界。
4、剔除尺寸非常小的positive anchors。
5、对剩余的positive anchors进行NMS。
4、Rol pooling层
其有2个输入,一个是卷积池化后的feature map,另一个是尺寸不一的精准框。是上述Sppnet的简化版本,对每个不同大小精准的proposal产生固定长度的特征向量,送入FC层。
由于propasal层输出的精准框是M*N原图尺度下的,故需要feature_stride将其转为(M/feature_stride)*(n/feature_stride),其中feature_stride为16。然后对每一个映射来的proposal进行空间金字塔池化形成固定长度的向量。由于又映射回来,故这是个典型的two-stage。
5、分类回归
利用已经获得的proposal feature maps,通过full connect层与softmax计算每个proposal具体属于那个类别(如人,车,电视等),输出cls_prob概率向量;同时再次利用bounding box regression获得每个proposal的位置偏移量bbox_pred,用于回归更加精确的目标检测框。
由此,第二阶段的训练完成了。
训练过程:
直接给出大佬的画的一张图:
如上图,总的来说,先采用在ImageNet训练好的VGG16作为预训练模型去训练RPN,只需要让RPN之前的网络的required_grad=False,或者把RPN、FasterRCNN共享的那些卷积层的lr=0。
RPN训练过程:
1、在原图上生产anchor boxes。以anchor和GT的IOU>0.7为正例(含有物体),IOU<0.3为反例(背景),作为训练样本。随机选取128个postive anchors+128个negative anchors。(训练所有的话,anchor太多了!)。对于分类这一路,输入特征为每个anchor的2个分数,作为物体的分数和作为背景的分数,监督标志为positive/negetive。对于线性回归这一路,输入为每个anchor对应的feature map,监督标志为原图中GT与anchor的偏移量,输出为预测的偏移量。
整个RPN采用多任务Loss:
1、上述公式中i表示anchors index,Pi表示positive softmax probability,Pi*代表对应的GT predict概率(即当第i个anchor与GT间IoU>0.7,认为是该anchor是positive,Pi*=1;反之IoU<0.3时,认为是该anchor是negative,Pi*=0。至于那些0.3<IoU<0.7的anchor则不参与训练)。
2、注意到回归任务中有Pi*,故对于背景,不需要参与bbox回归。
3、和RCNN、Fast-RCNN一样,回归损失采用smoothL1损失。
2、利用训练好的RPN生成region proposal,同时获取positive softmax probability。
3、第一次训练Faster-RCNN。将精确的proposal和positive softmax probability输入最后的softmax进行分类。具体的如上图所示,proposal经过rol pooling提取固定长度的特征向量,通过FC6、FC7层、输出为2个神经元的FC层最终产生一个分数,输入给softmax进行分类,监督信号是GT的标签labels(如猫、狗、飞机......)。对于线性回归,proposal通过FC6、FC7层、输出为84个神经元的FC层转为一个特征向量,作为回归问题的X。监督信号仍是GT与proposal的偏移量,输出是原图中GT与proposal预测偏移量。
其余均和和RPN训练一样。
4、重复1、2、3。论文中,完成这一个stage后便是完成了训练。
优点:
1、采用RPN网络提取region proposal,极大的减少了了模型训练时间。
2、文中对分类与回归进行了2次,使得准确率得到了增强。
缺点:
1、由于通常得到的feature map的stride比较大,所以得到的anchor会比较稀疏,会降低recall。
2、由于采用单一尺度的feature去是生成anchor,故对小物体会缺乏表现力,即会无法识别出小物体。
3、Rol pooling层的量化方式会引入误差,就是当ROl映射回的的特征图除不尽分bin的尺寸时候,往往将左上角向下取整,右下角向上取整,后续的Mask-RCNN会提出Rol Align的池化方式对Rol pooling进行改进。
6、FPN:2017.4.19
利用特征的四种方式:
1、图像金字塔法
将图像做成不同的scale,然后不同scale的图像生成对应的不同scale的特征。这种方法的缺点在于增加了时间成本。有些算法会在测试时候采用图像金字塔。
2、采用FC层前,卷积层之后的那层feature map,代表算法有RCNN、FastRCNN、FasterRCNN、Sppnet
3、多尺度特征融合
从网络不同层抽取不同尺度的特征做预测,这种方式不会增加额外的计算量。FPN作者认为SSD算法中没有用到足够低层的特征(在SSD中,最低层的特征是VGG网络的conv4_3),而在作者看来足够低层的特征对于检测小物体是很有帮助的。
4、FPN
与SSD不同,FPN增加了上采样过程,然后会与低层特征进行融合
现在来介绍FPN
如图所示
step1:首先以Resnet为Backbone,自底向上生成各个尺度的feature map。这个过程中抽取的特征图为每个下一层即将改变尺寸的卷积层,称为1个stage。
step2:上采样,目的是为了获取与上个stage相同的尺寸,但上采样会带来混叠效应。
step3:融合。首先上一个stage需要通过1*1的卷积去改变通道大小成当前即将与之融合的feature map。融合后,融合图需要再经过1个3*3的卷积来消除上采样点混叠效应(这里的融合是通道上的堆叠)。
FPN+RPN
FPN没出来之前,RPN的输入是来自于最后一层卷积层的feature map。FPN出来后,RPN的输入来自FPN产生的各个stage融合后的feature map。
原文中一共有5个stage,作者用了后四个stage,记C2、C3、C4、C5,相应融合后的记为P2、P3、P4、P5,不用conv1是因为它太大,会占用许多内存。
将单个尺度的anchor分配个每一个stage,即在每一个scale层,都定义了不同大小的anchor,对于P2,P3,P4,P5,P6这些层,定义anchor的大小为32^2,64^2,128^2,256^2,512^2,另外每个scale层都有3个长宽对比度:1:2,1:1,2:1。所以整个特征金字塔有15种anchor。
note:为什么要基于anchor的算法以这种标准去分配呢?
1、低层感受野小,位置信息准确,能捕捉到精细的目标,但是对于大物体,其感受能力不足。所以高分辨率(低层)适合检测小物体,因此分配最小的anchor box。
2、原图中通过卷积下采样到低分辨率层(高层)的时候,一些小物体可能已经看不到了(这个通过Spp那片论文的实物图也可以看出)。所以低分辨率适合检测大物体,所以会分配大的anchor box给他。
对每一个stage,如果其中某一个anchor和groundtrue的IOU>0.7,则为正样本,IOU<0.3,则为负样本,中间的都舍弃不考虑。
加入FPN后的RPN的AR提升明显:(数据来源于coco)
note:AR(平均召回率)右上角的100表示每张图像有100个anchor,AR的右下角s,m,l表示COCO数据集中object的大小分别是小,中,大。feature列的大括号{}表示每层独立预测。
note:召回率的定义是在正例中,预测为正例的比例。RPN的输出为物体(注意是物体,而不是具体到哪个物体 )以及包围物体的较精准的proposal。因此正例就是含物体的图片,预测为正例就是RPN输出了正确的结果。
结论:
从(a)(b)(c)的对比可以看出FPN的作用确实很明显。另外(a)和(b)的对比可以看出高层特征并非比低一层的特征有效,对大中小物体的识别都有提升,最重要的是FPN对小物体的框定特别明显。(如a、b所示,一般很小的物体,其与GT的IOU会很低,故其作为物体的分数会很低,作为背景的分数会很高,因此会被分类为背景,所以RPN的输出自然就没用这个物体了,就会造成召回率降低。)
d)表示只有横向连接,而没有自顶向下的过程(如上图),也就是仅仅对自底向上(bottom-up)的每一层结果做一个1*1的横向连接和3*3的卷积得到最终的结果。从feature列可以看出预测还是分层独立的。作者推测(d)的结果并不好的原因在于在自底向上的不同层之间的语义间隔比较大。
博主认为,如果没有自顶向下的过程,那么低层的feature map就无法得到语义信息,或者说无法物体拥有更抽象的信息,而在做bbox回归的时候,输入的X正是feature map,由于特征中无法捕获物体的一些抽象的信息,故回归的时候,就无法预测的很准确,有时候甚至会和GT有较大的差距(因此Faster-RCNN才会有第二次bbox回归去修正)。
(e)表示有自顶向下的过程,但是没有横向连接,即向下过程没有融合原来的特征。这样效果也不好的原因在于目标的location特征在经过多次降采样和上采样过程后变得更加不准确。
f)采用finest level层做预测(看上图),即经过多次特征上采样和融合到最后一步生成的特征用于预测,主要是证明金字塔分层独立预测的表达能力。显然finest level的效果不如FPN好,原因在于RPN网络是一个窗口大小固定的滑动窗口检测器,因此在金字塔的不同层滑动可以增加其对尺度变化的鲁棒性。另外(f)有更多的anchor,说明增加anchor的数量并不能有效提高准确率。
FPN与Fast-RCNN、Faster-RCNN
结论:
基于区域的目标卷积问题中,特征金字塔比单尺度特征更有效。
FPN架构与Fasterrcnn的结合:
结论:
在小物体检测上的提升是比较明显的。
总结:
1、FPN算法同时利用低层特征高分辨率和高层特征的高语义信息,通过融合这些不同层的特征达到预测的效果。
2、预测是在每个融合后的特征层上单独进行的。
3、FPN用在网络用于提升获取region proposal的准确率,尤其对于小物体的框定。因为小物体本身具有的像素信息较少,在下采样的过程中极易被丢失,而处理这种物体大小差异十分明显的检测问题,需要加入FPN。
7、Resnet:2015.12.10
参考Pytorch入门之CNN和七大CNN网络_Ton的博客-CSDN博客_cnn和pytorch Resnet部分
8、FCN:2015.3.8
FCN特点:(用于语义分割而不是检测)
1、不含全连接层,全部为卷积层,可以适应任何尺寸的输入。如上图所示,FCN将传统CNN中的全连接层转化成一个个的卷积层。在传统的CNN结构中,前5层是卷积层,第6层和第7层分别是一个长度为4096的一维向量,第8层是长度为1000的一维向量,分别对应1000个类别的概率。FCN将这3层表示为卷积层,卷积核的大小(通道数,宽,高)分别为(4096,7,7)、(4096,1,1)、(1000,1,1)。所有的层都是卷积层,故称为全卷积网络。
2、采用反卷积层进行扩大特征图尺寸至输入尺寸。
3、如上图所示,采用跳级结构融合不同特征级的feature map。FCN-32s表示上采样的步长stride为32。融合的好处:能够更好地预测细节,同时保留高级别的语义信息。
注意:
1、由此FPN就产生了。
2、融合是通道数的堆叠,或者是同一个feature map上的加权相加。可以通过1个3*3的卷积去消除上采样带来的混叠以及改变通道。
4、损失函数是在最后一层的 spatial map上的 pixel 的 loss 和,在每一个 pixel 使用 softmax loss 。
对于扩大图片尺寸
1、上采样
最近邻插值(也可以作为上采样的方法):参考最近邻插值、双线性插值、双三次插值_CSDN1HAO的博客-CSDN博客_双三次插值
2、上池化:
注意位置信息,上池化是要保护原始位置的。 这也是它与上采样的不同。
3、反卷积(转置卷积):
反卷积的另一种,在相邻特征间增加1个空格,
详见FCN于反卷积(Deconvolution)、上采样(UpSampling)_skyfengye的博客-CSDN博客_上采样层 最后2个。
测试:
下图是整个FCN网络的结构图:backbone->VGG16
总体过程:以最后一层为例,将16*16*4096的feature map通过1*1卷积成16*16*21(VOC数据集共21类) ,然后进行升采样至原图大小,这个时候图像为500*500个点,每个点为21维(即21张图),逐个对每个点进行softmax prediction,在21张图像该像素位置的最大概率作为该像素的分类。
具体的,
1、16*16*4096的feature map通过1*1卷积成16*16*21(VOC数据集共21类),然后进行2倍升采样至34*34*21。
2、另一边,pool4经过1*1卷积,crop之后的feature map和1中的feature map两者相互融合,接着进行升采样成70*70*21。
3、同理,pool3经过1*1卷积,crop之后feature map和2上采样后的的feature map相互融合,接着进行升采样成568*568*21。
4、最后进行裁剪至和原图一样的尺寸500*500*21。
5、对一个像素点进行softmax prediction,每个点概率最大的为预测的分类。
训练:
第1阶段
微调:将在ImageNet数据集中训练的网络参数初始化FCN网络的参数,不使用红色部分的参数。
第2阶段:FCN-32s
输入图像大小为500*500*3,卷积网络阶段获得的特征图为16*16*21;然后反卷积运算的步长为32,成500*500*21,对每个点做softmax回归并计算损失,Loss为所有点的损失之和。
这一阶段使用单GPU训练约需3天。
第3阶段:FCN-16s
输入图像大小为500*500*3,卷积网络阶段获得的特征图为16*16*21;然后第一次反卷积运算的步长为2获得34*34*21的特征图,并将其与pool4的特征图进行连接;最后进行第二次反卷积运算,步长为16,生成500*500*21,对每个点做softmax预测,并计算损失,Loss为所有点的损失之和。
这一阶段使用单GPU训练约需1天。
第4阶段:FCN-8s
输入图像大小为500*500*3,卷积网络阶段获得的特征图为16*16*21;然后第一次反卷积运算的步长为2获得34*34*21的特征图,并将其与pool4的特征图进行连接;接着进行第二次反卷积运算,步长为2获得70*70*21的特征图,并将其与pool3的特征图进行连接;最后进行第三次反卷积运算,步长为8,生成500*500*21的特征图,对每个点做softmax预测,并计算损失,Loss为所有点的损失之和。
这一阶段使用单GPU训练约需1天。
总结:
较浅层的预测结果包含了更多细节信息。比较2,3,4阶段可以看出,跳级结构利用浅层信息辅助逐步升采样,有更精细的结果。
作者在原文种给出3种网络结果对比(如上图),明显可以看出效果:FCN-32s < FCN-16s < FCN-8s,即使用多层feature融合有利于提高分割准确性。
9、FCOS:2019.8.20
什么是FSOC?
1、基于anchor-free的单阶段目标检测算法。
2、基于FCN的逐像素目标检测算法,实现了无锚点(anchor-free)、无提议(proposal free)的解决方案,并且提出了中心度(Center—ness)的思想,同时在召回率等方面表现接近甚至超过目前很多先进主流的基于锚框目标检测算法。
3、FCOS直接对feature map中每个位置对应原图的边框都进行回归,换句话说FCOS直接把每个位置都作为训练样本,这一点和FCN用于语义分割时逐像素进行softmax回归预测类似。
4、FCOS可以使用的正样本的数量就会很多了,相比较于基于anchor的方法,这或许也是该方法取得较好的效果的原因。
Object detection是计算机视觉的一个重要的分支,其解决的问题是在一张图像中,找到图像中的目标并给出目标的类别以及坐标框,过去几年,Object detection取得了可喜的成果,很多的算法被提出,目标检测的精度也越来越高,这其中就包括:Faster RCNN,SSD,YOLO v2,v3等,这些方法有一个共同的特点,就是都是基于anchor的,可以说,过去几年,anchor是目标检测算法的灵魂,但是基于anchor的算法同样面临着几个问题
1、检测表现效果对于锚框的尺寸、长宽比、数目非常敏感,因此锚框相关的超参数需要仔细的调节。
2、锚框的尺寸和长宽比是固定的,因此,检测器在处理形变较大的候选对象时比较困难,尤其是对于小目标。预先定义的锚框还限制了检测器的泛化能力,因为,它们需要针对不同对象大小或长宽比进行设计。
3、为了提高召回率,需要在图像上放置密集的锚框。而这些锚框大多数属于负样本,这样造成了正负样本之间的不均衡。
4、大量的锚框增加了在计算交并比时计算量和内存占用。
下图是实现FSOC的总体框架图:
1、一般backbone采用Resnet50。
2、引入FPN网络。
3、共享头网络的三分支:输出为80的分类器(coco数据集80个类),输出为4的回归,输出为1的Center-ness回归。
具体解析:
1、feature map中的每个点映射到原图中,FCOS算法feature map中位置与原图对应的关系,如果feature map中位置为(x,y) ,映射到输入图像的位置是。若这个点在已标注的bbox内,则这个点为正样本(含有物体),它的类别标记为这个真实边框的类别。否则为反例(背景)。
note:关于这个映射,得看具体问题,如RPN中,高层的点映射会原图是个块,Spp中原图中的ROI映射回高层的feature map也是个块,而这里根据公式,是高层的点映射回原图也是个点。(不管如何,都会引入量化误差)
如上图所示,不同尺度的目标,在不同的特征层下特征保留的最好,因此引入FPN,进行分层检测,不同尺寸的目标用不同层去处理。FPN的引入可以解决物体重叠带来的重叠物体漏检问题,从而降低recall。换句话说,如果一个位置在多个BB的内部的话,我们将其看成一个模糊样本,即不知道该去回归哪个框。针对这样样论文中采样的方法是直接选择择面积最小的边界框作为其回归目标。这是为什么呢?由于网络中FPN的存在,FPN会利用其低层去选择回归重叠的那个小框,利用高层去回归重叠的那个大框,因此就几乎不存在模糊样本的问题。由于这里使用的是共享头,但是不同的layer回归的尺度是不一样的,如果都使用相同的标准不太合理,所以这里作者使用了exp(sx)对边界框的回归进行处理,增加了一个比例调节因子s,这样就可以调节它的回归尺度了,比如前面层回归小一些,后面层回归大一些。
note:
1、关于基于anchor的算法中,是利用anchor的尺度将目标分到不同的FPN层中;而本论文的是利用l、r、t、b的最大值将不同尺寸的物体分配到不同的FPN层中,例如低层只会去找max(l,r, t,b)在[0,20]之间的目标,因为目标尺寸较小,适合低层去感受[64,100]的目标是大物体,所以高层会去找这样的目标。max(lrtb的做法)这和设置不同大小的anchor是一个道理。
2、但是如果重叠的物体大小差不多,那FPN也是没用的吧,所以只是能起到减少的作用。
2、如果这个位置(x,y)和一个BB关联的话,该位置处的训练回归目标可制定为:其中(x0,y0)和(x1,y1)分别表示BB的左上角和右下角坐标值。
为了克服有些低质量的框的中心远离实际目标的中心,作者引入中心度指标:
离目标中心越近,输出值越大,反之越小,这里作者的实现方式很简单,就是增加了一个1维的分类层的分支,上面的图可以看到,可见最中心的点的centerness为1,距离越远的点,centerness的值越小。其实本质就是四块面积中最小面积/四块面积中最大面积面积。
作者观察到FCOS会引入一些低质量的BB,即远离目标中心的BB,而Center-ness的作用就是用来很好的抑制这些低质量的BB的产生。它可以用来降低距离对象中心很远的边界框分数的权重,可以被看做是一个软阈值,可以在网络训练的过程中学习得到,不需要进行调节。将预测的中心度与相应的分类分数相乘,计算最终得分(用于对检测到的边界框进行排序)。因此,中心度可以降低远离对象中心的边界框的权重。这些低质量边界框很可能被最终的NMS滤除,从而显着提高了检测性能。
3、头网络的最终输出是分类(属于哪一类)、中心度(中心度的预测值)、4个回归值。FCOS训练80个二元分类器。
目标同样包括两个部分:位置和类别。分类分支通过卷积,输出是80维的向量,代表的是80个类别,并且80个类别接的是sigmoid,检测分支输出的4维的向量,分别对应点到上下左右边的距离。
note:
中心度为什么要算预测值呢?是因为测试的时候,是没有GT的,需要去预测一个中心度的值,这点和iou-net中“预测的iou”很像。
Loss:
分类器采用sigmoid+Focal_loss。
回归器采用IOU_loss。
中心度采用BCE_loss:
4、在训练阶段,文中使用ResNet-50作为backbone网络,使用SGD优化器,初始学习率为0.01,batch_size=16,在迭代60K和80K时的weight_decay分别为0.0001和0.9,使用ImagNet预训练权重进行初始化,将输入图片裁剪为短边不小于800,长边不小于1333大小。整个网络是在COCO数据集上面训练得到的。
note:文中定义了一个BPR(best possible recall):upper bound of the recall rate that a detector can achieve.应该就是最大召回率。
整理一些第一次看后的问题:
一:FSOC中对于中心度center-ness会抑制一些低质量的框,这个低质量的框是咋样的啊,我感觉不管中心点在物体的哪一部分,都可以回归出bbox吧?
答:
1、通常边上的像素点回归效果会差一些。因为他们要回归的中心偏差相对更大,而中心附近的点他们中心偏差较小,回归起来更容易。
2、并且他们所处的位置通常不能获得物体的全貌,即边上的像素掌握物体的能力不如中心点像素(如物体尺寸、位置),中心点像素相对边上的像素对物体能有更好的表示。因为回归效果差,所以会直接导致回归出来的框往往偏离GT,两者IOU很小,也就是低质量的框。
二:做bbox回归和中心度回归的时候,监督信号和输入分别是什么?
监督信号:四个值lrbt。输入:FPN feature map1*1*C的张量。
监督信号:通过公式计算出来的值。输入:FPN feature map1*1*C的张量。
三:centeress是如何训练的?2020.10.18
之所以不理解,是因为当时将NMS也考虑在训练过程中了,NMS是一个在整个训练结束或者一个阶段训练结束后,用于滤除多余框的(否则NMS不就会有反向传播算法了吗)。中心度的训练很简单,目的是训练之后产生一个预测的中心度值。(有人会说为什么要预测呢?直接计算不就行了。和iou-net中预测iou一样,测试的时候由于没有GT,所以你怎么计算呢?)监督信号:通过公式计算出来的值。输入:FPN feature map1*1*C的张量。这就是他的训练过程,可以用MSE做目标函数并加入到分类和回归的多任务损失函数中。而真正使用中心度的是在测试的时候,结合NMS去滤除多余的框。 2020.10.25
10、IOUnet:2018.7.30
用于启迪的第一篇:IoU-Net原理 - 知乎
代码链接:https://github.com/vacancy/PreciseRoIPooling (PreciseRoIPooling部分)
读完第一篇再读第二篇就可以加深理解了:IOU-Net 算法笔记_AI之路-CSDN博客_iounet
附:
还有一种更好的方案,就是将bbox回归出来的ROI和GT的IoU作为监督信息训练iou分支网络。因为这个预测的iou更加接近GT,可以加快后续Iou对bbox的回归。
补充点:
与GT最接近的anchor,不一定有最高的分类置信度。
为了得到最准确的回归结果,bbox通常会反复进行,但最多不要超过2次。 Cascade RCNN和iou-net都以证明,但是用optimizer-based可以多次迭代。
皮尔逊相关系数,用于表征2个变量的线性相关性。
文中出现的:
Cascade RCNN
主要是为了提出bbox回归反复迭代的无效性,这在iounet中也证明了。
Mask RCNN
主要是为了提出ROI pooling的改进版本 ROI Align版本
11、RetinaNet
论文阅读: RetinaNet_JNing-CSDN博客_retinanet论文
主要贡献:提出one-stage的识别精度比two-stage低的原因是类别不平衡,负样本太多,正样本太少。two-stage可以通过,例如FasterRCNN可以通过初始选择1:3的样本去大幅削减负样本,然后RPN那里又可以通过分类置信度继续削减负样本。
one-stage想要提升mAP就得使用Focal-loss,去改变类别不平衡问题。
关于focal loss,链接里有写。接下里写一点个人理解(别人的说法太抽象)
1、为什么大量负样本,少量正样本是不好的?
首先需要明确一点:不存在的样本起loss为0.
以一个极端的点的,负样本1000个,正样本1个,那么在计算loss的时候,正样本的loss贡献相对太小了,可以直接忽略,因此正样本相当于不存在。那么整个训练过程相当于只有在训练负样本。那么最后的结果就是系统对任意输入的负样本判断的很准,但由于没有“见过”正样本,因此对正样本点inference效果是很差的。
2、为什么要削弱大量简单样本?
大量的简单的(或易于判断的)样本,其总体的loss是很大的,因为样本太多了。但是把每个样本单独看,其loss在log函数中区域平坦,因此难以继续优化,或者说继续优化下去也没什么名堂。
3、为什么通过给简单样本施加小的权重,会改善性能?
给简单样本的loss前加一个极小的的权重,虽然正负样本加起来都总体loss下降了,但是仔细想,简单样本的loss很小,可以忽略不计,那么简单样本就相当于没有。留下的是那些难以区分的困难样本。那么分类器的任务单纯只是去优化这些困难样本的loss了,困难样本单个来看梯度值都很大,易于优化,最后会使得分类器对困难样本的泛化性能更好。
4、为什么可以用单独样本去理解上面的问题?
二元交叉熵损失函数的loss是由每个样本的单独loss叠加产生的,那么求导的时候,自然可以拆成每个样本的loss求导,然后再求和。
这个结构要注意几点:
- 训练时FPN每一级的所有example都被用于计算Focal Loss,loss值加到一起用来训练;
- 测试时FPN每一级只选取score最大的1000个example来做nms;
- 整个结构不同层的head部分(图2的c和d部分)共享参数,但分类和回归分支间的参数不共享
- 分类分支的最后一级卷积的bias初始化成特殊值。在训练初始阶段因为positivie和negative的分类概率基本一致,会造成公式1起不到抑制easy example的作用,为了打破这种情况,作者对最后一级用于分类的卷积的bias作了下小修改,把它初始化成一个特殊的值 。 在论文中取 ,pi为0.01.这样做能在训练初始阶段提高positive的分类概率。
第4点还是不是很明白
anchor-based分为one-stage和two-stage,Retinanet是属于one-stage的anchor-based。区分几阶
的关键:目标检测之one-stage和two-stage网络的区别_weixin_33602281的博客-CSDN博客_one-stage和two-stage的区别
12、CenterNet(Objects as Points)
扔掉anchor!真正的CenterNet——Objects as Points论文解读 - 知乎
加个图,助于理解:
13、ATSS
【论文笔记】:ATSS_Activewaste-CSDN博客_atss
Retina提出的是影响one-stage和two-stage性能的主要是正负样本的失衡。
ATSS提出的是影响Anchor-based和Anchor-free性能主要是选择正负样本的方式。
13、GAN(生成对抗网络)
对抗体现在哪:
1、生成器努力生成图片,骗过鉴别器。
2、鉴别器努力去鉴别真伪。
目标函数:
,把整个max看成真实样本和的差异,那么就是最小化真实样本和生成差异。目标函数可化成 min L,固定住thelt g,这是一个鉴别器生成生成器的,去减小真是样本和生成样本的差异。