
使用的网络是VGG16:注意:RPN输出的回归层是9个单独的回归器 的集合,就是说这9个包围盒回归器不共享权重,每个回归器负责一种尺度和长宽比(和相应的anchor比例基本相同)。假设有anchor(大小为 ,长宽比为1:1,1:2,2:1),则可能包围盒回归器 负责预测 ,一个回归器对应一种anchor,其余每个回归器各负责一种尺度和长宽比。
对卷积特征图使用3*3的滑窗,然后经过卷积输出512维的向量,接着输出二分类的分数和9个回归器的值(每个回归器4个值)会思考3*3的滑窗怎么能有这么多的输出?既有分类的分数还有4*9个回归值解释是:3*3对应原图的区域有228个pixels,输出有512个通道,3*3*512这些值足够还原并表现出原图该区域中的所有特征,由于RPN中小网络的卷积核是3*3*512,就是全连接,全连接的权重有3*3*512*512个,只要其中某些权重值设置得当,那么就可以输出原图该区域的所有特征,包括各种检测类的位置,分类分数等。在原图生成anchor的目的是什么?要知道,训练RPN网络是有监督训练,需要有数据、还要有相应的类标签,输入小网络的是512个通道的3*3滑窗,类标签没有给定,没有类标签就无法计算Loss损失函数,无法训练网络。以3*3滑窗中心对应原图的位置作为中心点,在原图生成9个不同尺度长宽比的anchor,然后每个anchor都会被分配到相应的类标签,有正样本(1)、负样本(0),也有不参与训练的框(not used),对正样本计算 ,就是回归的类标签,负样本不计算回归loss。0,1是二分类的标签。所以在原图生成anchor的目的之一是得到类标签。这里只得到了分类的标签(0,1),还有正样本的回归标签需要确定,该正样本的回归标签是其对应的ground truth计算出来的 。负样本不计算回归损失没有回归标签。
另外的目的就是为了解决多尺度和长宽比的问题anchor是怎么解决多尺度和长宽比的问题?一个回归器对应一种anchor,每个正样本anchor对应的ground truth,打上回归的标签,交给该anchor对应的回归器预测。anchor生成好以后,回归器对应的正样本标签就确定好的。anchor的大小为 ,长宽比为1:1,1:2,2:1,对一个3*3的滑动窗口,其中心在原图的位置生成9个anchor,每个anchor都根据IoU划分正、负、不参与训练的标签,anchor G()被划分为正样本的时候有对应的ground truth G,那么这个anchor G()和ground truth G就联系在一起。9个回归器中负责预测的回归器就负责预测ground truth G。也就是说 用于负责预测的回归器计算回归Loss。如果一个mini-batch中所有的ground truth对应的正样本anchor是 、 、 ,没有其余的尺寸。那么9个回归器中只有3个起作用,其余6个回归器的损失值为0。计算回归loss的时候只计算起作用的3个。就是说不是所有的anchor都有作用(看检测的物体)。正样本anchor对应的ground truth,由和anchor相同大小长宽比的回归器预测该ground truth
在原图怎么生成anchor?3*3滑窗的中心点对应原图的位置就是anchor的中心点,两者的中心点重合,然后就可以推导出原图中9个不同尺度和长宽比锚的坐标。anchor起作用的地方:3*3的滑窗生成对应原图的9个anchor,然后对9个anchor计算IoU,分配标签,正样本的anchor还要和对应的ground truth联系起来,对每个正样本anchor对应的ground truth,打上标签,交给该anchor对应的回归器预测。正样本anchor的大小长宽比被用来确定预测相应ground truth用哪个回归器。9个回归器并不是都起作用的(看检测的物体)。由于回归器和锚一一对应,就是说不是所有的anchor都有作用。如何确保不同回归器生成不同尺寸长宽比的预测包围盒?损失函数ground truth输入都是相同的3*3*512,不同的是标签,损失函数中的 就是确保预测生成接近宽 、高 的包围盒。只要将对应尺度长宽比的正样本anchor和回归器对应起来,然后将正样本anchor对应的ground truth给回归器就可以的。 来看回归损失函数, 分别代表预测的包围盒,anchor盒,ground truth box(y,w,h同理)。可以看出回归loss函数只和anchor的宽 、高 有关,也就是和尺度和长宽比有关,和中心点( )无关。不同回归器的宽 、高 不同。1/6和1/100的大小是不同的,除以宽 、高 也是相同的道理。所以anchor的宽 、高 对损失函数也是有很大影响的。 不同尺度的anchor对距离的敏感程度不同。分类损失如何计算? 是二分类交叉熵损失函数,只有正样本的anchor作为对应回归器的标签,同时也有分类器的标签(二分类),负样本的anchor不计算回归损失,只有分类器的标签,对于那些被忽略的anchor,既不计算回归损失,也不计算分类损失。其loss=0。不论3*3滑窗对应的9个锚中有几个正样本,几个负样本,还有几个被忽略的样本,RPN的3*3滑窗输出一定是(4+2)* 9维。如果检测的目标只有一类,而且在图片中的大小基本相同,那么9个回归器可能只有其中1个被训练好。由于锚和回归器一一对应,只要数据够多,检测的目标尺寸和长宽比足够丰富,每个回归器都能被训练好。现在过遍训练RPN的流程:1、假设输入的图片是576* 960,经过VGG16生成卷积特征图,缩放16倍,得到36 * 60 *512的特征图,512是通道数2、使用3*3*512的滑窗在特征图滑动(stride=1,padding=2),找到每个三维滑窗的中心在原图对应的像素位置,然后在原图上生成9个anchor,这9个anchor的中心重合且和三维滑窗对应的中心相同。共有36*60个滑窗,则共有36*60*9个原图上的锚 。3*3*512的三维滑窗足够表达228 pixels区域的特征。3、生成anchor的同时根据ground truth的IoU值确定每个anchor是正样本还是负样本(是否是类)。为两种anchor分配正样本标签:(1)和一个ground truth的IoU值最大的那些anchor;(2)和任意一个ground truth的IoU大于或等于0.7的anchor。注意到单个ground truth可能分配正样本标签给多个anchor。第(2)个条件足以确定正样本,仍然使用第(1)个条件的原因是存在在第(2)个条件下没有正样本的情况。不是正样本的anchor中,那些和所有ground truth的IoU值小于0.3的被分配为负样本,其余那些既不是正样本也不是负样本的anchor,不作为训练样本,被忽略掉的。这样对于一个滑窗,原图产生的9个anchor,anchor可能被分配到正样本、负样本、被忽略样本的标签。然后对每个正样本anchor对应的ground truth,打上回归的标签,交给该anchor对应的回归器预测。anchor生成好以后,回归器对应的正样本回归标签 就确定好的。4、从一张图片当中随机采样256个anchor,正负样本anchor的比例是1:1,如果一张图片中正样本anchor的数量少于128个,就减少负样本anchor的数量和正样本anchor数量相同。需要注意的是,这256个anchor中来自不同的3*3滑窗。5、接着看网络的流程,mini-batch中的每个样本anchor对应的3*3*512的三维滑窗经过卷积(卷积核3*3*512)生成512维的向量,这512维的向量进入分类层、9个独立的回归层,输出一定是(4+2)* 9维,然后对正样本anchor对应的ground truth的回归层输出,使用 计算回归损失loss,然后还要计算其分类损失,负样本也要计算分类损失。被忽略的锚对应的输出loss=0。链接:Faster R-CNN中RPN网络的理解
