Fast R-CNN依赖于区域建议方法,比如selective search.但是,这些算法只能跑在cpu上,速度很慢.在测试中,Fast R-CNN做出一次预测要2.3秒,其中2秒都花在了生成2000个ROI.
feature_maps = process(image) ROIs = region_proposal(image) # Expensive! for ROI in ROIs patch = roi_pooling(feature_maps, ROI) results = detector2(patch)在流程上,Faster R-CNN与Fast R-CNN是一致的,只是将得到ROI的方式改为由一个region proposal network(RPN)得到.RPN效率要高的多,每张图生成ROI的时间仅在10ms.
RPN接受卷积网络输出的特征图作为输入,用如下的ZF网络做区域建议.也可以用其他的网络比如VGG或者ResNet去做更全面的特征提取,代价是速度的下降.ZF网络输出256个值,送到两个全连接层,一个用于预测边界框(boudary box),一个用于预测2个objectness scores.objectness衡量bounding box是否包含一个object.我们可以用一个回归器去计算出一个single objectness score.但是为简单起见,Fast R-CNN使用一个分类器,分类器分出的类别有2种:即包含目标和不包含.
对特征图中的每一个位置,RPN做出k个猜测.所以RPN输出4*k个坐标,2*k个score.如下表示对一个8*8的特征图,用3*3的filter,最终得到8*8*3个ROI.
后面我们将继续微调我们的猜测.由于我们需要有一个正确的猜测,我们初始化的猜测最好有不同的shape,不同的size.所以,Faster R-CNN不是随机乱猜的边界框,它预测相对于我们称之为anchors的参考框(reference box)左上角的偏移.我们限定偏移的大小,这样我们最终预测出的bounding box依然是与anchors类似的.
为了每个位置能够得到k个预测,每个位置需要k个anchor.每一个预测都与一个特定的anchor有关.不同的位置共享同样的anchor shape.
这些anchors不是瞎选的,要尽可能地覆盖到real-life objects,并且要尽量有合理的尺度和宽高比.这样可以使得每次的prediction更准确.这个策略使得训练的早期可以更容易更稳定.
Faster R-CNN uses far more anchors. It deploys 9 anchor boxes: 3 different scales at 3 different aspect ratio. Using 9 anchors per location, it generates 2 × 9 objectness scores and 4 × 9 coordinates per location.
假设一下我们只有一个检测脸部中右眼的feature map,我们可以用它来定位整张脸吗?答案是肯定的,因为右眼位于面部的左上角,所以我们可以用来定位整张脸.
如果我们有其他专门用于检测左眼、鼻子或嘴巴的特征图,我们可以将这些结果结合起来,更好地定位人脸.
在Faster R-CNN中,我们最终会将整幅图片的feature map切成相应的roi对应的feature map,再送给多个全连接层去做预测.有2000个ROI的时候,这一步的代价是很高昂的.
feature_maps = process(image) ROIs = region_proposal(feature_maps) for ROI in ROIs patch = roi_pooling(feature_maps, ROI) class_scores, box = detector(patch) # Expensive! class_probabilities = softmax(class_scores)