深度学习小白——物体定位和检测

来源:互联网 发布:战地4优化补丁 编辑:程序博客网 时间:2024/06/06 02:37

此篇是看CS231n的课后笔记,方便以后查阅,因为刚开始接触,如果有错误,欢迎指正~


一、 Classification+Localization定位

定位一般是指一张图有一个类别,有单个物体需要去定位

常用数据库:ImageNet localization数据库

对于分类任务:

  • 目标:分出类别
  • 输入:图像
  • 输出:图像类别
  • 评价指标:准确度

对于定位任务:

  • 目标:标出该图中类别物体的位置(矩形框)
  • 输入:图像
  • 输出:bounding box (x,y,w,h) 4个数
  • 评价指标:与所给框的交叉重叠部分

【步骤】:
  1. 训练一个分类网络(AlexNet,VGG...)
  2. 在一个特定位置(conv后或者FC后)重新连接一个Regression head,用于训练框的位置
  3. 训练回归网络,用SGD+L2 Loss,分两种回归:不定类回归(1个box)/ 特定类回归(C个box)
  4. 测试时,把两种heads都加上得到分类标签+定位框



[Sliding Window]——Overfeat网络(ILSVRC 2013定位挑战冠军)

论文:Sermanet et al, “Integrated Recognition, Localization and Detection using Convolutional Networks”, ICLR 2014

主要思想:

  • 用一个滑动窗口在高分辨率的图片上不同位置滑动
  • 将全连接层转换为1*1卷积层,节省计算资源
  • 在不同尺度上将分类器和回归器的预测结果融合,从而得到最终预测结果

滑动窗口
假设输入图像比规定的尺寸大,可设置一个滑动窗口分别滑动图像的左上,下,右上,下四个位置,得到四个分类得分
同样得到四个框

      
实际中,会取各种大小的sliding windows,所以会得到很多类别得分和很多框,通过一种特殊的融合方式,得到最佳结果(此处课上没说,需再看论文)


FC-->1*1 Conv
---->

定位任务结果:




二、Object Detection

       对一副图中的所有类别框出其所在位置,类别数不确定,所以输出数量也不确定,所以可以把检测也看成一个分类问题,而不是回归问题。对一副图我们需要不同尺度的框去探测各个位置可能出现的类别信息,最简单的方法就是try them all!但是这回带来巨大的运算量。以前人们用HOG特征来进行检测时是可以实现的,因为提取HOG特征很快(是用线性分类器),现在用CNN来提特征就使得全试一遍这种方法很不现实。于是人们提出各种方法来预先得到一些类别框可能在的位置,得到可能位置的一个小子集,以减少运算量。
这种预先提出候选区域的方法叫Region Proposals



这种方法的大致原理就是寻找相似像素块,把临近相似的像素区域框出来,这样做运算很快,但得到的框不是很准确,但主要目的还是达到了,就是排除很多无关的框的位置,大大减少了之后的运算量。在Region Proposal方法中最有名的的就是Selective search  ——【Uijlings et al, “Selective Search for Object Recognition”, IJCV 2013】


======================================================================================================================

【Selective Search】

SS可以看成是对图像的分割,SS可以预先把图片划分为各种大小不同的区域(满足目标多尺度的要求),分割后还有一个区域合并的过程,最后剩下的都是那些最可能的候选区域,然后在这些已经过滤了一遍的区域上进行后续的识别等处理,这样的话,将会大大减小候选区域的数目,提高了算法的速度.

得到区域的算法:
1. 使用 Efficient Graph-Based Image Segmentation【1】的方法获取原始分割区域R={r1,r2,…,rn}
2. 初始化相似度集合S=∅
3. 计算两两相邻区域之间的相似度(见第三部分),将其添加到相似度集合S中
4. 从相似度集合S中找出,相似度最大的两个区域 ri 和rj,将其合并成为一个区域 rt,从相似度集合中除去原先与ri和rj相邻区域之间计算的相似度,计算rt与其相邻区域(原先与ri或rj相邻的区域)的相似度,将其结果添加的到相似度集合S中。同时将新区域 rt 添加到 区域集合R中。
5. 获取每个区域的Bounding Boxes,这个结果就是物体位置的可能结果L

http://blog.csdn.net/mao_kun/article/details/50576003 讲的很详细


得到候选区域后,再对每个区域进行判别


         系统在实现过程中,使用color-SIFT特征以及spatial pyramid divsion方法。在一个尺度下σ=1.2下抽样提取特征。使用SIFT、Extended OpponentSIFT、RGB-SIFT特征,在四层金字塔模型 1×1、2×2、3×3、4×4,提取特征,可以得到一个维的特征向量。(注:对SIFT特征以及金字塔模型还不是很了解,讲得不是很清楚)
         训练方法采用SVM。首先选择包含真实结果(ground truth)的物体窗口作为正样本(positive examples),选择与正样本窗口重叠20%~50%的窗口作为负样本(negative examples)。在选择样本的过程中剔除彼此重叠70%的负样本,这样可以提供一个较好的初始化结果。在重复迭代过程中加入hard negative examples(得分很高的负样本),由于训练模型初始化结果较好,模型只需要迭代两次就可以了。(样本的筛选很重要!!)


==================================================================================================================

通常来说,一个好的检测结果可以有两个决定因素:
1. 网络的深度:网络层数越多,深度越深,其效果往往越好
2. 区域推荐的算法:节省运算量的主要修改方向。


【经常用到的数据集】




PASCAL数据量偏小,很适合做科学研究,出结果较快,ImageNet Detection图片量大,常常用作竞赛,微软出的COCO由于其数据量适中,且一张图中往往有多个目标需要进行检测,所以现在大部分人用这个数据库


【评价指标】——Mean Average Precision (mAP)

计算每一个类别的平均准确度,然后再在所有类别上作平均
检测结果被认为是true positive如果它与ground truth的重叠率达到一个门限值(通常是0.5)-->mAP@0.5
把所有测试图片的检测结果结合起来对每个类画出precision/recall 曲线,AP就是曲线下的区域

mAP是个0-100的数,越大越好



【R-CNN】 ——Region based CNN

Girschick et al, “Rich feature hierarchies for accurate object detection and semantic segmentation”, CVPR 2014



Training步骤:

  • 训练或下载一个分类网络(如AlexNet)
  • fine-tune model for detection,比如训练时是1000类,然而要检测的只有20类+一个背景类,所以共21类,所以我们要微调网络
  •  Extract features,对每张图用Region proposals选出很多候选区域,然后对所有候选区域进行crop和warp使之符合CNN输入size,送入CNN网络到pool5,保存下该层的feature maps
  •                                                                        
问题就是,存下来的feature map太大了,大约有200G左右对于PASCAL数据集,因为是先选推荐区域再一个一个跑CNN

  • 对每一类执行二分SVM对所选区域内的图像做分类
  • bounding box regression对于每一类,训练一个线性回归模型,去掉一些不好的候选框以及对框做一些微调与修正,比如中间的这个框就有点偏左,所以dx为正值,意味着朝着向右的方向为正确方向。
        

【R-CNN的结果】


从上图可以看出,2013-2014年从非CNN方法到CNN方法产生了一个较大的提升,所以证明了CNN的强大之处,第三列和第四列比较可以得出bounding box Regression会有一些帮助,第四列和第五列比较得到网络深度的增加会有较大提升,这也印证了刚才说的结论。


【R-CNN存在的问题】

  1. 测试时太慢了,因为它要将每个region proposal都送入CNN跑一遍,而推荐的region大约有几千个。
  2. SVMs和回归都是离线训练,使得CNN特征并没有依据SVM/回归的结果作更新
  3. 复杂的training pipeline

为解决上述问题,有人提出了Fast R-CNN


【Fast R-CNN】——Swap order of convolutions and region extraction!
Girschick, “Fast R-CNN”, ICCV 2015  

训练模型:

 

不再像R-CNN里先训卷积,在做分类和回归,这里是一个端到端的完整的训练过程,使得CNN提取到的特征也能随着SVM/Regression一起更新。解决了问题2

对于问题1,Fast R-CNN里先将整幅图通过CNN,然后在得到的高分辨率的feature map上进行ROI pooling,直接从feature map上提取感兴趣区域。通过共享不同目标框的卷积特征的计算大大降低运算量



测试模型:



【ROI Pooling】

对输入的高分辨率图像,先用region proposal得到候选框,然后整幅图卷积后得到一个高分辨率的feature map,而全连接层希望得到的是低分辨率的特征值。所以我们将在原图上给出的目标框(region proposals)直接映射到feature map上,然后把对应区域的feature map切成小网格状,对每一小格作max pooling,就得到了感兴趣区域的卷积特征。

一个直观的理解就是:与R-CNN不同,R-CNN是先对在原图上的推荐区域做变形crop到CNN合适大小再分别作CNN,而fast R-CNN是先作卷积,然后再在所得的共享feature map上提取推荐区域做变形crop(pooling)成ROI region.由于卷积只是一个特征提取过程,这与图像的区域位置没有关系,所以不需要把每个候选框分别传入CNN,而是可以先把整幅图送入CNN,然后再挑选对应区域的特征进行分类检测。

这种方法我们也知道相应的BP怎么做,所以运算起来很方便

-->




【Fast R-CNN的结果】


可以看出Fast R-CNN在训练速度和测试速度都有很明显的提升,在mAP上也有微小的进步。

但要注意,这里的测试时间是不包括Selective Search 的,如果算上Selective Search那么速度提升就不那么明显了

所以之后又有人提出了 Faster R-CNN!



【Faster R-CNN】——Compute region proposals within the network

Ren et al, “Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks”, NIPS 2015


                              

相比于Fast R-CNN,Faster的最大亮点就是提出了Region Proposal Network(RPN网络),这个网络训练用于产生推荐区域,所以不再需要额外的region proposals!这样会大大加快运行速度


【Region Proposal Network】 


  • 一个滑动窗口在feature map上滑动

  • 建立一个小网络用于:判断该窗口内存不存在要分类的物体(n scores),以及对bounding box位置进行回归(4n coordinates)

  • 对于滑动窗口所在的每一个位置,采用N个anchor boxes,论文中默认使用3中不同尺度,3种不同宽高比,共9中anchors在每一个滑动位置。这些anchor boxes具有平移不变性,在每个位置都是同样大小,回归过程就给出了这些anchor boxes的偏差,分类过程给出已回归过的anchor存在要分类物体的可能性。

  • 训练过程中,不同于Fast R-CNN,对于K个bounding-box,都是从同样的3*3的feature map得到,只是不同的anchors。为了保证尺度多样性,有k个回归器,负责回归不同scale和不同宽高比的bounding-boxes,所以每个回归器采用不同的参数,它们彼此之间不共享参数。

  • RPN的损失函数:对每一个anchor赋予一个二分的class label(positive or negative)。赋予规则:对于那些(1)与ground truth 有最大Intersection-over-Union重叠的anchor(2)有与ground truth高于0.7 IoU 重叠的anchors赋予positive标签,给非positive且IoU低于0.3的anchors赋予negative标签。对于其中既不是positive也不是negative的anchors就不作为训练目标了。Loss function 如下:
        
其中,i是一个mini-batch中某个anchor的索引,pi是第i个anchor中是否有object的概率,pi*=1如果这个anchor是positive,否则=0
ti是一个包含关于anchor i 的bounding-box的四个坐标参数的向量,ti*是与这个positive anchor有关的ground truth的坐标向量,最后输出单独的{pi}和{ti}即分类得分和检测的位置


所以总而言之,在训练阶段,我们一共会得到四个losses:
- RPN classification (anchor good / bad)
- RPN regression (anchor -> proposal)
- Fast R-CNN classification (over classes)
- Fast R-CNN regression (proposal -> box)


【Faster R-CNN结果】


可以看到它相较于Fast R-CNN又加快了10倍,但效果却差不多


之后课程又提到了YOLO-You Only Look Once 网络,它比Faster还快,但是效果没有Faster好,这块先不记录了

原创粉丝点击