参考:https://blog.csdn.net/briblue/article/details/82012575
R-CNN,Fast R-CNN,Faster R-CNN中的开篇之作。two-stage,第一步是选出候选区域,第二步是从候选区域中选出目标并分类。
region proposal:候选区域。
positive / negative excample: 正负样本,即前景 / 背景
bbox: bounding box
1. 对于每张图片,使用选择性搜索(Selective Search)选出候选区域。
- 输入一张图片,用Graph-Based Segmentation 将图片切割为多个小块,并记为集合R。
- 对集合中的相邻小块计算相似度(similarity)得到矩阵S
- 从中选出相似度最高的块对,将块对与相关块的相似度从S中剔除。
- 块对组合为新块并加入R,计算新的相邻块相似度。
最终,每张图片得到具有多个层次的候选框,大概2k个。
2. 对每个候选区域进行预处理:context padding(原图向周围扩展16个像素)和wrap(无视大小和比例,强制转换),最终变化为227*227的固定尺寸。然后输入到AlextNet提取4096维特征。
3. 使用SVM对特征进行分类,并得到相应分数。最终,对每个类使用非极大值抑制得到结果。对每种类别,训练回归函数,微调坐标。
非极大值抑制:
- 根据置信度得分进行排序
- 选择置信度最高的比边界框添加到最终输出列表中,将其从边界框列表中删除
- 计算所有边界框的面积
- 计算置信度最高的边界框与其它候选框的IoU。
- 删除IoU大于阈值的边界框
- 重复上述过程,直至边界框列表为空。
# 训练细节:
- 在ILSVRC2012 classification 上预训练CNN
- 为了让CNN更好的适应检测任务和变形候选窗口(warped proposal windows)。将AlextNet在ImageNet中的分类层替换,使用SGD和warped region proposals来微调(迁移学习)。
- 在fine-tuning中:1. 与ground-truth计算IoU >= 0.5的region proposal视作该类的positive。2. 其余视作negative。在每次SGD的迭代中,选择32个positive windows和96个background windows建立一个mini-batch。
- 在SVM中:1. ground-truth boxes视作对应类的positive example。2. 将与某类任何ground-truth的overlap都小于0.3的proposal视为该类的negative example。3. 其余的忽略。
- SVM中处于灰色区域的hard negative excample对参数收敛更有意义。