R-CNN详解
Test的过程:
1. 对给定的一张图片,通过Selective Search得到2000个Proposals
2. 每一个Proposal都经过已经训练好的CNN网络, 得到fc7层的features,4096-dimension,即2000*4096
3. 用SVM分类器(4096*K)得到相应的score,即2000*K
4. 用CNN中pool5的特征,利用已经训练好的权值,得到bounding box的修正值,原先的proposal经过修正得到新的proposal的位置
5. 对每一类别的scores,进行non-maximum suppression。具体来讲,对于2000*K中的每一列,进行nms。对于特定的这一列(这一类),选取值最大的对应的proposal,计算其他proposal跟此proposal的IOU,剔除那些重合很多的proposal。再从剩下的proposal里选取值最大的,然后再进行剔除,如此反复进行,直到没有剩下的proposal。K列(K类)都进行这样的操作,即可得到最终的bounding box和每一个bounding box对应的类别及其score值。
Training的过程:
1. 对训练集中所有的图片,用selective search提取出各图片对应的2000个proposal,并保存。(图片路径+bounding box信息)
2. 对每张图片,根据图片中bounding box的ground truth信息,给该图片的2000个proposal赋类标签,并保存。(这2000个proposal,如果跟ground truth中的proposal的IoU值超过了阈值,则把ground truth中的proposal对应的类标签赋给原始产生的这个proposal,其余的proposal都标为background)
3. 根据2中得到的文件,每次随机取batch,32 positive windows and 96 background windows,来训练一个在ImageNet上训好的模型,每一个proposal输入CNN,对应的类标签,来训练这201类的classification网络,训练好后,对所有的proposal,forward一遍来得到fc7 feature,保存最终的fc7特征及对应的proposal信息到文件中
4. 训练SVM分类器。对某一个特定的类,把跟属于这个类的ground truth的bounding box的IoU大于阈值的原始提取的proposal标为正样本,其余标为负样本,得到新的一个文件(加上之前得到的fc7特征信息)。用这个文件去训练这一个类的SVM。同样的方法,循环训好其他类别的分类器。
5. 用CNN得到的pool5的特征和bounding box的ground truth来训练bounding box regression,只对那些跟ground truth的IoU超过某个阈值的proposal进行训练,其余的不参与。
补充:
1. 在把proposal丢进CNN之前,需要把proposal处理成固定的一个大小,paper里提到“Prior to warping, dilate the tight bounding box, make p pixels around the original”,这个是什么意思?
比例=proposal的w/227-2p,把原图按此比例进行变换,以proposal的中心为中心,截取227大小的图作为输入,进入CNN
2. Detection中,mAP是怎么计算的?
对于每一个类,设置一个阈值,score大于此值的为正,否则为负,与ground truth相比,得到属于次此类别且score大于阈值的proposal,属于此类别但score不大于阈值的proposal,得到不属于此类别但score大于阈值的proposal,不属于此类别但score不大于阈值的proposal。由此计算,precision, recall。通过改变阈值,得到不同组对应的recall和precision。画曲线即可得到AP。
得到每一个类别对应的AP后,取平均值得到mAP。
recall = 属于次此类别且score大于阈值的proposal/(属于此类别且score大于阈值的proposal+属于此类别但score不大于阈值的proposal
precision = 属于次此类别且score大于阈值的proposal/(属于此类别且score大于阈值的proposal+不属于此类别但score大于阈值的proposal