总结一下从RCNN到Fast RCNN再到Faster RCNN,最后谈谈yolo。
DL在Classification方面的能力已经被无数的刷榜成绩证明了。但是detection一直以来都是要比classification要高出一个量级的任务,并且也是在实际的工程中更常见的一个任务,却始终没有很好的被DL所解决。
传统的检测的解决思路一般都是使用金字塔结构解决不同的尺度,sliding window解决不同的位置,以及用不同ratio的bounding box来解决物体长宽比例的问题。这些复杂的重复计算会使得整个系统低效不可行。所以对于深度学习来说,要解决的就是如何在高效高精度的保障下,实现上面说的这些效果。
最开始解决这个问题的就是RCNN,就是region based的CNN,虽然思路很简单:使用selective search等方法给出很多的candidates,然后统一的使用一个CNN网络来进行分类。这篇文章最大的创新其实是将detection问题转换为classification问题的思路。这一个思路让DL瞬间在detection领域引爆了。
在RCNN里面其实没有太多的细节的创新,所以后面就引起了大家对这个框架的大修大补。微软搞的Fast就是在这个基础上开始改进的,使用了SPP的思想(利用不同大小的pooling,来实现pyramid的不同尺度的效果),同时也通过同时完成classification和regression的任务来提高精度,但是纯粹的SPP是不能去学习的,这样就不能放在整个网络中一起学习。所以作者给出了ROI Pooling的概念,但是ROI Pooling只能生成一个pyramid上的窗口,因此只能算是一个简化版本的SPP。但是他的好处就是能参与BP来学习了。
到了这一步,同组的哥们又做了进一步的改进:selective search太碍事了。在DL解决一切事情的今天,还用那么“老土”的方法应该是要消灭掉的。所以Faster的做法是,建立一个RPN网络,直接来propose candidates。这样输入任意一张图像,这个RPN网络在最后一层的feature map上进行sliding window(不同的位置),然后对同一个位置使用了不同的box(作者叫做anchor)(不同的尺度和长宽比),这样会得到一系列的candidates,然后再提交给紧接着的Fast RCNN的网络,这样一气呵成。
到这,虽然复杂,但是已经是一个完整的结构了。但是总是还有强迫症认为这不算是真的一个网络。。。yolo的作者就觉得自己才是真正的one network。。。Yolo的结构其实和一般的CNN没啥大区别,就是最后一层输出的思想换了一下。它把图像分为下面彩色那种小格子,将小格子作为参照,每个格子都输出一个(x,y,w,h,c, C0…Cn),对应物体相当于格子的偏移xy,长宽wh,和是否有物体c,和物体对应的类别Ci,当然一个还是不够,作者说可以每一个格子有B个,论文中B=2.其实这个思路是很有意思的,这个网络只修改了输出,他其实默认了网络具备detection的能力。(之前的网络还是处理的classification),有了detection能力,然后就是一个问题,到底如何输出不定个物体?作者就想到用这样的2D参照点给出了物体个数的上限值,然后强制训练。
综上就是这几篇文章的简单总结。运用到实际工程的时候,还有很多细节需要注意。