吴恩达Coursera深度学习课程 deeplearning.ai (4-3) 目标检测--课程笔记

3.1 目标定位

图片检测问题

  • 分类问题:判断图中是否为汽车;
  • 目标定位:判断是否为汽车,并确定具体位置(框起来);
  • 目标检测:检测不同物体并定位。

image

图片定位的神经网络结构

  • 假设我们要定位图片中:行人,汽车,摩托以及背景(没有符合条件的)并定位。
  • 假设每张图片上只能出现一个目标。

标记四类存在与否,定位需要定位目标中心坐标(b_x, b_y)以及图片的高度(b_h)和宽度(b_w)

image

损失函数

输出函数

y_hat 为softmax 的输出,为八个元素

  • 第一个元素 P_c 表示是否有物体(1/0)
  • 接下来四个元素定位目标(b_x, b_y, b_h, b_w),
  • 最后三个元素表示是否是行人(c1:1/0),是否是汽车(c2:1/0)是否是摩托(c3:1/0)
损失函数

Loss:

  • 如果 P_c = 1 表示有目标出现,则 Loos = 8个元素各自的差的平方之和
  • 如果 P_c = 0 表示没有目标出现,则 Loos = P_c的差的平方

image

3.2 特征点检测

卷积神经网络可以标记图片上的某些特征点的位置

  • 比如识别人脸的各个特征点(眼角, 嘴角,鼻尖,下巴等)来识别人们的面部表情
  • 比如通过身体上一系列特征点识别运动员的姿态

如果要识别 m 个特征点,则卷积神经网络的softmax 输出需要有2m+1个元素,第一个代表是否出现该目标,其余每2个元素表示一个特征点的 x坐标和 y 坐标。

image

3.3 目标检测

目标检测采用的是基于滑动窗口的检测算法。

训练模型

  • 训练集X:将有汽车的图片进行适当的剪切,剪切成整张几乎都被汽车占据的小图或者没有汽车的小图;
  • 训练集Y:对X中的图片进行标注,有汽车的标注1,没有汽车的标注0。

image

滑动窗口目标检测

利用滑动窗口在实际图片中实现目标检测。

  • 首先选定一个特定大小的窗口,将窗口内的图片输入到模型中进行预测;
  • 以固定步幅滑动该窗口,遍历图像的每个区域,对窗内的各个小图不断输入模型进行预测;
  • 继续选取一个更大的窗口,再次遍历图像的每个区域,对区域内是否有车进行预测;
  • 遍历整个图像,可以保证在每个位置都能检测到是否有车。
    image
缺点
  • 窗口大,步幅大,则预测不够准确
  • 窗口小,步幅小,则计算成本巨大

3.4 卷积的滑动窗口实现

将全连接层转化为卷积层

思路:使用和图片完全一致(高度/宽度/深度)的卷积核可以将输出定位到单个元素上,那么使用 n 个卷积核就可以将图片定位到深度为 n 的单位图像上,用来表示全连接中的 n 维列向量。

image

利用类似卷积核的原理实现滑动窗口

采用和单个窗口同样的各层的卷积核来操作图片,可以一次性将所有滑动窗口的结果计算出来,这个原理和卷积核的滑动有异曲同工之妙。

image

优点:不用每个窗口单独进行计算了,大大减少了计算量。

缺点:定位的目标边界框不够精准

3.5 Bounding Box 预测

上一节滑动窗口算法,大大减少计算量,但是定位的目标边界框不够精确,比如汽车是一个长方形,或者正好跨越两个窗口的时候。

YOLO 算法

  • 将图片分割成n×n个小的图片
  • 在图像的n×n个格子中分别应用图片分类和定位算法
    • 卷积核方式一次计算出所有格子的结果, 计算效率较高
  • 每个格子的输出为8个元素(P_c, b_x, b_y, b_h, b_w, c1, c2, c3),则所有格子的结果为 nxnx8

image

目标定位

  • 对于每个网格,以左上角为(0,0),以右下角为(1,1);
  • 中点b_x、b_y 表示坐标值,在0~1之间;
  • 宽高b_h、b_w 表示比例值,存在>1的情况。

image

3.6 交并比(Intersection over union)

交并比(IOU):交集大小/并集大小,用来检测预测边界框的准确性。

image

一般IOU >= 0.5 就认为可以了,当然你可以定义更严格的标准比如0.6,最好的情况是1,完全重合。

3.7 非极大值抑制

上一节的检测中,可能多个格子都认为自己是中心,检测到了一辆车,那么同一辆车就可能被检出多次,非最大值抑制可以确保我们的算法对每个对象只检测一次。(预测的形状面积重合多的认为是重复的,只保留概率最高的那个)

image

以单个对象检测为例

  • 对于图片每个网格预测输出矩阵:yi=[P_c, b_x, b_h, b_w],其中P_c表示有对象的概率
  • 抛弃P_c <= 0.6的边界框
  • 对剩余的边界框(while):
    • 选取最大Pc值的边界框,作为预测输出边界框;
    • 抛弃和选取的边界框IoU⩾0.5的剩余的边界框。

对于多对象检测,输出标签中就会有多个分量。正确的做法是:对每个输出类别分别独立进行一次非最大值抑制。

3.8 Anchor Boxes

使用Anchor box 可以同时检测出多个对象。

原理

对于重叠的目标,这些目标的中点有可能会落在同一个网格中,对于我们之前定义的输出:y_i =[P_c, b_x, b_y, b_h, b_w, c_1, c_2, c_3],只能得到一个目标的输出。

而Anchor box 则是预先定义多个不同形状的Anchor box(一般为两个,矮胖型和瘦高型),我们需要把预测目标对应地和各个Anchor box 关联起来,所以我们重新定义目标向量:
y_i=[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 …]
用这样的多目标向量分别对应不同的Anchor box,从而检测出多个重叠的目标。

  • 不使用Anchor box:训练图片中的每个对象,根据对象的中点,分配到对应的格子中。输出大小(例如8):n×n×8
  • 使用Anchor box:训练图片的每个对象,根据对象的中点,分配到对应的格子中,同时还分配到一个和对象形状的IoU最高的Anchor box 中。输出大小(例如两个Anchor box):n×n×16

image

难点问题:

  • 如果我们使用了两个Anchor box,但是同一个格子中却有三个对象的情况,此时只能用一些额外的手段来处理;
  • 同一个格子中存在两个对象,但它们的Anchor box 形状相同,此时也需要引入一些专门处理该情况的手段。

但是以上的两种问题出现的可能性不会很大,对目标检测算法不会带来很大的影响。

Anchor box 的选择

  • 一般人工指定Anchor box 的形状,选择5~10个以覆盖到多种不同的形状,可以涵盖我们想要检测的对象的形状;
  • 高级方法:K-means 算法:将不同对象形状进行聚类,用聚类后的结果来选择一组最具代表性的Anchor box,以此来代表我们想要检测对象的形状。

3.9 YOLO 算法

假设我们要在图片中检测三种目标:行人、汽车和摩托车,同时使用两种不同的Anchor box。

训练集

  • 输入X:同样大小的完整图片;
  • 目标Y:使用3×3
  • 网格划分,输出大小3×3×2×8,或者3×3×16
  • 对不同格子中的小图,定义目标输出向量Y。

image

模型预测

输入与训练集中相同大小的图片,同时得到每个格子中不同的输出结果:3×3×2×8

image

运行非最大值抑制(NMS)

行人,汽车,摩托 分别进行

image

3.10 候选区域(region proposals)

R-CNN(Regions with convolutional networks): 在图片中选出一些目标的候选区域,在候选区域的窗口上运行卷积网络,从而避免了传统滑动窗口在大量无对象区域的无用运算。

具体实现:运用图像分割算法,将图片分割成许多不同颜色的色块,然后在这些色块上放置窗口,将窗口中的内容输入网络,从而减小需要处理的窗口数量。

image

更快的算法

  • R-CNN:给出候选区域,对每个候选区域进行分类识别,输出对象 标签 和 bounding box,从而在确实存在对象的区域得到更精确的边界框,但速度慢;
  • Fast R-CNN:给出候选区域,使用滑动窗口的卷积实现去分类所有的候选区域,但得到候选区的聚类步骤仍然非常慢;
  • Faster R-CNN:使用卷积网络给出候选区域。

R-CNN 应用较少,速度和应用的频率都不如 YOLO 算法。

猜你喜欢

转载自blog.csdn.net/haoyutiangang/article/details/81025249