Test过程:
1. 输入一张图片,放进已经训练好的RPN,能得到w*h*k个proposal的Object score和每一个proposal位置的修正,在这些proposal中将Object score进行排序,筛选出一定的proposal用作下边的输入,并完成proposal的修正
2. 利用前边RPN中conv layer,以及现在得到的ROI,经过ROI pooling layer,最终得到每一个ROI 的分类score
3. 用nms进行筛选,得到最终的bounding box,类别及其score
RPN Training过程:
1. 将所有可能的anchors跟ground truth进行比较,将与某个bounding box的ground truth重叠比例最大的记为正样本,剩余的anchor,如果其与某个标定重叠比例大于0.7,记为正样本;如果其与任意一个标定的重叠比例都小于0.3,记为负样本,其余的不用
2. 每次训练随机取一张图片,在这张图片上随机选取256个anchor,一半正样本,一半负样本组成mini-batch,(其实这256个anchor的选取只是影响了ground truth的标记值)
问题:faster R-CNN, RPN的过程,其实就是一个n*n(3*3)的卷积,加上两个独立的1*1的卷积,比如得到的conv feature是13*13*256, 然后3*3*356*256卷积,得到11*11*256,然后如果是预测物体存在的概率,是后边加一个1*1*256*(2*9)的卷积核,得到11*11*18,拆成9个11*11*2, 如果是预测框的位置,是后边加一个1*1*256*(4*9)的卷积核,得到11*11*36? 拆成9个11*11*4
这样的话不是得到了这张图上所有的anchor的预测值和位置修正了吗?但训练的时候只选取了部分,所以具体BP的时候,是让未选中的那些向前传0,之所以选256个,是为了避免由于背景样本太多导致的偏移。
4-step Training:
1. 先训练RPN,得到图片经过修正后的proposal,用于后面的fast R-CNN
2. 用imageNet上pretrained model进行初始化,利用上边得到的proposal,进行训练
3. 利用2中训好的CNN,初始化RPN,固定相同的conv layer,只fine-tune RPN中独有的layer (得到conv feature后的layer)
4. 再利用3中的RPN得到的proposal,固定相同的conv layer,只fine-tune Detection中独有的layer(ROI pooling layer之后)
1. Faster R-CNN为什么比Fast R-CNN快?
(1) 共用了conv layer,只增加了3*3, 1*1的消耗,没引入额外的计算
(2) RPN,能得到更好的feature(因为这些feature是经过CNN训练,学习出来的),不需要像Fast R-CNN那样引入2000个proposal,300个大概就可满足
2. 为什么要RPN, classification单独先训练,再合起来?
如果一起训练,一开始,RPN得到的proposal还不是很好
3. anchor的选择?
需要根据数据分布来选,图片的长宽等
4. RPN得到的proposal,选score最高的那些作为后边的输入;训练后边的时候,再控制前景样本和背景样本的比例去训练。