目录

  • 目标定位/对象检测
  • 特征点检测
  • 基于滑动窗口的对象检测
  • YOLO算法
  • 其它算法

一、目标定位/对象检测

图像分类:一般图像中只有一个对象,判断图像属于哪一类

分类定位问题:找出图像中的对象并识别出对象属于哪一类(一个边界框来表示在图像中的位置)

对象检测:一般有多个对象,找出图像中的对象(一个边界框来表示在图像中的位置)

深度学习——目标检测[12]

  • 分类定位实例

识别图中的对象:判断属于哪一类(pedestrian, car, motorcycle, background)。background表示没有任何对象

定位对象的位置:$b_x$, $b_y$是对象所在位置的中心点,$b_w$,$b_h$是对象的大小

深度学习——目标检测[12]

输出的label y:假设要识别的类别有3种,则label中的元素如下

$p_c$ $b_x$ $b_y$ $b_w$ $b_h$ $c_1$ $c_2$ $c_3$

是否有对象,1表示有

0表示没有(只有背景)

如果只有背景,则其他就不用关注了

对象中心点的x位置 对象中心的y位置 对象的宽度 对象的高度 对象属于类1的概率 对象属于类2的概率 对象属于类3的概率

定义loss函数: $L(\widehat{y}, y) = \sum(\widehat{y}_i, y_i)^2$ 

对8个结果分别求差平方和(也可以每个参数用不同函数来进行误差估计)

当pc=0时(也就是没有对象时),只关注pc的结果是否正确,其它结果不重要,loss也就只计算pc的结果

二、特征点检测landmark

通过让神经网络输出一些关键点(landmark)位置来识别一个对象。下面是一些例子

注:关键点label的表示在每张图上要一致,比如图2中总是用$l1$来表示左侧的眼角

深度学习——目标检测[12] 深度学习——目标检测[12] 深度学习——目标检测[12]
$b_x, b_y, b_w, b_h$ $l_{1x}, l_{1y}\\l_{2x}, l_{2y}\\...\\l_{64x}, l_{64y}$ $l_{1x}, l_{1y}\\l_{2x}, l_{2y}\\...\\l_{32x}, l_{32y}$

三、基于滑动窗口的对象检测

例:汽车检测

训练集:对图像进行适当裁剪,把裁剪后的部分作为输入,判断是否包含车

深度学习——目标检测[12]

滑动窗口检测sliding windows detection:用一个框(窗口),移动遍历图像的各区域,把框内的图像作为ConV网络的输入进行计算

 深度学习——目标检测[12]

滑动窗口检测问题:计算的代价太大

解决计算量大的问题:利用卷积计算共享窗口公共部分的结果以减少计算量

具体实现方式

  • 把conv net中的全连接层转换为卷积层:5x5x16全连接得到400个元素—>(5x5x16)*(5x5x16)400卷积结果为1x1x400。最后输出为包含4个元素的向量,则可以看作1x1x4
  • 训练数据为16x16x3,滑动窗口大小为14x14x3,步长为2
    • 若单独计算,需要裁剪并依次输入网络中计算4次,而且4个窗口中的公共部分在每次计算时都会重新计算一遍(X)
    • 直接对整张图进行卷积计算,最后输出的4个色块与输入的四个色块是对应的,也就是每个窗口的结果(√)

深度学习——目标检测[12]

[Sermanet et al., 2014. OverFeat: Integrated recognition, localization and detection using convolutional networks]

四、YOLO算法you only look once

[Redmon et al., 2015, You Only Look Once: Unified real-time object detection]

利用卷积实现滑动窗口检测的缺点:窗口的大小位置并不一定那么准确,无法获得精确的边界

  • 基本思想

把图片分成3x3(或更多)个格子,接着对每个格子执行图像分类和定位方法,每个格子有一个输出label(8个值)

    • label中标记一个物体属于一个格子:以物体的中心点为准,中心点在哪个格子,它就属于哪个格子。如果一个格子中不包含物体的中心点,即使有很多部分落在其中,也认为该格子不包含物体
    • 一个格子包含多个物体?:就是格子中有多个物体的中心点。实际中使用19x19的划分得更精细,这种情况就会更少一些
    • 每个格子都要执行一次?:利用卷积,只要单次卷积即可完成。YOLO的执行速度很快,甚至可以达到实时检测
  • 如何定义物体位置
深度学习——目标检测[12] 物体的位置是相对于它所在的格子来说,而不是整个图像。中心点的值在(0, 1),而宽高取值可以大于1
  • 如何评价物体检测算法是否正确

交并比IoU:intersection over union,就是两个区域交集与并集的比,一般规定0.5以上就说明结果是正确的,也可以定得更高

深度学习——目标检测[12] IoU=实际大小的黄色区域/检测出来的绿色区域大小
  • 一个物体被多个格子检测的问题

问题:如果对一个图像划分19x19格,每个格子都有可能说自己包含了一个对象(如车子),也就是一个车子被多个格子检测

non-max suppersion:非最大抑制算法

深度学习——目标检测[12]

(如果有多种物体则每种执行一次non-max)

执行算法得到结果:[$p_c$ $b_x$ $b_y$ $b_h$ $b_w$]

剔除所有$p_c<threshold$,也就是包含物体的概率小于限值的格子

while 还有格子没有判断过

  找出$p_c$最大的格子

  抑制与上一步格子$IoU \geqslant 0.5$的格子

  • 一个格子包含多个物体的中心点的问题

基本思想:定义多种anchor box形状,在输出标签中包括了这些anchor box,检测到一个物体的话,既要看它的中心点位置,还要看它和哪个anchor box的IoU最高来决定

深度学习——目标检测[12]

问题:如何选择anchor box的类型; 如果给了两个anchor box,但是有三种形状的话,算法效果不好;事实上,如果格子多一些,一个格子有多个物体的问题就会少一些

 五、其它算法

R-CNN:region with CNN

思想:对图像进行分割,接着从中选取候选区域再执行算法,而不是对整个图像所有区域计算(因为有些区域没有必要检测,如左下角位置不可能存在物体)

在计算机视觉领域用的比较多

[Girshik et.al, 2013, Rich feature hierarchies for accurate object detection and semantic segmentation]

深度学习——目标检测[12]

 Fast R-CNN:利用滑动窗口的卷积实现来区分预设的区域

[Girshik, 2015, Fast R-CNN]

Faster R-CNN:用卷积网络来找出预设的区域

[Ren et. al, 2016. Faster R-CNN: Towards real-time object detection with region proposal networks]