快要找工作了,最近狂看论文,目标检测的框看的很迷糊,想记录一些自己的想法,免得以后又忘了。这里完全以自己理解的白话文记录。
RPN是faster-rcnn中用来找框的,这就好比现在大学毕业,先要高考,先把一堆anchors(考生)判断谁是前景,谁是背景,如果一个框里背景多了,前景少了,也就麻烦了,直接后果就是严重影响训练精度。专业名称叫做“类别不平衡”,你想,如果是个人都能上大学,那这大学还能好吗?几乎各种基于滑动框找目标的检测网络都存在‘类别不平衡’的问题,而RPN就是缩小这个问题产生的坏影响。
那RPN怎么做的呢? 首先,先得提到锚点,(必须从头说起啊!)锚点就是原图像经过VGG或者zf提取的特征图上的点,如果原图尺寸是W*H,经过卷积特征提取得到特征图是W/16*H/16的尺寸,那就有这么多个锚点,一个锚点上会产生9个anchors,三种面积,三种长宽比例,其他博客都有,一张W*H的原图总共会产生W/16*H/16*9个anchors,这里面有很多是没法用的。以224*224的图片为例,会有1764个anchors。
现在有1764个anchors,都说我要上大学,但得经过PRN这一层,首先第一步,原图中很多ground truth boxs(真值框),好比是语文,数学,英语各科 ,我们在W/16*H/16特征图上得到的anchors可以映射到原图中,很简单,就是把anchors框的坐标乘以16,然后在原图上与真值框计算重叠率IOU ,第一,假如你这个anchor与某个真值框重叠面积最大,RPN不管你重叠多少(某一科考了第一名,不管是多少分),那你是正样本(可以上大学),第二,假如,你这个anchor与某个真值框的重叠率大于0.7(只有有一科过了70,)那你也是正样本(也可以上大学)。现在能上大学的找到了,第三,假如你这个anchor与所有真值框的重叠率小于0.3,(门门都不到三十分),那你是负样本,(看做反面典型,)也给你上大学的机会,但是是给那些正样本‘打工’的,第四,除了上述三种anchors,剩下的,就被淘汰了,你们不能上大学。此外,这些正样本anchors虽然你与真实框重叠率大于0.7,但是还不够啊,需要进行‘修正’,提高自己与100分的距离,这里的100分就是真实框。如果你这个正样本anchors与某个真实框完全重合,那你这个anchor就是状元咯,可惜,绝大部分正样本anchors不是状元,所以要‘修正’,朝真正框靠拢。
这就是PRN的一套机制,为了让RPN的这套机制更加完善,就是这个PRN会不会把差的人也送进大学,我们需要训练RPN,让RPN的工作十分精确,,首先,判断你到底能不能上大学(前景,背景),这就是Lcls损失,第二,让那些能上大学的人,认清自己与标准人才的差距(预测框与真实框坐标的偏差)。这个认知越清楚(小)PRN越完美,向状元靠拢!
那我们看第一步,前后景误差损失
这里的i是mini-batch中的anchor的index,这里的min-batch是SGD训练时将整个训练集分成一组组的最小批次量,就是为了方便训练,我们之前说到,正样本和负样本都可以上大学,只不过负样本被看做反面典型,如果第i个anchor 是正样本,那就pi*就是1,如果第i个anchor是负样本,那么pi*是0,现在有一个新的RPN,不知道他的考核机制是不是完善的呢,第一部分就是考核他会不会分错,公式的第一部分的损失函数就表示这个新的RPN分错的程度,越小就分的越准咯,pi是这个RPN实际分的情况,损失函数用的是对数损失函数,如果pi,pi*都为1,损失为0,如果pi,pi*都为0,损失就为0,如果,pi=0,pi*=1那损失就无穷大,这个RPN就不准,得训练。
再看公式的第二部分,假如,RPN能够分清那些正样本anchors,但是这个anchors的坐标,需要弄清楚,公式的第二部分可以看到,有一个pi*,上面说到,只有第i个anchor是正样本,才为1,所以这一部分只考虑正样本,ti是这个新的rpn预测正样本anchors的坐标框信息(但不是直接预测),ti*是这个正样本anchors的实际坐标信息(但也不是真正实际坐标),ti,由tx,ty,tw,th组成,它是一个四维向量,ti*由tx*,ty*,tw*,th*组成,
假如红色框是真实框,紫色框是正样本anchor框,蓝色框是rpn预测的框,ti=(tx,ty,tw,th),x,y,w,h,是RPN预测框(蓝色框)的中心点和宽高,x*,y*,w*,h*是真实框(红色框)的中心点,和宽,高,xa,ya,wa,ha,是anchor 框(正样本)的中心点和宽高,第二部分的损失函数用Smoothl1,直接理解就是让ti与ti*的误差越小越好,其中tx与tx*的差越小越好,那也就是x和x*越小越好,即希望RPN预测的值越接近真实框越好,这里的anchor变成了‘打工的了’,ty与ty*也是一样。
总的来说,训练好的RPN筛选anchors,正样本和负样本,正样本还得修正他们的anchors坐标,使得anchors坐标更加接近真实框,然后将这些选好的区域框送入下一阶段ROIpooling咯,RPN很强大吧。