第二天算是坚持住了,不容易啊(因为我实在太想躺平了)。
今天读R-CNN系列的开山之作,虽然我是已经学过R-CNN的大致架构了,是抱着学习候选区域生成算法(老师没细讲)的目的来读的,但是这文章里并没讲(哭),不过还是坚持读完了,还是有收获的。如果有人看到一定要带审慎的眼光看啊,能帮我指正指正错误就太感谢辣!!
论文地址:/abs/1311.2524
以下为正文:
引言
论文首先从一些基于SIFT或者HOG的非监督模型与CNN引入,之后作者提到自己工作的两个重点:
如何用深层网络定位目标如何用小数据集训练大网络架构
R-CNN的基本流程
R-CNN包含三个模块:
生成与类别无关的多个候选区域用卷积神经网络提取每个候选区域的一个定长特征表示用线性SVM进行类别的识别
用图很好说明:
剩下的部分比较分散地提到一些需要注意的点:
在生成候选区域后,需要将候选区域调整至指定的长宽尺寸才能送到卷积神经网络里提取定长特征要用非最大值抑制清除重复框,指标为IoU每个类别都单独有自己的线性SVM,意思是第三步要运行多个SVM
R-CNN相比与同时代其他方法的优点:
更加高效。这得益于两点:一是第二步运行的CNN只是特征提取器,是类别无关的,所有类别共用参数;二是相比其他方法,CNN提取出的特征更加低维,计算量也就更少。可以更加容易地扩展到更多类的情况。
这一部分还提到了作者在引言中提到的第二个问题的解决方法,答案是迁移学习或者叫微调。这算是现在比较普遍的用法了,就不再复述了。
还提到了在两个数据集上的测试结果,结果当然是比同时代的最好方法更好啦,我不太关心这个。不过还是有一个我自己的意外收获,就是经常看见的这种图,我大概知道什么意思了
应该是每个绿色的点是这个模型在每个类上的精度,然后框出最大值到最小值的范围,中间的小锤锤模样的应该是某种中位数或者分位数。这种图可以比较直观地看出均值与方差等统计数据。
可视化、消融实验等
作者想看看这个网络究竟学到了什么。于是他用一些候选区域作为输入,取出一些单独的神经单元的输出,观察什么输入会使这个神经元的输出最大化(即激活),对输出进行一个排序,同时在原图上框出这个神经元的感受野,效果如下,可以看到确实学习到了一些东西:
作者也进行了消融实验,就是逐层观察,看每个层对输出精度的贡献多大,结果如图:
有意思的有两点:
在没有FT(fine-tuning微调)的情况下,最后一个全连接层反而降低了精度,我觉着现在的术语应该叫欠拟合,因为没有微调的时候数据量不够而模型很大,而进行微调之后,相当于扩充了数据集,这时候大的模型才能起到应有的效果CNN的表达能力大部分是卷积部分给予的,而后面的全连接部分虽然占据了很多的计算量,但是其带来的提升相比卷积部分并不是很高
作者还讲了他的其他的工作,如CNN的架构选择、误差分析、Bounding-box回归、量化结果等,没怎么看懂,以后回来再看。
ILSVRC数据集
这一部分讲的ILSVRC数据集的使用之类的,不太感兴趣就没细看
语义分割
R-CNN干的活其实就是给定一个区域,预测其类别,这其实也是语义分割需要做的。因此R-CNN也可以用于语义分割。作者为了和当时语义分割领域最先进的技术进行对比,生成候选区域的算法用的是叫CPMC(没搜到相关信息,估计只能读论文里的引用了)。作者尝试了三种策略来从CPMC生成的候选区域计算出特征表示:
圈出一个长方形的框,然后warp到指定的大小(227*227),之后送到CNN里得到特征表示。这和前面讲的方式一样,不过好像是因为CPMC生成的候选区域不是规则的(我猜的啊),因此这种方式会圈住一些不是候选区域里的像素。第二个策略就是第一个的改进,取不规则的候选区域作为前景,补一些值为0的背景形成长方体再warp到227*227,送到CNN里得到特征表示。第三种就是将前两种得到的特征表示进行串联。
然后发现第三个策略得到的最终性能最高(高于当时最先进的技术),不过我觉着也没有高多少,如果真要解决目标检测任务还是看看FCN吧
总结
我就不总结了嘿
附录
附录比正文好看(?)
附录里提到很多点比较有意思:
1.作者提到,他们在微调CNN时与训练SVM时,对于正例负例的定义是不一样的。微调CNN时,他们定义如果一个候选区域和它与对应最大IoU的真实标签的这个IoU超过0.5就是正例,其他的都算是背景(负例)。而训练SVM时,他们只认为真实标签为正例,而那些与真实标签的IoU小于0.3的候选区域为负例,之间的灰色地带的候选区域被忽略。
作者说其实这只是他们调试的结果,这样定义得到的结果就是比规范为同一种定义的效果好(老调参侠了)。不过,作者给出了他们的猜想,他们认为可能的原因是具体的怎么定义正负例并不是最关键的,关键是训练数据的量。他们的这种方式,其实引入了很多的“抖动”样例(作者这么说的),也就是不是很准确的例子。我的理解是相比SVM的定义,微调CNN时的定义其实是更加宽松的,会生成更多的正例与负例(是“与”,因为SVM是硬条件,正例、负例都比微调CNN时少),不过这些多出来的正负例都是不太准确的例子,就是框出来的范围不怎么正(只框住一半脸之类的)。这些增加出来的数据对于微调一个大网络是有帮助的,不过只能算是没有更多数据的次优选了。
2.为什么不直接用微调的CNN的输出再加softmax去预测类别,而是又加了一步SVM呢?原因很直接,效果没有加上SVM好。那为什么呢?作者认为是上一点的遗病,因为引入了很多不精确的例子用于微调。作者认为如果有更多数据,可以不加SVM这一步而达到同样的效果,并且因为省去了一步而有加速的效果。
3.上面提到很多次"R-CNN BB",这个"BB"是指Bounding-box regression。这个操作是在以上提到的三个步骤之后,又新加的对目标框的一个小小修正的方式。具体的方式不太想写了,因为论文这里写的很清楚,我截屏放在下面哈:
概括就是,我们假定这个修正的方式是框中心的平移变换与框长宽的对数变换,具体的变换参数就是回归的目标。作者说着部分有三点要注意:
正则化参数很重要(他们设置的是lambda=1000)仔细选取训练用的样例很重要,不能找那种原始框与修正框差得很远的那种例子,作者设置至少IoU大于0.6的才能用原则上,这个修正方式可以迭代使用,不过他们发现迭代也带不来什么提升
怎么说呢,感觉看了附录这三点比看正文收获多,可能是因为正文内容大部分都已经学过了,现在都脱离论文成为深度学习很普遍的用法了,只有附录里提到的这些现象与原因猜想让我有了更深的理解。
先记一下不太懂的点哈,希望以后把这些搞懂,或者有人来帮帮孩子解读解读orz:
生成候选区域的方法作者正文没有提到,不过查的时候有人说用的是Selective Search for Object Recognition论文里的方法,这个方法很重要,要搞懂作者提到将候选区域warp到指定大小时提到这一点,读了好几遍都没搞懂
大概磕磕绊绊读完就这些啦,感谢作者!!