RCNN对于每个ROI,都跑一遍CNN,即使这些ROI之间是有overlap的,
显然有部分计算是重复的,所以SPP-net和fast rcnn就在这方面做了文章,具体做法是先用CNN抽取整张图的特征,然后利用ROI pooling抽取对应ROI的特征,使得不同ROI共享特征提取的计算量。结果就是原来我处理一张图像需要前向2000次CNN,现在只要前向一次就好了,极大的提升了计算速度。fast rcnn还通过multi-task loss实现了一个end to end 的系统,这里不是我们的重点。
fast-rcnn提出来之后,detection的性能瓶颈变成了计算region proposal。CPU实现的selective search处理一张图需要2秒钟,远大于GPU上CNN特征抽取的时间。Faster RCNN就是要解决这个问题,他的出发点是这样的:既然用CNN进行feature extraction这一步已经无法避免,那么我们为什么不更充分地利用得到的feature?具体来说,我们是不是可以直接用CNN得到的feature来进行region proposal,答案是肯定的。Faster RCNN将CNN得到的feature输入到一个两层网络(RPN),网络的输出就是region proposal。这样一来,
region proposal的额外开销就只有一个两层网络。实验证明这样不仅速度变快,而且proposal的质量也更高了。
到目前为止,上面我们说的4个步骤中,第1步和第2步都可以通过前向一遍CNN来得到,所以前俩步都不再是速度的瓶颈。然后我们考虑第3步,假设我们用faster rcnn的RPN得到了300个region proposal,在预测的过程中,我们需要对300个region proposal去做分类,即我们要处理300个多分类问题,如果我们用one vs rest来实现多分类,每遍就是21个二分类线性svm(也可以用一个softmax-log loss的线性分类器,但是计算量和21个二分类svm差不多),这样的话每次预测就要跑6300个二分类器,即使是线性分类器,这个时间仍然是很大的,所以就有了R-FCN这个工作。具体来说,是先利用FCN进行类似semantic segmentation的计算,然后利用ROI对相应的区域进行average pooling,得到整个ROI关于21个类别的置信度。
简单的说就是把分类这个过程也融合到网络的前向计算过程中,由于这个过程对于不同的ROI是共享的,所以比单独跑分类器要快好多。文章里还有一个position-sensitive的idea,也很有趣,不过感觉给我一种”这也能行“的感觉,应该是我少见多怪,理解不了大神的世界。
传统方法使用滑动窗口的框架,把一张图分解成几百万个不同位置不同尺度的子窗口,针对每一个窗口使用分类器判断是否包含目标物体。传统方法针对不同的类别的物体,一般会设计不同的特征和分类算法,比如人脸检测的经典算法是Harr特征+Adaboosting分类器;行人检测的经典算法是HOG(histogram of gradients) + Support Vector Machine;一般性物体的检测的话是HOG的特征加上DPM(deformable part model)的算法。