老规矩,先贴出视频的链接: http://pan.baidu.com/s/1pKD2PXh 密码: xx8s。
好久没有写这个系列的课程了,是LZ最近有点懈怠了。。。
这节课程讲述了主要是空间的定位和检测问题,这两个任务在ImageNet上都有比赛,有兴趣的小伙伴可以好好准备准备参加比赛哦。
在计算机视觉的任务中主要有以下几个分类:在单目标任务中:主要是进行分类,如下图第一张,对图片中出现的猫咪进行分类,第二张图呢,也是单目标任务,就是再加上一个定位,把猫咪的位置也得确定好。而在多目标任务中:就有目标检测,主要看下图的第三张,有不止一类,然后分别对目标进行检测,最后一类最难了,叫实例分割,他还要精准的把目标的轮廓也要描绘出来,比单纯的bbox要复杂很多。
我们先从最简单的分类和定位说起:
假设在分类任务中一共有C类,作为输入都是图片,输出是实现定义的label,label就是事先定义的标签,这个前面已经讲过具体的细节,评价的指标就是准确率啦!
而在定位任务中,输入也还是图片,输出的则是一个含有边界框的图片,主要从数学表现上来说就是四个数,在图片坐标下,边界框左上角的xy坐标,还有边界框的宽度和高度。评价的指标就是IoU(Intersection over Union),这个具体计算是预测的边界框和实际的Ground Truth的交集除以它们的并集所得到是数,也是在定位中常用的一个指标。
在ImageNet中,分类和定位的任务一共有1000类,每张图片有1类,至少有1个边界框,每类大概有800张训练数据,算法会产生5个边界框和5个猜想类。如果至少有一类猜想正确并且前面提到的IoU超过0.5那么则算这张图片预测正确,定位也符合要求。
那么如何解决这个问题呢?
第一个想法:用回归来做定位
输出的4个数和ground truth计算L2距离的loss,再用优化算法对loss进行最小化。这就是这个想法的主要思想。
那么实现分类+定位的具体步骤有哪些呢?
1.训练或下载一个分类模型(AlexNet, VGG, GoogLeNet)
2.加上一个全连接的“回归输出”
3.使用随机梯度下降和L2损失训练回归输出
4.使用两个输出进行测试
上述说的步骤的最终网络结构如下图所示,最后的网络就有两个输出端,一个输出端是分类的结果,第二个是回归出来的结果。在回归中也有两种做法:一种是不定类回归,一共只有四个数(一个框),第二种做法是特定类回归,假定我们一共有C类,那么一共有Cx4个数字,即针对每一类都有一个框。在实际应用中,通常会使用的是第二种,特定类回归。其实这点并不难想象,假设有一类是猫,还有一类是火车,这两个从总体来说是形状不怎么相同的,如果使用相同的边界框,显然是不合理的。
还有一个问题,我们要在哪里添加回归的输出端呢?
如上图所示,不同网络的回归的输出端是不相同的,Overfeat和VGG是添加在卷积层之后,DeepPose和R-CNN是添加在全连接层之后,最终还是看最后的实际应用需要吧。
总的来说,把定位问题看成是回归问题还是很简单的,而且在逻辑上也是很好理解的。
第二个想法:滑动窗口
具体实现的步骤是:在高分辨率的图片上进行分类和回归,把全连接网络转变成卷积神经网络进行有效计算,在所有的尺度上把分类和回归的结果结合起来做最后的预测。
如下图所示,是2013年Overfeat的网络结构:
前面提到的滑动窗口具体是怎么工作的呢?网络的输入是3×221×221的尺寸,图片的尺寸是3×257×257,假设一共窗口滑动了四次,分别是在四个角,那么就会出现四个分类得分,也如下图所示,那自然也会出现四个回归边界框,我们只要选择的分最好的那个边界框作为最后的边界框输出。但是在实际的应用中,还会在其中添加尺度变换,当然也会添加不同尺寸的滑动窗口,增加准确度。
之前我们讲了为了提高计算的效率,我们可以把在最后的全连接层看成是进行卷积后的映射:原来是5×5×4096,经过5×5的卷积核后就变成了4096×1×1这点不是很难理解,这样在整个网络中就没有全连接层,整个网络都是通过卷积层和池化层构建的。
最后我们可以看下近几年在ImageNet Classfification + Localization上的结果:
这我就不在多解释了,图上已经说的很明确了,只是要提下ResNet中提出了RPN和提出更深的特征使得TOP 5错误率降到9%左右,简直是奇迹了!
下面我们主要介绍以一下计算机视觉的另外一个任务:目标检测。如果我们把检测也看成是一个回归任务,会怎么样呢?
由上图所示,检测是多目标的任务,可是多目标的任务数量是不一定的,所以需要不同尺寸的输出的。
假设我们把检测看成是分类的任务呢?
那么就是如上图所示啦!那我们怎么确定滑动窗口的尺寸呢?答案就是所有尺寸都试一下啦。。。。但是这个方法也存在一个问题:需要测试很多的地方和尺寸。那么有什么解决方法呢?如果你的分类器足够快的话,就做就ok啦!是不是有点像Nike的广告词:“Just do it!”还有一个问题:使用的分类器计算量非常大,解决方法是只需要看一个可能的地方的一小部分就行了。这也就是Region Proposal的主要思想。也即输出所有可能存在目标对象的区域。
Region Proposal中还有一个常用的方法叫做Selective Search,这种方法的主要思想是先以像素为单位,把相近的像素进行融合,转换成对应的边界框。具体的细节可以看具体的论文。
把Region Proposal和CNN和在一起就叫做R-CNN,具体的结构图如下图所示:
具体的步骤如下:
1.训练或下载一个分类器
2.微调模型
3.提取特征
4.针对每一类训练一个分类器来对区域特征进行分类
5.边界框回归
常用的数据集也就是是PASCAL VOC(2010), ImageNet Detection, MS-COCO,这些都是常用的数据库,小伙伴感兴趣就自己查一下,或者挑选一个进行使用,对于细节PPT里都有,这里也就不在多说了。
对于检测,也有专门的评价指标。通常是mAP(mean Average precision),或者是之前提到的IoU。
在PPT中也说了R-CNN的效果还是不错的,但是还存在几个问题:(1)在测试的时候对每个Region Proposal都要进行整个正向传递的CNN,(2)SVMs和回归是离线的,提取的CNN特征并没有实时更新,(3)比较复杂的训练管道。
后面依照R-CNN又提出来了Fast R-CNN,具体的结构如下图所示,是直接把从卷积层卷积后获取的Region Proposal中RoIs(Regions of Interest)通过全连接层,进行计算。这里也会有几个问题,第一个:由于CNN独立的前向传递网络,在测试的时候会非常的慢。解决方法是在图像的Region Proposal之间进行卷积层的权值共享,以减少计算量。还有是参数离线更新和管道复杂,解决方案是直接端对端计算就好了。
最后,简单介绍一下Faster R-CNN:下面是一些介绍,LZ就不详细说了
最后发源代码的链接贴出来,有兴趣的小伙伴可以自行尝试。
还有一些英文的总结,我也就不在进行翻译了:
这节可就写到这啦。。。写博客有的时候还是很辛苦的O(∩_∩)O