本系列笔记主要记录本人在阅读过程当中的收获,尽可能详细到实现层次,水平有限,欢迎留言指出问题~算法
这篇文章被认为是深度学习应用于目标检测的开山之做,天然是要好好读一下的,因为文章是前些日子读的,因此仅凭记忆把印象深入的地方记录一下,许多地方是本身理解,有错误请指出。学习
这篇文章干了一件什么事情呢,就是用selective search生成一堆建议区域,而后把这些建议区域根据必定的准则作成分类训练集,微调预训练的CNN,C而后用CNN提取的特征和对应的类别训练SVM二分类器,最后通过非极大值抑制过滤后获得的结果对应的region proposal就做为检测边框。预测的时候,要对每个region proposal执行一次CNN+SVM。优化
我理解的是,CNN(或者说CNN+SVM)在RCNN中仍然只是一个分类模型,对selective search生成的region proposals进行分类,通过后处理,留下的被断定为目标的region proposal就做为最后的检测结果。spa
做者使用selective search算法生成大约2k个就建议区域,这是一个传统算法,组合多种策略和人工特征能够直接给出合乎条件的目标区域。这里的问题是,生成的边框尺寸大小不一,背景多目标少,不少只能框住目标的一部分,这些对后面的训练策略有影响。code
做者先在公开数据集上预训练了一个CNN的分类模型,而后在当前任务上微调。具体的,上一步生成一堆建议区域有不少只框住了目标的一部分,做者把IoU>0.5的认定为正样本,其他的为负样本,因而造成了一个分类的训练集,以此来微调模型。blog
这里面还有个细节,上一步生成的一堆建议区域,并不能直接送入CNN,由于当时的CNN分类模型都是若干卷积层+全链接层这样的结构,由于全链接层的缘故,模型的输入必须是某个固定的尺寸,所以哪些大小不一的region proposals必须先warp到fixed size。具体warp方法不展开讲了。图片
一样须要造成一个训练集(X,Y),此次标准不同,将IoU=1的认定为正样本(y=1),IoU<0.3的认定为负样本(y=0)。具体的,IoU是region proposal与ground truth的交并比,而训练集的X则是该region proposal通过CNN encode获得的特征向量。深度学习
使用非极大值抑制去除重复检测io
为何不直接用CNN模型进行分类,而要使用SVM呢?ast
为何训练CNN和SVM时候,正负例断定标准IoU阈值设置不一样呢?
答:这两个问题是相关的,我认为本质上是由于这是一个多阶段的模型,不少地方须要trade off,第一步生成的建议区域是正例少负例多,构建训练集的时候就容易不平衡,所以须要放宽正例的条件,可是要想定位准确,就须要正例更精准,这就是矛盾所在,所以有了不一样的IoU阈值和引入SVM。具体的,因为算法最后给出的检测结果就是通过筛选的region proposal,那么确定但愿它跟ground truth更吻合,也就是IoU接近于1,那么天然的要把哪些容易产生干扰的样本剔除掉为好。但训练CNN须要大量样本,在当前任务下,负例多正例少,一次调高IoU阈值为0.5,增长正例数量,防止过拟合;而训练SVM须要样本数量少,由于IoU阈值设置严格,以提升定位准确率。
4.1 对每个region proposal都要过一遍CNN,重复计算严重拖累的模型的效率
直观的想,解决这个问题就是要共享计算,也就是要先对图片进行一次总体卷积,而后在feature map上选取region proposal,可是这时的region proposal的尺寸又是大小不一的了,不知足全链接层的输入要求。。针对这个问题,提出了SPP-Net和Fast-RCNN,后面陆续展开讲。
4.2 经过selective search生成region proposals。
这部分是不能经过学习优化的,而后经过对这些分类代替回归定位,感受潜力有限。是否回归生成region proposals更优,还不太肯定,等读到后面的论文再说。
4.3 多阶段的模型,尤为是加入不能学习的算法,形成一种脱节感,限制了深度学习模型的威力。