Python 全栈体系【四阶】(三十八)

第五章 深度学习

八、目标检测

3. 目标检测模型

3.2 YOLO 系列
3.2.1 YOLOv1(2016)
3.2.1.1 基本思想

YOLO(You Only Look Once )是继 RCNN,fast-RCNN 和 faster-RCNN 之后,Ross Girshick 针对 DL 目标检测速度问题提出的另一种框架,其核心思想是生成 RoI+目标检测两阶段(two-stage)算法用一套网络的一阶段(one-stage)算法替代,直接在输出层回归 bounding box 的位置和所属类别。

之前的物体检测方法首先需要产生大量可能包含待检测物体的先验框, 然后用分类器判断每个先验框对应的边界框里是否包含待检测物体,以及物体所属类别的概率或者置信度,同时需要后处理修正边界框,最后基于一些准则过滤掉置信度不高和重叠度较高的边界框,进而得到检测结果。这种基于先产生候选区再检测的方法虽然有相对较高的检测准确率,但运行速度较慢。

YOLO 创造性的将物体检测任务直接当作回归问题(regression problem)来处理,将候选区和检测两个阶段合二为一。只需一眼就能知道每张图像中有哪些物体以及物体的位置。下图展示了各物体检测系统的流程图。

实际上,YOLO 并没有真正去掉候选区,而是采用了预定义候选区的方法,也就是将图片划分为 7*7 个网格,每个网格允许预测出 2 个边框,总共 49*2 个 bounding box,可以理解为 98 个候选区域,它们很粗略地覆盖了图片的整个区域。YOLO 以降低 mAP 为代价,大幅提升了时间效率。

每个网格单元预测这些框的 2 个边界框和置信度分数。这些置信度分数反映了该模型对框是否包含目标的可靠程度,以及它预测框的准确程度。置信度定义为:

Pr ⁡ ( Object ) ∗ IOU pred truth \Pr(\textrm{Object})\ *\ \textrm{IOU}_{\textrm{pred}}^{\textrm{truth}} Pr(Object) ∗ IOUpredtruth

如果该单元格中不存在目标,则置信度分数应为零。否则,我们希望置信度分数等于预测框与真实值之间联合部分的交集(IOU)。

每个边界框包含 5 个预测: x x x, y y y, w w w, h h h和置信度。 ( x , y ) (x,y) (x,y)坐标表示边界框相对于网格单元边界框的中心。宽度和高度是相对于整张图像预测的。最后,置信度预测表示预测框与实际边界框之间的 IOU。

每个网格单元还预测 C C C个条件类别概率 Pr ⁡ ( Class i ∣ Object ) \Pr(\textrm{Class}_i | \textrm{Object}) Pr(Classi∣Object)。这些概率以包含目标的网格单元为条件。每个网格单元我们只预测的一组类别概率,而不管边界框的的数量 B B B是多少。

3.2.1.2 网络结构

YOLOv1 网络有 24 个卷积层,后面是 2 个全连接层。我们只使用 1 × 1 1 \times 1 1×1降维层,后面是 3 × 3 3 \times 3 3×3卷积层。如下图所示:

为了快速实现快速目标检测,YOLOV1 还训练了快速版本。快速 YOLO 使用具有较少卷积层(9 层而不是 24 层)的神经网络,在这些层中使用较少的滤波器。除了网络规模之外,YOLO 和快速 YOLO 的所有训练和测试参数都是相同的。网络的最终输出是 7*7*30(1470)的预测张量。

3.2.1.3 训练过程与细节

(1)预训练。采用前 20 个卷积层、平均池化层、全连接层进行了大约一周的预训练;

(2)输入。输入数据为 224*224 和 448*448 大小的图像;

(3)采用相对坐标。通过图像宽度和高度来规范边界框的宽度和高度,使它们落在 0 和 1 之间;边界框 x x x和 y y y坐标参数化为特定网格单元位置的偏移量,边界也在 0 和 1 之间;

(4)损失函数

  • 损失函数由坐标预测、是否包含目标物体置信度、类别预测构成;
  • 其中 1 i o b j 1_i^{obj} 1iobj表示目标是否出现在网格单元 i i i中,表示 1 i j o b j 1_{ij}^{obj} 1ijobj网格单元 i i i中的第 j j j个边界框预测器"负责"该预测;
  • 如果目标存在于该网格单元中(前面讨论的条件类别概率),则损失函数仅惩罚分类错误;
  • 如果预测器"负责"实际边界框(即该网格单元中具有最高 IOU 的预测器),则它也仅惩罚边界框坐标错误。

(5)学习率。第一个迭代周期,慢慢地将学习率从 1 0 − 3 10^{-3} 10−3提高到 1 0 − 2 10^{-2} 10−2;然后继续以 1 0 − 2 10^{-2} 10−2的学习率训练 75 个迭代周期,用 1 0 − 3 10^{-3} 10−3的学习率训练 30 个迭代周期,最后用 1 0 − 4 10^{-4} 10−4的学习率训练 30 个迭代周期。

(6)避免过拟合策略。使用 dropout 和数据增强来避免过拟合。

3.2.1.4 优点与缺点

(1)优点

  • YOLO 检测物体速度非常快,其增强版 GPU 中能跑 45fps(frame per second),简化版 155fps
  • YOLO 在训练和测试时都能看到一整张图的信息(而不像其它算法看到局部图片信息),因此 YOLO 在检测物体是能很好利用上下文信息,从而不容易在背景上预测出错误的物体信息
  • YOLO 可以学到物体泛化特征

(2)缺点

  • 精度低于其它 state-of-the-art 的物体检测系统
  • 容易产生定位错误
  • 对小物体检测效果不好,尤其是密集的小物体,因为一个栅格只能检测 2 个物体
  • 由于损失函数的问题,定位误差是影响检测效果的主要原因,尤其是大小物体处理上还有待加强
3.2.2 YOLOv2(2016)

Ross Girshick 吸收 fast-RCNN 和 SSD 算法,设计了 YOLOv2(论文原名《YOLO9000: Better, Faster, Stronger 》),在精度上利用一些列训练技巧,在速度上应用了新的网络模型 DarkNet19,在分类任务上采用联合训练方法,结合 wordtree 等方法,使 YOLOv2 的检测种类扩充到了上千种,作者在论文中称可以检测超过 9000 个目标类别,所以也称 YOLO9000. YOLOv2 模型可以以不同的尺寸运行,从而在速度和准确性之间提供了一个简单的折衷,在 67FPS 时,YOLOv2 在 VOC 2007 上获得了 76.8 mAP。在 40FPS 时,YOLOv2 获得了 78.6 mAP,比使用 ResNet 的 Faster R-CNN 和 SSD 等先进方法表现更出色,同时仍然运行速度显著更快。

3.2.2.1 改进策略

YOLOv2 对 YOLOv1 采取了很多改进措施,以提高模型 mAP,如下图所示:

(1)Batch Normalization(批量正则化)。YOLOv2 中在每个卷积层后加 Batch Normalization(BN)层,去掉 dropout. BN 层可以起到一定的正则化效果,能提升模型收敛速度,防止模型过拟合。YOLOv2 通过使用 BN 层使得 mAP 提高了 2%。

(2)High Resolution Classifier(高分辨率分类器)。原来的 YOLO 网络在预训练的时候采用的是 224*224 的输入(这是因为一般预训练的分类模型都是在 ImageNet 数据集上进行的),然后在 detection 的时候采用 448*448 的输入,这会导致从分类模型切换到检测模型的时候,模型还要适应图像分辨率的改变。而 YOLOv2 则将预训练分成两步:先用 224*224 的输入从头开始训练网络,大概 160 个 epoch(表示将所有训练数据循环跑 160 次),然后再将输入调整到 448*448,再训练 10 个 epoch。注意这两步都是在 ImageNet 数据集上操作。最后再在检测的数据集上 fine-tuning,也就是 detection 的时候用 448*448 的图像作为输入就可以顺利过渡了。作者的实验表明这样可以提高几乎 4%的 mAP。

(3)Convolutional With Anchor Boxes。 YOLOv1 利用全连接层直接对边界框进行预测,导致丢失较多空间信息,定位不准。YOLOv2 去掉了 YOLOv1 中的全连接层,使用 Anchor Boxes 预测边界框,同时为了得到更高分辨率的特征图,YOLOv2 还去掉了一个池化层。由于图片中的物体都倾向于出现在图片的中心位置,若特征图恰好有一个中心位置,利用这个中心位置预测中心点落入该位置的物体,对这些物体的检测会更容易。所以总希望得到的特征图的宽高都为奇数。YOLOv2 通过缩减网络,使用 416*416 的输入,模型下采样的总步长为 32,最后得到 13*13 的特征图,然后对 13*13 的特征图的每个 cell 预测 5 个 anchor boxes,对每个 anchor box 预测边界框的位置信息、置信度和一套分类概率值。使用 anchor boxes 之后,YOLOv2 可以预测 13*13*5=845 个边界框,模型的召回率由原来的 81%提升到 88%,mAP 由原来的 69.5%降低到 69.2%.召回率提升了 7%,准确率下降了 0.3%。

(4)Dimension Clusters(维度聚类)。在 Faster R-CNN 和 SSD 中,先验框都是手动设定的,带有一定的主观性。YOLOv2 采用 k-means 聚类算法对训练集中的边界框做了聚类分析,选用 boxes 之间的 IOU 值作为聚类指标。综合考虑模型复杂度和召回率,最终选择 5 个聚类中心,得到 5 个先验框,发现其中中扁长的框较少,而瘦高的框更多,更符合行人特征。通过对比实验,发现用聚类分析得到的先验框比手动选择的先验框有更高的平均 IOU 值,这使得模型更容易训练学习。


VOC和COCO的聚类边界框尺寸。我们对边界框的维度进行k-means聚类,以获得我们模型的良好先验。左图显示了我们通过对k的各种选择得到的平均IOU。我们发现k=5给出了一个很好的召回率与模型复杂度的权衡。右图显示了VOC和COCO的相对中心。这两种先验都赞成更薄更高的边界框,而COCO比VOC在尺寸上有更大的变化。

(5)New Network(新的网络)。 YOLOv2 采用 Darknet-19,其网络结构如下图所示,包括 19 个卷积层和 5 个 max pooling 层,主要采用 3*3 卷积和 1*1 卷积,这里 1*1 卷积可以压缩特征图通道数以降低模型计算量和参数,每个卷积层后使用 BN 层以加快模型收敛同时防止过拟合。最终采用 global avg pool 做预测。采用 YOLOv2,模型的 mAP 值没有显著提升,但计算量减少了。

(6)直接定位预测(Direct location Prediction) 。 Faster R-CNN 使用 anchor boxes 预测边界框相对先验框的偏移量,由于没有对偏移量进行约束,每个位置预测的边界框可以落在图片任何位置,会导致模型不稳定,加长训练时间。YOLOv2 沿用 YOLOv1 的方法,根据所在网格单元的位置来预测坐标,则 Ground Truth 的值介于 0 到 1 之间。网络中将得到的网络预测结果再输入 sigmoid 函数中,让输出结果介于 0 到 1 之间。设一个网格相对于图片左上角的偏移量是 c x , c y c_x,c_y cx,cy。先验框的宽度和高度分别是 p w p_w pw和 p h p_h ph,则预测的边界框相对于特征图的中心坐标 ( b x , b y ) (b_x,b_y) (bx,by)和宽高 b w , b h b_w,b_h bw,bh的计算公式如下图所示。

其中, σ \sigma σ为 sigmoid 函数; t x , t y t_x,t_y tx,ty是预测 的坐标偏移值(中心点坐标); t w , t h t_w, t_h tw,th是尺度缩放,分别经过 sigmoid,输出 0-1 之间的偏移量,与 c x , c y c_x, c_y cx,cy相加后得到 bounding box 中心点的位置。

(7)细粒度特征(Fine-Grained Features)。 YOLOv2 借鉴 SSD 使用多尺度的特征图做检测,提出 pass through 层将高分辨率的特征图与低分辨率的特征图联系在一起,从而实现多尺度检测。YOLOv2 提取 Darknet-19 最后一个 max pool 层的输入,得到 26*26*512 的特征图。经过 1*1*64 的卷积以降低特征图的维度,得到 26*26*64 的特征图,然后经过 pass through 层的处理变成 13*13*256 的特征图(抽取原特征图每个 2*2 的局部区域组成新的 channel,即原特征图大小降低 4 倍,channel 增加 4 倍),再与 13*13*1024 大小的特征图连接,变成 13*13*1280 的特征图,最后在这些特征图上做预测。使用 Fine-Grained Features,YOLOv2 的性能提升了 1%。

(8)多尺度训练(Multi-Scale Training)。 YOLOv2 中使用的 Darknet-19 网络结构中只有卷积层和池化层,所以其对输入图片的大小没有限制。YOLOv2 采用多尺度输入的方式训练,在训练过程中每隔 10 个 batches,重新随机选择输入图片的尺寸,由于 Darknet-19 下采样总步长为 32,输入图片的尺寸一般选择 32 的倍数{320,352,...,608}(最小的选项是 320×320,最大的是 608×608。我们调整网络的尺寸并继续训练)。采用 Multi-Scale Training, 可以适应不同大小的图片输入,当采用低分辨率的图片输入时,mAP 值略有下降,但速度更快,当采用高分辨率的图片输入时,能得到较高 mAP 值,但速度有所下降。


YOLOv2比先前的检测方法更快,更准确。它也可以以不同的分辨率运行,以便在速度和准确性之间进行简单折衷

3.2.2.2 训练过程
  • 第一阶段:现在 ImageNet 分类数据集上训练 Darknet-19,此时模型输入为 224*224,共训练 160 轮
  • 第二阶段:将网络输入调整为 448*448,继续在 ImageNet 分类数据集上训练细调模型,共 10 轮,此时分类模型 top-1 准确率为 76.5%,而 top-5 准确度为 93.3%
  • 第三阶段:修改 Darknet-19 分类模型为检测模型,并在检测数据集上继续细调网络
3.2.2.3 优点与缺点

(1)优点

  • YOLOv2 使用了一个新的分类器作为特征提取部分,较多使用了 3*3 卷积核,在每次池化后操作后把通道数翻倍。网络使用了全局平均池化,把 1*1 卷积核置于 3*3 卷积核之间,用来压缩特征。也用了 batch normalization 稳定模型训练
  • 最终得出的基础模型就是 Darknet-19,包含 19 个卷积层,5 个最大池化层,运算次数 55.8 亿次,top-1 图片分类准确率 72.9%,top-5 准确率 91.2%
  • YOLOv2 比 VGG16 更快,精度略低于 VGG16

(2)缺点

  • YOLOv2 检测准确率不够,比 SSD 稍差
  • 不擅长检测小物体
  • 对近距离物体准确率较低
3.2.3 YOLOv3(2018)

YOLOv3 总结了自己在 YOLOv2 的基础上做的一些尝试性改进,有的尝试取得了成功,而有的尝试并没有提升模型性能。其中有两个值得一提的亮点,一个是使用残差模型,进一步加深了网络结构;另一个是使用 FPN 架构实现多尺度检测。

3.2.3.1 改进
  • 新网络结构:DarkNet-53;
  • 用逻辑回归替代 softmax 作为分类器;
  • 融合 FPN(特征金字塔网络),实现多尺度检测。
3.2.3.2 多尺度预测

YOLOv3 在基本特征提取器上添加几个卷积层,其中最后一个卷积层预测了一个三维张量------边界框,目标和类别预测。 在 COCO 实验中,为每个尺度预测 3 个框,所以对于 4 个边界框偏移量,1 个目标预测和 80 个类别预测,张量的大小为 N×N×[3 *(4 + 1 + 80)]。接下来,从前面的 2 个层中取得特征图,并将其上采样 2 倍。

YOLOv3 还从网络中的较前的层中获取特征图,并使用按元素相加的方式将其与上采样特征图进行合并。这种方法使得能够从上采样的特征图中获得更有意义的语义信息,同时可以从更前的层中获取更细粒度的信息。然后,再添加几个卷积层来处理这个组合的特征图,并最终预测出一个类似的张量,虽然其尺寸是之前的两倍。

最后,再次使用相同的设计来预测最终尺寸的边界框。因此,第三个尺寸的预测将既能从所有先前的计算,又能从网络前面的层中的细粒度的特征中获益。

3.2.3.3 网络结构

YOLOv3 在之前 Darknet-19 的基础上引入了残差块,并进一步加深了网络,改进后的网络有 53 个卷积层,取名为 Darknet-53,网络结构如下图所示(以 256*256 的输入为例):

以下是 YOLOv3 结构图:

从 YOLOv1 到 YOLOv2 再到 YOLO9000、YOLOv3, YOLO 经历三代变革,在保持速度优势的同时,不断改进网络结构,同时汲取其它优秀的目标检测算法的各种 trick,先后引入 anchor box 机制、引入 FPN 实现多尺度检测等。


不同backbone的各种网络在准确度,billions of operations,billion floating point operations per second和FPS上的比较

每个网络都使用相同的设置进行训练,并在 256×256 的图像上进行单精度测试。 运行时间是在 Titan X 上用 256×256 图像进行测量的。因此,Darknet-53 可与最先进的分类器相媲美,但浮点运算更少,速度更快。 Darknet-53 比 ResNet-101 更好,且速度快 1.5 倍。 Darknet-53 与 ResNet-152 具有相似的性能,但速度快 2 倍。

Darknet-53 也实现了最高的每秒浮点运算测量。 这意味着网络结构可以更好地利用 GPU,使它的评测更加高效,更快。这主要是因为 ResNet 的层数太多,效率不高。

3.2.3.4 效果

(1)兼顾速度与准确率。在 COCO 数据机上,mAP 指标与 SSD 模型相当,但速度提高了 3 倍;mAP 指标比 RetinaNet 模型差些,但速度要高 3.8 倍。

(2)小目标检测有所提升,但中等和更大尺寸的物体上的表现相对较差。

当然,YOLOv3 也有些失败的尝试,并未起到有效作用,请自行查阅原始论文。

相关推荐
Bruce小鬼2 分钟前
QT文件基本操作
开发语言·qt
2202_754421547 分钟前
生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
java·linux·开发语言
我只会发热14 分钟前
Java SE 与 Java EE:基础与进阶的探索之旅
java·开发语言·java-ee
LZXCyrus15 分钟前
【杂记】vLLM如何指定GPU单卡/多卡离线推理
人工智能·经验分享·python·深度学习·语言模型·llm·vllm
Enougme18 分钟前
Appium常用的使用方法(一)
python·appium
懷淰メ24 分钟前
PyQt飞机大战游戏(附下载地址)
开发语言·python·qt·游戏·pyqt·游戏开发·pyqt5
hummhumm38 分钟前
第 22 章 - Go语言 测试与基准测试
java·大数据·开发语言·前端·python·golang·log4j
宁静@星空44 分钟前
006-自定义枚举注解
java·开发语言
hummhumm1 小时前
第 28 章 - Go语言 Web 开发入门
java·开发语言·前端·python·sql·golang·前端框架
武子康1 小时前
Java-07 深入浅出 MyBatis - 一对多模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据库·sql·mybatis·springboot