本文是卷积神经网络的笔记。

3.1 目标定位(Object Localization)

  • Classification with localization: 把一个物体在图像中框出来
  • Detection:把图像中所有物体框出来(可以是不同的类别)

下面我们考虑一个分类问题,类别为:

  1. pedestrain
  2. car
  3. motorcycle
  4. background
    其中前面3类,我们称为图像中有物体。

记号:

  • 图片左上角记为(0,0),右下角记为(1,1),竖着为y轴
  • 框(Bounding Box)左上角为(bx,by)(b_x,b_y),框的高度和宽度(bh,bw)(b_h,b_w)
  • 输出:(一个分成3类的例子)
    y=[Pcbxbybhbwc1c2c3]y=\begin{bmatrix} Pc \\ b_x \\ b_y \\ b_h \\ b_w \\ c_1 \\ c_2 \\ c_3 \end{bmatrix}
    其中PcPc是图片中有物体的概率,bx,by,bh,bwb_x,b_y,b_h,b_w对应Bounding Box的左上角和框的高度和宽度。c1,c2,c3c_1,c_2,c_3为属于三个类别的概率。

例如

  • y=[1bxbybhbw010]y=\begin{bmatrix} 1 \\ b_x \\ b_y \\ b_h \\ b_w \\ 0 \\ 1 \\ 0 \end{bmatrix}可以框出图像中的汽车。
    y=[0???????]y=\begin{bmatrix} 0 \\ ? \\ ? \\ ? \\ ? \\ ? \\ ? \\ ? \end{bmatrix}当图像中无物体的时候,其他的数值就没有意义。

  • 损失函数的定义
    分成2类,是否检测到数据。
    L(y^,y)={i=18(yi^yi)2 if y1=1(y1^y1)2 if y1=0L(\hat{y},y)=\begin{cases} \sum_{i=1}^8(\hat{y_i}-y_i)^2 & \text{ if } y_1=1 \\ (\hat{y_1}-y_1)^2 & \text{ if } y_1=0 \end{cases}

Rq:
实际上,我们可以对不同的输出使用不同的损失函数计算方法,例如我们可以对Pc使用交叉上损失函数,对于c1,c2,c3c_1,c_2,c_3使用多分类任务的损失函数i=13cilog(ci^)\sum_{i=1}^3c_ilog(\hat{c_i})

3.2 特征点检测(Landmark Detection)

我们可以通过脸部特征点判断人物表情。
特征点也可以帮助检测人物的姿态。

  • 例如:
    我们选择64个脸部特征点,则一个常见的输出为:
    y=[pcl1xl1yl64xl64y]R129×1y=\begin{bmatrix} pc \\ l_1x \\ l_1y \\ \vdots \\ l_{64}x \\ l_{64}y \end{bmatrix} \in \mathbb{R}^{129 \times 1}

目标检测

滑动窗口法:

(以检测车辆为例)

  1. 先训练一个检测车辆的分类器,
  2. 我们先选择一个小的窗口,从左到右,从上到下滑动,检测图像中是否有待检测的物体。
  3. 如果没有可以换一个大一点的窗口试一试。

缺点:

  1. 计算速度慢

滑动窗口的卷积方法实现

将FC层变成卷积层

第三周:目标检测
Rq:
相当于一个立方体的每一个格子里依次取1。

滑动窗口的卷积方法实现

这里我们取的窗口是1414314*14*3
第三周:目标检测
Rq:

  • 我们可以这样理解,最后输出的一个蓝色放个对应原来图像上的1414314*14*3的图像,而最后一个例子中原来2828328*28*3的图像输出的结果为8848*8*4 中的每一个格子就代表了每一个窗口的检测结果。
  • 比较快的原因是因为我们可以通过矩阵乘法实现,而不用for循环,一次正向传播就可以得到所有窗口的预测结果。

缺点:
Bounding Box的边界可能不太精确

3.5 Bounding Box预测改进:YOLO算法

为了让Bounding Box更加准确

名称来源:

  • YOLO: You Only Look Once

原理:

  1. 将图分成9个Grid,每一个Grid里面的训练标签为:
    y=[Pcbxbybhbwc1c2c3]R8×1y=\begin{bmatrix} Pc \\ b_x \\ b_y \\ b_h \\ b_w \\ c_1 \\ c_2 \\ c_3 \end{bmatrix} \in \mathbb{R}^{8 \times 1}
    我们看的是框的中心,如果中心在9个Grid中间:
    y=[1bxbybhbw010]y=\begin{bmatrix} 1 \\ b_x \\ b_y \\ b_h \\ b_w \\ 0 \\ 1 \\ 0 \end{bmatrix}
  2. 所以我们的输出为(3,3,8)(3,3,8),即每一个Grid得到一个(8,1)(8,1)的向量y。一般来说我们可以把图像分得更精细一点(n,n,8)(n,n,8)

Rq:
我们采用3.4节讲的方法,只要一次卷积的正向传播。

框的描述:

第三周:目标检测

3.6 交并比

交并比(Intersection over Union,IoU)

用来评估Object Detection

IoU(A,B)=ABABIoU(A,B)=\frac{A \cap B}{A \cup B}
第三周:目标检测
Rq:

  • 紫色是我们的预测结果,红色是我们之前数据的标注。
  • 我们可以自己定一个比率说明我们的框是正确的。
  • IoUI owe youIoU \neq \text{I owe you}

3.7 非极大值抑制(Non-max suppression)

为了改进YOLO算法
⚠️ ⚠️ 对于同类物品,只有它的IoU大于阈值才会被抑制。(为了实现一个物体一个框)

当Grid足够精细的时候,可能有多个格子都预测会有汽车:
第三周:目标检测

鉴于bh,bwb_h,b_w可以大于1,所以,如果一个Grid认为它检测到了一辆车,它就会给出一个框。因此会导致对一辆车触发多次预测。但是我们可以通过非极大值抑制使得每辆车只触发1次检测。

步骤

设置一个阈值,丢弃所有pcthresholdp_c\leq threshold的框。
while(还有Boxes):

  1. 挑选同一个物体预测概率最大值,并高亮它的Bounding Box
  2. 变暗其他和高亮的框之间IoU比较高(IoU0.5IoU \geq 0.5)的框,直接丢弃。

Rq:

  1. 如果是多类别:可以对每一个类别进行一次Non-Max Suppression

3.8 Anchor Boxes

问题:Overlapping Objects
即两个物体的中心都在同一个Grid里面,则可能会导致输出异常(只有一个框)
第三周:目标检测
为了解决这个问题,我们引入横着和竖着的anchor box,见上图紫色的框,为了描述每一个Grid,我们采用
y=[pcbxbybhbwc1c2c3pcbxbybhbwc1c2c3],y1=[1bxbybhbw1001bxbybhbw010],y2=[0???????1bxbybhbw010],y=\begin{bmatrix} p_c\\ b_x\\ b_y\\ b_h\\ b_w\\ c_1\\ c_2\\ c_3\\ p_c\\ b_x\\ b_y\\ b_h\\ b_w\\ c_1\\ c_2\\ c_3\\ \end{bmatrix}, y_1=\begin{bmatrix} 1\\ b_x\\ b_y\\ b_h\\ b_w\\ 1\\ 0\\ 0\\ 1\\ b_x\\ b_y\\ b_h\\ b_w\\ 0\\ 1\\ 0\\ \end{bmatrix},y_2= \begin{bmatrix} 0\\ ?\\ ?\\ ?\\ ?\\ ?\\ ?\\ ?\\ 1\\ b_x\\ b_y\\ b_h\\ b_w\\ 0\\ 1\\ 0\\ \end{bmatrix},

Rq:

  • 每个物体的框属于跟原来训练标签中的框有最高的IoU的框。
  • 如果上图就可以用y1y_1来描述,其中上半部分为Anchor Box1,对应的是站立着的人(因为一开始训练标签里人的样子是竖着的,因此和AnchorBox的IoU值最大。)
  • 如果Grid中只有车,则它对应的为y2y_2

缺点:

  1. 如果有大于等于3种类别
  2. 如果两个物体的Anchor Box形状相同。

Rq:

  1. 可以用K-Means聚类寻找Anchor Box的形状,否则要手动设置。

3.9 YOLO算法

训练集合

每一个Grid对应一个y,y的值为8Anchor8*Anchor

第三周:目标检测

具体步骤

  1. 对于每一个Grid得到基于两个Anchor Box的预测。
    第三周:目标检测
  2. 去除概率比较低的预测
    第三周:目标检测
  3. 对于每一类调用Non-Max Suppression 得到最后的结果:
    第三周:目标检测

3.10 Region proposal: R-CNN (Regions with CNN)

YOLO可能会更快。

R-CNN

通过图像分割算法(Segmentation),将图片分成若干块,再在每块上运行Detection的神经网络。这样避免了直接使用CNN导致在一些没有待识别物体的窗口上浪费时间。

Fast R-CNN

在R-CNN的基础上引入了卷积的滑动窗法,加快了Detection的处理速度。

Faster R-CNN

使用了神经网络来分割图像,加快了得到候选区域的速度。

第三周测试重点:

  1. 分成3类:行人(c=1),汽车(c=2),摩托车(c=3)。
    下图中的标签哪个是正确的?注:y=[pc,bx,by,bh,bw,c1,c2,c3][p_c,b_x,b_y,b_h,b_w,c_1,c_2,c_3]
    第三周:目标检测
    y=[1, 0.3, 0.7, 0.3, 0.3, 0, 1, 0] //横着是x轴
    第三周:目标检测
    y=[0, ?, ?, ?, ?, ?, ?, ?]

  2. 计算IoU,左上角方块22,右下角方块23
    第三周:目标检测
    1122+2311=19\frac{1*1}{2*2+2*3-1*1}=\frac{1}{9}

  3. Non-Max Suppression
    假如你在下图中的预测框中使用非最大值抑制,其参数是放弃概率≤ 0.4的框,并决定两个框IoU的阈值为0.5,使用非最大值抑制后会保留多少个预测框?
    第三周:目标检测
    答案:5个,对于同类物品,只有它的IoU大于阈值才会被抑制。(为了实现一个物体一个框)

  4. 假如你使用YOLO算法,使用19x19格子来检测20个分类,使用5个锚框(anchor box)。在训练的过程中,对于每个图像你需要输出卷积后的结果y作为神经网络目标值(这是最后一层),y可能包括一些“?”或者“不关心的值”。请问最后的输出维度是多少?
    答案:19x19x(5x25),其中1+4+20=251+4+20=25
    (1个数值输出+4个Bounding Box的坐标+20个类别的0/1值)*anchor box的数量。

相关文章: