GPU上达到5fps
流程:
1、将图像输入网络得到相应的特征图
2、使用RPN结构生成候选框,将RPN生成的候选框投影到特征图上获得相应的特征矩阵
3、将每个特征矩阵通过ROI pooling层缩放到7*7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果。
即:RPN+Fast R-CNN
256-d :ZF-Net 512-d:VGG16
在feature map 用3*3conv,padding=1,得到shape与feature map 相同的特征矩阵,再分别经过1*1卷积,卷积核个数为2k,4k进行处理,得到cls,reg。原论文中K=9
对于特征图上的每个3*3的滑动窗口,计算出滑动窗口中心点对应原始图像上的中心点,并计算出k个anchor boxes.
步距=原图的宽度 / 特征图的宽度,再取整
步距=原图的高度 / 特征图的高度,再取整
特征图黑点位置对应原图的位置:x:步距*3,y:步距*3
再以原图黑点为中心,生成k个anchor box,这个anchor可能包含目标,也可能不包含
cls :0.1:为背景概率,0.9为前景概率,每两个表示一个box,这里不进行分类
每个anchor的面积
由中心点生成9个anchor,2*9个cls,4*9个reg
对于ZF-Net感受野:171
对于VGG感受野:228 ,但为什么在原图上能够预测比它大的的边界框?(如256,512)
原论文作者的看法:根据经验,只看到一部分,也能够大概猜出整体位置区域,实际使用也是有效的。
对于一张1000*600*3的图像,大约有60*40*9(20k)个anchor,忽略边界的anchor以后(即一些anchor超过了边界),剩下约6k个anchor。利用RPN生成的边界框回归参数将anchor调整到候选框,将6k个anchor调整为6k个候选框,这里的anchor与候选框不一样,对于RPN生成的候选框之间存在大量重叠,基于候选框的cls得分,采用极大值抑制,IoU设为0.7,这样每张图片只剩2k个候选框。
训练数据(正负样本):随机采样256个anchor,由正负样本组成(1:1),正样本不够128,负样本填充。
正样本:1、Iou超过0.7认为是正样本。2、找到与groundtruth 最大iou的anchor也定义为正样本
(一般取第一个条件足够)
负样本:iou<0.3
正负样本之外的全部丢弃掉
RPN损失:
2400(60*40),lambda是平衡参数,256最终抽取候选框个数
简化:1/Ncls = lambda *1/Nreg 1/256=10*1/(2400)
分类损失:
-log(0.9)-log(0.2)....
Fast -R-cnn损失这里不细说
如何利用反向传播进行训练:
直接联合,代码中