目标检测 | yolov3 原理和介绍

前言:目标检测 | yolov2/yolo9000 原理和介绍

后续:目标检测 | yolov4 原理和介绍

1. 简介

YOLOv3是目标检测领域的一个重要进步,它在YOLOv2的基础上引入了多项关键技术和模块,显著提升了检测性能。以下是YOLOv3的一些核心改进点:

  1. 多尺度特征融合:YOLOv3通过特征金字塔网络(FPN)结构,利用不同尺度的特征图进行检测,这使得它能够更好地识别不同大小的目标 。
  2. Darknet-53主干网络:YOLOv3采用了更深的Darknet-53网络作为其主干网络,这有助于提取更丰富的特征信息 。
  3. 残差连接:借鉴了ResNet的设计,YOLOv3在网络中引入了残差连接,这有助于缓解深层网络训练中的梯度消失问题,并提高网络性能 。
  4. 改进的损失函数:YOLOv3将损失函数从softmax的交叉熵损失切换为二分类交叉熵损失,这有助于解决类别不平衡问题,提高小目标的检测准确率 。
  5. 类别预测的改进:YOLOv3使用独立的Logistic回归分类器代替了softmax来预测类别,这使得模型能够更好地处理多标签分类问题 。
  6. 多尺度训练:YOLOv3采用不同分辨率的图像进行训练,提高了模型对不同尺寸目标的泛化能力 。
  7. 数据增强:YOLOv3在训练过程中应用了大量的数据增强技术,如随机缩放、裁剪和颜色扭曲,这有助于提高模型的鲁棒性 。
  8. 锚框尺寸的优化:YOLOv3根据数据集的特点动态调整锚框的大小和比例,以提高检测精度 。

论文链接:https://arxiv.org/pdf/1804.02767

时间:2018年

作者:Joseph Redmon

代码参考:https://github.com/ultralytics/yolov3

作者在YOLOv2的基础上提出了改进的YOLOv3,并宣布退出计算机视觉研究。

2.改进策略

2.1 Bounding Box Prediction 边界框预测

按照yolov2,使用维度集群作为锚定框来预测边界框。该网络为每个边界框预测4个坐标, t x t_\text x tx, t y t_\text y ty, t w t_\text w tw, t h t_\text h th。如果单元格从图像的左上角偏移 ( c x , c y ) (c_\text x,c_\text y) (cx,cy),并且边界框先验具有宽度和高度 p w p_\text w pw, p h p_\text h ph,那么预测对应于
b x = σ ( t x ) + c x b_\text x = \sigma(t_\text x) + c_\text x bx=σ(tx)+cx
b y = σ ( t y ) + c y b_\text y = \sigma(t_\text y) + c_\text y by=σ(ty)+cy
b w = p w e t w / W b_\text w = p_\text w e^{tw} / W bw=pwetw/W
b h = p h e t h / H b_\text h = p_\text h e^{th} / H bh=pheth/H

在训练期间,我们使用平方误差损失之和。如果某个真实框的坐标是 t ^ ∗ \hat{t}^* t^∗,我们的梯度就是真实框坐标值(从真实框中计算)减去我们的预测坐标值: t ^ ∗ − t ∗ \hat{t}^*-t^* t^∗−t∗ 。这个真实框坐标值可以通过倒置上述方程轻松计算出来

YOLOv3使用逻辑回归法为每个边界框预测一个目标分数。如果边界框先验比其他边界框先验更多地与目标真实框重叠,则该分数应为 1 1 1。如果先验边界框不是最好的,但与真实框目标的重叠程度超过了某个阈值,我们就忽略这个预测。我们使用 0.5 0.5 0.5的阈值。不同的是,我们的系统只为每个真实框对象分配一个先验边界框。如果没有为一个真实框对象分配一个先验边界框,它不会对坐标或类别的预测产生任何损失,只有目标置信度。

利用逻辑回归来预测每个边界框的客观性分数

  • 正样本:如果当前预测的包围框比之前其他的任何包围框更好的与ground truth对象重合,那它的置信度就是 1。
  • 忽略样本:如果当前预测的包围框不是最好的,但它和 ground truth对象重合了一定的阈值(这里是0.5)以上,神经网络会忽略这个预测。
  • 负样本: 若bounding box 没有与任一ground truth对象对应,那它的置信度就是 0。

为什么YOLOv3要将正样本confidence score设置为1?

置信度意味着该预测框是或者不是一个真实物体,是一个二分类,所以标签是1、0更加合理。并且在学习小物体时,有很大程度会影响IOU。如果像YOLOv1使用bounding box与ground truth对象的IOU作为confidence,那么confidence score始终很小,无法有效学习,导致检测的Recall不高。
为什么存在忽略样本?

由于YOLOV3采用了多尺度的特征图进行检测,而不同尺度的特征图之间会有重合检测的部分。例如检测一个物体时,在训练时它被分配到的检测框是第一个特征图的第三个bounding box,IOU为0.98,此时恰好第二个特征图的第一个bounding box与该ground truth对象的IOU为0.95,也检测到了该ground truth对象,如果此时给其confidence score强行打0,网络学习的效果会不理想。

2.2 Class Prediction 类预测(单标签分类改进为多标签分类)

每个框都使用多标签分类法预测边界框可能包含的类别。我们不使用softmax,因为我们发现它对于良好的性能是不必要的,相反,我们只是使用独立的逻辑分类器。在训练过程中,我们使用二元交叉熵损失来进行分类预测。当我们转向更复杂的领域,如开放图像数据集[7]时,这种提法会有所帮助。在这个数据集中,有许多重叠的标签(即女人和人)。使用softmax的假设是,每个框都有一个确切的类别,但情况往往并非如此。多标签方法可以更好地模拟数据。

  • 简而言之,每个框使用多标签分类预测边界框可能包含的类。
  1. YOLOv3 使用的是logistic 分类器,而不是之前使用的softmax。
  2. 在YOLOv3 的训练中,便使用了Binary Cross Entropy ( BCE, 二元交叉熵) 来进行类别预测。

softmax被替代的原因?

(1)softmax只适用于单目标多分类(甚至类别是互斥的假设),但目标检测任务中可能一个物体有多个标签。(属于多个类并且类别之间有相互关系),比如Person和Women。

(2)logistic激活函数来完成,这样就能预测每一个类别是or不是。

2.3 Predictions Across Scales 跨尺度预测

YOLOv3在三个不同的尺度上对框进行预测。我们的系统使用类似于特征金字塔网络的概念从这些尺度上提取特征。从我们的基础特征提取器中,我们添加了几个卷积层。最后一个卷积层预测一个 3 3 3维张量,编码边界框、对象性和类别预测。在我们与COCO的实验中,我们在每个尺度上预测 3 3 3个框,所以张量是 N × N × [ 3 ∗ ( 4 + 1 + 80 ) ] N×N×[3∗(4+1+80)] N×N×[3∗(4+1+80)],用于 4 4 4个边界盒的偏移, 1 1 1个对象性预测,和 80 80 80个类别预测。

接下来,我们从前两层中提取特征图,并对其进行 2 2 2倍的上采样。我们还从网络中的早期特征图中取出一个特征图,用连接法将其与我们的上采样特征合并。这种方法使我们能够从上采样的特征中获得更有意义的语义信息,并从早期的特征图中获得更精细的信息。然后,我们再增加几个卷积层来处理这个合并的特征图,最终预测出一个类似的张量,尽管现在的张量是原来的两倍。

我们再进行一次同样的设计,以预测最终规模的框。因此,我们对第三个尺度的预测得益于所有先前的计算以及网络早期的细化特征。

我们仍然使用k-means聚类法来确定我们的边界框预设。我们只是任意地选择了 9 9 9个聚类和 3 3 3个尺度,然后在各个尺度上均匀地划分聚类。在COCO数据集上,这 9 9 9个聚类是。 ( 10 × 13 ) , ( 16 × 30 ) , ( 33 × 23 ) , ( 30 × 61 ) , ( 62 × 45 ) , ( 59 × 119 ) , ( 116 × 90 ) , ( 156 × 198 ) , ( 373 × 326 ) (10 × 13), (16 × 30), (33 × 23), (30 × 61), (62 × 45), (59 × 119), (116 × 90), (156 × 198), (373 × 326) (10×13),(16×30),(33×23),(30×61),(62×45),(59×119),(116×90),(156×198),(373×326)。

YOLOv3通过下采样32倍、16倍和8倍得到3个不同尺度的特征图。

例如输入 416 × 416 416\times416 416×416的图像,则会得到 13 × 13 13\times13 13×13, 26 × 26 26\times26 26×26, 52 × 52 52\times 52 52×52 这 3 3 3个尺度的特征图。每种尺度的特征图上可以得到 N × N × [ 3 ∗ ( 4 + 1 + 80 ) ] = N ∗ N ∗ 85 N × N × [3 ∗ (4 + 1 + 80)]=N*N*85 N×N×[3∗(4+1+80)]=N∗N∗85 的结果(分别是 N × N N \times N N×N个 gird cell , 3 3 3种尺度的anchor boxes, 4 4 4个边界框偏移值、 1 1 1个目标预测置信度以及 80 80 80种类别的预测概率。)

最终输出 [ 13 × 13 × 255 ] 、 [ 26 × 26 × 255 ] 、 [ 52 × 52 × 255 ] [13 \times 13 \times 255]、[26 \times 26 \times 255]、[52 \times 52 \times 255] [13×13×255]、[26×26×255]、[52×52×255]

CBL组件:卷积+BN+Leaky ReLU CBL是YOLOv3的基本组件,由卷积层(Convolution)、批量归一化层(Batch

Normalization)和Leaky

ReLU激活函数组成。卷积层负责提取图像特征,批量归一化层则能够加速网络训练并提高模型性能,而Leaky

ReLU激活函数则解决了ReLU函数在负数区域的问题,使得网络能够更好地学习非线性特征。

res_block是Darknet-53网络中的关键组件,其基本结构由多个残差单元(res_unit)组成。残差块通过引入短路连接(shortcut

connection)来解决深度神经网络中的梯度消失问题。在残差块中,输入会被复制并添加到经过一系列卷积和激活函数处理后的输出上,从而保证了梯度的有效传递。这种设计使得网络能够更好地学习深层次的特征表示。

2.4 Feature Extractor 特征提取

我们使用一个新的网络来进行特征提取。新网络是YOLOv2中使用的网络、Darknet-19和新式的Darknet网络之间的一种混合方法。我们的网络使用连续的 3 × 3 3×3 3×3和 1 × 1 1×1 1×1卷积层,但现在也有一些快捷连接,而且明显更大。它有53个卷积层,所以我们把它叫做...Darknet-53!

这个新网络比Darknet19强大得多,但仍然比ResNet-101或ResNet-152更有效率。下面是一些ImageNet的结果

将darknet-19里加入了ResNet残差连接,改进之后的模型叫Darknet-53 Darknet-53主要做了如下改进:

(1)没有采用最大池化层,转而采用步长为2的卷积层进行下采样。

(2)为了防止过拟合,在每个卷积层之后加入了一个BN层和一个LeakyReLU。

(3)引入了残差网络的思想,目的是为了让网络可以提取到更深层的特征,同时避免出现梯度消失或爆炸。

(4)将网络的中间层和后面某一层的上采样进行张量拼接,达到多尺度特征融合的目的。

Darknet-53的性能与最先进的分类器相当,但浮点运算更少,速度更快。Darknet-53还实现了每秒最高的浮点运算。这意味着网络结构更好地利用了GPU,使其评估更高效,从而更快.

2.5 Training 训练

我们仍然在完整的图像上进行训练,没有硬性的负面挖掘或任何这些东西。我们使用多尺度训练,大量的数据增强,批量归一化,所有标准的东西。我们使用Darknet神经网络框架进行训练和测试。

3. 损失函数

论文中没有提及,参考
博客:(最简单)深度理解YOLOV3损失函数及anchor box

3.1 矩形框中心点误差(第一项)

其中 ( x i j , y i j ) (x^{j}_i,y^{j}i) (xij,yij)是网络预测目标的中心坐标, ( x ^ i j , y ^ i j ) (\hat{x}^j_i, \hat{y}^j_i) (x^ij,y^ij)是gt中心坐标。 1 i j o b j 1{i j}^{o b j} 1ijobj 指的是第 i i i 个单元格存在目标,且该单元格中的第 j j j 个边界框负责预测该目标,如果该矩形框负责预测一个目标则其大小为1,否则等于0。 λ _ c o o r d = 2 − w ^ i j ∗ h ^ i j \lambda\_coord =2-\hat{w}_i^j * \hat{h}_i^j λ_coord=2−w^ij∗h^ij ,当矩形框的大小比较小时,这个系数就更大,从而增大了小矩形框对损失函数的贡献,相反当矩形框比较大时,该系数也就更小,从而消减了大矩形框对损失函数的贡献。因此,该函数计算了所有网格 ( i = 0 , . . . , S 2 ) (i=0,...,S^2 ) (i=0,...,S2)内的每一个矩形框 ( j = 0 , . . . , B ) (j=0, ... , B) (j=0,...,B)的中心坐标位置与标记框交叉熵误差损失总和。

3.2 预测框宽高误差(第二项)

其中 ( w i j , h i j ) (w^{j}_i,h^{j}_i) (wij,hij)是网络预测目标的宽高, ( w ^ i j , h ^ i j ) (\hat{w}^j_i, \hat{h}^j_i) (w^ij,h^ij)是gt的宽高。,同样这里为了协调不同大小矩形框对误差函数贡献不一致设置了参数 λ c o o r d \lambda _{coord} λcoord 。该函数计算了所有预测矩形框的宽高与标记框宽高求和平方误差损失总和。

3.3 预测框置信度误差(第三四项)

其中 C i j C^j_i Cij为预测框内含有目标物体的概率得分, C ^ i j = 1 \hat{C}^j_i=1 C^ij=1表示真实值, C ^ i j \hat{C}^j_i C^ij的取值由第(i,j)个矩形框是否负责预测某一个矩形框决定,如果负责,那么 C ^ i j = 1 \hat{C}^j_i=1 C^ij=1,否则, C ^ i j = 0 \hat{C}^j_i=0 C^ij=0。 I i j n o o b j I^{noobj}{ij} Iijnoobj等于 1 − I i j n o o b j 1-I^{noobj}{ij} 1−Iijnoobj,表示如果该矩形框不负责预测一个目标则其大小为 1 1 1,否则等于 0 0 0。为一个权重值,表示当预测框没有预测到目标时,其置信度误差在损失函数中所占权重,由于对于一副图像,一般而言其大部分内容是不含有待检测的物体,这样会导致没有物体的计算部分贡献会大于有物体的计算部分,从而导致网络倾向于预测单元格中不含有物体,因此,我们需要减少没有物体计算部分的贡献权重, 往往取值0.5。

3.4 预测框类别误差(第五项)

P i , c j P_{i,c}^j Pi,cj表示第 ( i , j ) (i,j) (i,j)预测框属于类别c的概率, P ^ i , c j \hat{P}_{i,c}^j P^i,cj,表示真实所属类别,如果为c类则为1,否则为0.

4. 总结

YOLOv3 擅于预测出合适的目标,但无法预测出非常精准的边界框。YOLOv3 小目标预测能力提升,但中大目标的预测反而相对较差。若将速度考量进来,YOLOv3 整体来说表现非常出色。

YOLOv3在小目标\密集目标的改进

1.grid cell个数增加,YOLOv1(7×7),YOLOv2(13×13),YOLOv3(13×13+26×26+52×52)

2.YOLOv2和YOLOv3可以输入任意大小的图片,输入图片越大,产生的grid cell越多,产生的预测框也就越多

3.专门小目标预先设置了一些固定长宽比的anchor,直接生成小目标的预测框是比较难的,但是在小预测框基础上再生成小目标的预测框是比较容易的

4.多尺度预测(借鉴了FPN),既发挥了深层网络的特化语义特征,又整合了浅层网络的细腻度的像素结构信息

5.对于小目标而言,边缘轮廓是非常重要的,即浅层网络的边缘信息。在损失函数中有着惩罚小框项

6.网络结构:网络加了跨层连接和残差连接(shortcut connection),这样可以整合各个层的特征,这样使得网络本身的特征提取能力提升了

yolov1 yolov2 yolov3
输入图像尺寸 3x448x448 3x416x416 3x416x416
grid cell 一张图划分为7x7个 一张图划分为13x13个 13x13 26x26 52x52
bbox/anchor 每个grid cell生成2个bbox,与真实框IOU最大的框负责拟合 每个grid cell生成5个anchor,通过IOU计算选一个anchor产生预测框去拟合 每个grid cell生成3个anchor,通过gt的IOU计算选一个anchor产生预测框去拟合
输出张量 输出7x7x30维张量(两组xywh和c+20个类别) 输出13x13x125维张量(五组anchor的xywh+c+20类别) 输出三个尺度张量(13x13x255),(26x26x255),(52x52x255) (255为三组xywh+c+80个类)
预测框数量 7x7x2=98个预测框 13x13x5=845个预测框 (13x13+26x26+52x52)x3=10657个预测框
相关推荐
王哈哈^_^43 分钟前
【数据集】【YOLO】【VOC】目标检测数据集,查找数据集,yolo目标检测算法详细实战训练步骤!
人工智能·深度学习·算法·yolo·目标检测·计算机视觉·pyqt
咔叽布吉3 小时前
【论文阅读笔记】CamoFormer: Masked Separable Attention for Camouflaged Object Detection
论文阅读·笔记·目标检测
深度学习lover6 小时前
<项目代码>YOLOv8 苹果腐烂识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·苹果腐烂识别
Eric.Lee202111 小时前
yolo v5 开源项目
人工智能·yolo·目标检测·计算机视觉
阿_旭15 小时前
基于YOLO11/v10/v8/v5深度学习的煤矿传送带异物检测系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】
人工智能·python·深度学习·目标检测·yolo11
极智视界16 小时前
无人机场景数据集大全「包含数据标注+划分脚本+训练脚本」 (持续原地更新)
算法·yolo·目标检测·数据集标注·分割算法·算法训练·无人机场景数据集
LNTON羚通19 小时前
CPU算法分析LiteAIServer视频智能分析平台视频智能分析:抖动、过亮与过暗检测技术
大数据·目标检测·音视频·视频监控
深度学习lover21 小时前
<项目代码>YOLOv8 夜间车辆识别<目标检测>
人工智能·yolo·目标检测·计算机视觉·表情识别·夜间车辆识别
苦瓜汤补钙1 天前
论文阅读:DynamicDet: A Unified Dynamic Architecture for Object Detection
论文阅读·人工智能·目标检测
然.燃1 天前
什么是目标检测?
人工智能·目标检测·计算机视觉