上一章:深度篇——目标检测史(五) 细说 SSD 目标检测
下一章:深度篇——目标检测史(七) 细说 YOLO-V3目标检测 之 代码详解
论文地址:《YOLO-V3》
代码地址:tf_yolov3_pro
本小节,细说 YOLO-V3 目标检测,下一小节细说 YOLO-V3目标检测 之 代码详解
七. YOLO-V3 目标检测
YOLO (You Only Look Once, YOLO) 你只看一次
YOLO-V1:2015 年,YOLO-V2/9000:2017 年,YOLO-V3:2018 年
1. YOLO 代表 你只看一次。它是一种使用深度卷积神经网络学习特征来检测目标的目标检测器。YOLO 仅使用卷积层,使其成为全卷积网络 (FCN)。在下采样时,不使用 pooling层,而是使用一个步幅为 2 的卷积核对 feature maps 进行下采样操作。这样有助于防止由于 pooling 而丢失底层的特征。
2. YOLO-V3 使用 3 个不同尺度大小的 feature maps 来进行预测。在每个尺度的 feature maps 的每个位置(像素) 又都使用 3 个不同纵横比的 bounding boxes 来预测。3 个不同尺度大小的 feature maps是通过对 backbone 最后的 feature maps 的长、宽 分别 x2 进行的上采样后再与该尺度对应的 feature maps 通过 concat 而得到。而 anchors 的分布可以通过 k-means 聚类来决定 bounding boxes 的位置。在 COCO 数据集中,3 个不同尺度的 bounding boxes 对应的 anchors 分为 9 个簇,它们为:(10 x 13), (16 x 30), (33 x 23), (30 x 61), (62 x 45), (59 x 119), (116 x 90), (156 x 198), (373 x 326)
3. YOLO-V3 的步骤:
(1). 将整张图像输入,通过 CNN 提取 3 个不同尺度的 feature maps 为后面的预测做准备(分为 大、中、小 3 个尺度)。
(2). 将最小尺度的 feature maps 分为 2 份,1 份用于预测,1 份用于 upsampled,upsampled 之后得到的 feature maps 与上面 (1) 中得到的 中等尺度 的 feature maps 进行 concat,将 concat 后得到的 feature maps 再分为 2 份,1 份 用于预测,1 份 用于 upsampled,将 upsampled 之后得到的 feature maps 再与 (1) 中得到的 大尺度 的 feature maps 进行 concat,将 concat 得到的 feature maps 用来进行预测。
(3). 将 3 个尺度的 feature maps 的 iou_loss (或 giou_loss)、conf_loss、prob_loss 分别加和,再将这 3 个 loss 相加就可以得到总的 loss(因为,有时候我们需要看总 loss 是多少)。
4. YOLO-V3 流程图
darknet 的网络结构
模型和性能的参考
5. 不同尺度的预测
在 YOLO-V3 中,通过 3 个不同尺度来进行预测,检测层被具有步幅为 32、16、8 这 3 种不同尺度的 feature maps 进行检测。这就意味着,在输入 416 x 416 的情况下,将在 13 x 13、26 x 26、52 x 52 的尺度下进行检测。网络将输入图像进行下采样,直到第一个在 feature maps 上使用 步幅为 32 进行检测的检测层为止。此外,将该层 上采样 2 倍,并将与先前具有相同尺度的 feature maps concat 起来;现在,使用 步幅为 16 的层来进行另一个检测,重复相同的上采样操作过程,最后是使用 步幅为 8 的层来进行检测。
6. 输出的解释
通常的,(对于所有的目标检测来说) 卷积层学习到的所有特征将被传递到分类器或回归器上,然后分类器或回归器再进行检测预测(bounding boxes 的坐标,类别等)。在 YOLO-V3 中,是通过 1 x 1 的卷积层来畸形预测的。每个 1 x 1 大小的单元格可以预测固定数量的边界框。在深度方面,在 feature maps 中有 (B x (5 + c)) 项。
B:为每个单元格可以预测到的 bounding boxes 个数
5 + c:为每个 bounding box 所拥有的属性,用于描述每二个 bounding box 的中心坐标、维度、客观得分(foreground or background) 和 c 类 的置信度(概率)。在 YOLO-V3 预测的每个单元格有 3 个 bounding boxes。
(1). 栗子
栗如 输入图像为 416 x 416, 步幅为 32,输出的 feature maps 为 13 x 13
(2). 如果对象的中心点落在该单元格的感受野的范围内,则期望 feature maps 中饿每个单元格通过其中的一个 bounding box 预测到一个对象。这与 YOLO-V3 的训练方式有关,其中有一个 bounding box 负责检测任何给定的对象。首先,必须确定这个 bounding box 属于哪个单元格;然后选择包括对象的 ground truth box 的中心点的单元格作为负责预测对象的单元格(由 input image 映射到 prediction feature maps 上) 的中心点。
(3). 中心坐标
YOLO-V3 这里通过一个 Sigmoid 函数运行中心点坐标来进行预测。通常情况下,YOLO-V3 不预测 bounding boxes 中心点的绝对坐标,而是预测中心点坐标的偏移量:
①. 先预测对象的网络单元格的左上角 坐标值
②. 然后 将 feature maps 中单元格的大小标准化到 0 ~ 1 之间(用 Sigmoid 函数处理得) 预测 得到偏移量
③. 此时,bounding box 的绝对坐标为 ①、② 相加。
④. 栗子
栗如,以上面的 13 x 13 的 prediction feature maps 为栗,如果中心点的预测值为 (0.4, 0.7),则意味着中心点位于 (6.4, 6.7) 之上 (红色的格子为 第 7 行 第 7 列 的格子,其左上角的坐标为 (6, 6))。
但是,如果 prediction feature maps 中单元格的大小没有标准化为 0 ~ 1 之间,则预测的 (x, y) 坐标就有可能大于 1.比如 (1.2, 0.7),这就意味着中心点在 (7.2, 6.7)。此时中心点就位于红色单元格的右侧单元格,或说是在 第 7 行 第 8 列 的单元格中。这违反了 YOLO 背后的理论,因为如果红色的单元格负责预测目标,则目标的中心必须位于红色的单元格中,而不是在红色单元格旁边的单元格中。
因此,为了解决这个问题,通过一个 Sigmoid 函数的输出,将其压缩到 0 ~ 1 之间内,从而有效地将预测的中心点保持在网格中。
(4). bounding boxes 的预测尺寸
通过对输出应用对数空间转换,然后与 prediction feature maps 的大小相乘预测 bounding boxes 的尺寸,最后将 bounding boxes 映射回 input image 则可得到真实目标的大小。例如 在 13 x 13 prediction feature maps 中,预测 、 的结果为图像的宽和高的标准化(训练的标签就是这样处理的)。因此,如果包含目标的 bounding boxes 的预测值 和 为 (0.3, 0.8),那么在 13 x 13 的 prediction feature maps 上的实际宽度和高度为 (13 x 0.3, 13 x 0.8)。
(5). 客观得分 (判断前景和背景)
客观得分表现对象包含在 bounding boxes 内的概率,红色和周围的网格的概率应该接近 1,而网格角落的概率应该接近 0。客观得分也是通过 Sigmoid 函数得到,因为它被理解为一个概率。
(6). 获取最终的预测结果
对于尺寸 416 x 416 的图像,YOLO-V3 预测的 bounding boxes为:
(52 x 52 + 26 x 26 + 13 x 13) x 3 = 10647 个
然而,在图像中,只有一个目标对象,这就要将检测目标从 10647 降到 1.一般使用以下步骤来达到目的:
①. 对象概率阈值化
根据框内对象的概率进行筛选。通常,得分低于阈值的框将被忽略掉。
②. NMS (Non-Maximum Suppression, NMS) 非极大值抑制
NMS 旨在解决同一幅图像的多重检测问题。非极大值抑制,顾名思义,就是抑制不是极大值的元素,可以理解为局部最大搜索。NMS 的流程:
a. 获取目标边界框列表,并根据置信度得分(c 类概率) 进行排序。
b. 选择置信度最高的边界框添加到最终输出列表中,并将其从边界框列表中删除。
c. 计算所有边界框的面积
d. 计算置信度最高的 bounding boxes 与其他 bounding boxes 的 IOU。
e. 删除 IOU 重叠度大于阈值的 bounding boxes
f. 重复上述过程,直至 bounding boxes 列表为空。
效率与精度
上一章:深度篇——目标检测史(五) 细说 SSD 目标检测
下一章:深度篇——目标检测史(七) 细说 YOLO-V3目标检测 之 代码详解