目标检测——yolov3论文精读

📝论文下载

Abstract(摘要)

在这里插入图片描述

  • YOLOv3在YOLO的基础上做了一些更新,重点在于提升检测的精度
  • 当图片的分辨率为320 × 320,YOLOv3只使用了22 ms进行检测, mAP达到28.2。这个检测结果与SSD一样精确,但比SSD快三倍。当我们着眼于旧的。当设置IOU的阈值为0.5时,yolov3在Titan X上可以在51 ms内实现57.9 AP50,而在retina anet上则可以在198 ms内实现57.5 AP50,性能类似,但要快3.8倍。所有的代码都可以在https://pjreddie.com/yolo/上找到。

1、Introduction

在这里插入图片描述

  • (独具一格的随笔式开头)有时,你一整年全在敷衍了事而不自知。比如今年我就没做太多研究,在推特上挥霍光阴,置 GANs 于不顾。凭着上年余留的一点动力,我成功对 YOLO 做了一些升级。但实话讲,没什么超有趣的东西,只不过是些小修小补。同时我对其他人的研究也尽了少许绵薄之力。
    于是就有了今天的这篇论文。我们有一个最终截稿日期,需要随机引用 YOLO 的一些更新,但是没有资源。因此请留意技术报告。
    科技报道最棒的一点就是它们不需要介绍,你们都知道我们为什么在这里。因此,本介绍的结尾将为本文的其余部分指明方向。首先我们会告诉你YOLOv3的原理。然后告诉你我们是怎么做的。我们还会告诉你一些我们尝试过但没有成功的事情。最后,我们将思考这一切意味着什么

2、The Deal

在这里插入图片描述

  • YOLOv3的来源:我们主要是从其他人那里获得好的想法。我们还训练了一个新的分类器网络,它比其他分类器更好。我们会从头开始讲解整个系统,这样你就能理解它了。(YOLOv3的实验结果图如下)
    在这里插入图片描述

2.1 Bounding Box Prediction

在这里插入图片描述
在这里插入图片描述

  • 在YOLO9000之后,我们的系统使用聚类算法生成锚框来预测边界盒。网络预测每个边界框的4个坐标,tx, ty, tw, th。如果单元格从图像的左上角偏移(cx, cy),且之前的边界框的宽度和高度为pw, ph,则预测对应于:

    b

    x

    =

    σ

    (

    t

    x

    )

    +

    c

    x

    b

    y

    =

    σ

    (

    t

    y

    )

    +

    c

    y

    b

    w

    =

    p

    w

    e

    t

    w

    b

    h

    =

    p

    h

    e

    t

    h

    \begin{aligned} b_{x} &=\sigma\left(t_{x}\right)+c_{x} \\ b_{y} &=\sigma\left(t_{y}\right)+c_{y} \\ b_{w} &=p_{w} e^{t_{w}} \\ b_{h} &=p_{h} e^{t_{h}} \end{aligned}

    bxbybwbh=σ(tx)+cx=σ(ty)+cy=pwetw=pheth

在这里插入图片描述

在训练中,我们使用误差平方和损失。如果坐标预测的真实值是ˆt*,我们的梯度是真实值减去我们的预测值:ˆt−t。这个真实值可以很容易地通过上述方程的反求来计算。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 在YOLOv3 中,利用logistic regression 来预测物件分数( object score ),也就是YOLOv1 论文中说的信心指数( confidence ) :
    与真实边界框之IOU为最大值,且高于阈值

    0.5

    0.5

    0.5 之anchor box 其 object score

    =

    1

    =1

    =1
    与真实边界框之

    I

    O

    U

    I O U

    IOU 非最大值,但仍高于阈值

    0.5

    0.5

    0.5 之anchor box 则忽略 其预测值。

  • 与Faster-RCNN 不同,YOLOv3 仅对每一个真实物件分配一个anchor box,若没有分配到anchor box 的真实物件,便不会有坐标误差,仅会具有object score 误差。

2.2 Class Prediction

在这里插入图片描述

  • 在分类预测的部分,YOLOv3 使用的是logistic 分类器,而不是之前使用的softmax。主要是因为softmax 在使用上有一个前提是类别间必须要是互斥的,也就是说每一个边界框只能被预测出一个类别,但是在一些资料集中,类别之间并不一定满足这样的前提条件( 可能同时满足「人」及「女人」的类别) 。在YOLOv3 的训练中,便使用了Binary Cross Entropy ( BCE, 二元交叉熵) 来进行类别预测.

⛄️ softmax被替代的原因
物体检测任务中可能一个物体有多个标签;
logistic激活函数来完成,这样就能预测每一个类别是/不是
在这里插入图片描述

2.3 Predictions Across Scales

在这里插入图片描述

  • YOLOv3 中会预测三种不同尺度的边界框。整个系统会使用类似Feature Pyramid Network ( 特征金字塔,FPN ) 的概念来对这些尺度中进行特征萃取。在整个特征提取的系统中,YOLOv3 加进了一些卷积层,最后输出一个3D 张量,包含了边界框预测、物件分数以及类别预测。

❄️ 为了能检测到不同大小的物体,设计了3个scale

在这里插入图片描述
❄️左图:图像金字塔;右图:单一的输入;
在这里插入图片描述

  • 以COCO 为训练资料进行的实验中,最后输出的张量为 N × N ×[3∗(4 + 1 + 80)]用于4个边界盒偏移量、1个对象属性预测和80个类预测。
    在这里插入图片描述

在这里插入图片描述

  • 接下来,我们从之前的2层中提取特征图,并将其上采样2倍。我们还从早期的网络中获得一个特征图,并使用连接(concatenation)将其与我们上采样的特征合并。该方法允许我们从上采样的特征中获得更有意义的语义信息,并从之前的特征图中获得更细粒度的信息。然后我们添加更多的卷积层来处理这个组合的特征图,并最终预测一个类似的张量,现在的大小是原来的两倍。

❄️ 左图:对不同的特征图分别利用;右图:不同的特征图融合后进行预测
在这里插入图片描述

在这里插入图片描述

  • 我们再次进行相同的设计,以预测最终比例的盒子。因此,我们对第三尺度的预测受益于所有先前的计算以及网络早期的细粒度特征。
    在这里插入图片描述
  • 我们仍然使用k-means聚类来确定我们的边界盒先验。我们只是随意选择了9个簇和3个尺度然后在尺度上均匀地划分这些簇。在COCO数据集上,9个聚类分别为:(10 × 13)、(16 × 30)、(33 × 23)、(30 × 61)、(62 × 45)、(59 × 119)、(116 × 90)、(156 × 198)、(373 × 326)。

🌻 先验框设计
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.4、 Feature Extractor

在这里插入图片描述

  • 我们使用一个新的网络来进行特征提取。我们的新网络是YOLOv2中使用的网络、Darknet-19和新发明的残余网络的混合方法。我们的网络使用了连续的3 × 3和1 × 1卷积层,有53个卷积层,所以我们叫它Darknet-53在这里插入图片描述

在这里插入图片描述

  • 这个新网络比Darknet19强大得多,比ResNet-101或ResNet-152更有效。下面是一些ImageNet的结果:
    在这里插入图片描述
  • 每个网络都用相同的设置进行训练,并在256 × 256的单精度下进行测试。运行时间是在256 × 256的Titan X上测量的。因此,Darknet-53的性能与最先进的分类器相当,但浮点运算更少,速度更快。Darknet-53比ResNet-101好,速度快1.5倍。Darknet-53具有与ResNet-152相似的性能,并且比ResNet-152快2倍。Darknet-53还实现了每秒最高的浮点运算。这意味着网络结构更好地利用了GPU,使其评估更高效,从而更快。

🌻 YOLOv3 物体检测架构(下图源自此处

注:

DBL是Darknet53的基本组件 :每个DBL单元由卷积(Conv2D)层、批处理归一化(BN)层和激活函数(Leaky ReLU)组成。
Residual: 残差模块
Concat:张量拼接,会扩充两个张量的维度。Concat和cfg文件中的route功能一样
Add:张量相加,张量直接相加,不会扩充维度。add和cfg文件中的shortcut功能一样。

在这里插入图片描述

1、yolov3提取多特征层进行目标检测,一共提取三个特征层,三个特征层位于主干特征提取网络darknet53的不同位置,分别位于中间层,中下层,底层,三个特征层的shape分别为(52,52,256)、(26,26,512)、(13,13,1024),这三个特征层后面用于与上采样后的其他特征层堆叠拼接(Concat)
2、第三个特征层(13,13,1024)进行5次卷积处理(为了特征提取),处理完后一部分用于卷积+上采样UpSampling,另一部分用于输出对应的预测结果(13,13,75),Conv2D 3×3和Conv2D1×1两个卷积起通道调整的作用,调整成输出需要的大小。
3、卷积+上采样后得到(26,26,256)的特征层,然后与Darknet53网络中的特征层(26,26,512)进行拼接,得到的shape为(26,26,768),再进行5次卷积,处理完后一部分用于卷积上采样,另一部分用于输出对应的预测结果(26,26,75),Conv2D 3×3和Conv2D1×1同上为通道调整
4、之后再将3中卷积+上采样的特征层与shape为(52,52,256)的特征层拼接(Concat),再进行卷积得到shape为(52,52,128)的特征层,最后再Conv2D 3×3和Conv2D1×1两个卷积,得到(52,52,75)特征层

🌻 残差模块

Darknet53中的残差卷积就是首先进行一次卷积核大小为3X3、步长为2的卷积,该卷积会压缩输入进来的特征层的宽和高,此时我们可以获得一个特征层,我们将该特征层命名为layer。之后我们再对该特征层进行一次1X1的卷积和一次3X3的卷积,并把这个结果加上layer,此时我们便构成了残差结构。通过不断的1X1卷积和3X3卷积以及残差边的叠加,我们便大幅度的加深了网络。残差网络的特点是容易优化,并且能够通过增加相当的深度来提高准确率。其内部的残差块使用了跳跃连接,缓解了在深度神经网络中增加深度带来的梯度消失问题
在这里插入图片描述

2.5 training

在这里插入图片描述

  • 我们使用多尺度训练,大量的数据扩充,批量标准化,包括所有的标准内容。我们使用Darknet神经网络框架进行训练和测试。

🚀 loss的计算过程

λ

coord 

i

=

0

S

2

j

=

0

B

1

i

,

j

o

b

j

[

(

b

x

b

^

x

)

2

+

(

b

y

b

^

y

)

2

+

(

b

w

b

^

w

)

2

+

(

b

h

b

^

h

)

2

]

\lambda_{\text {coord }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} 1_{i, j}^{o b j}\left[\left(b_{x}-\hat{b}_{x}\right)^{2}+\left(b_{y}-\hat{b}_{y}\right)^{2}+\left(b_{w}-\hat{b}_{w}\right)^{2}+\left(b_{h}-\hat{b}_{h}\right)^{2}\right]

λcoord i=0S2j=0B1i,jobj[(bxb^x)2+(byb^y)2+(bwb^w)2+(bhb^h)2]

+

i

=

0

S

2

j

=

0

B

1

i

,

j

o

b

j

[

log

(

p

c

)

+

i

=

1

n

B

C

E

(

c

^

i

,

c

i

)

]

+\sum_{i=0}^{S^{2}} \sum_{j=0}^{B} 1_{i, j}^{o b j}\left[-\log \left(p_{c}\right)+\sum_{i=1}^{n} B C E\left(\hat{c}_{i}, c_{i}\right)\right]

+i=0S2j=0B1i,jobj[log(pc)+i=1nBCE(c^i,ci)]

+

λ

noobj 

i

=

0

S

2

j

=

0

B

1

i

,

j

noobj 

[

log

(

1

p

c

)

]

+\lambda_{\text {noobj }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} 1_{i, j}^{\text {noobj }}\left[-\log \left(1-p_{c}\right)\right]

+λnoobj i=0S2j=0B1i,jnoobj [log(1pc)]
其中:

S

:

S:

S: 网格数, 即

S

2

S^{2}

S2

13

13

,

26

26

13 * 13,26 * 26

1313,2626

52

52

;

52 * 52 ;

5252;

B

:

B:

B: box;

1

i

,

j

o

b

j

1_{i, j}^{o b j}

1i,jobj : 如果

b

o

x

b o x

box 有目标物, 则其值为 1, 否则为

0

;

0 ;

0;

B

C

E

(

B C E(

BCE( binary cross entropy

)

:

B

C

E

(

c

^

i

,

c

i

)

=

c

^

i

log

(

c

i

)

(

1

c

^

i

)

log

(

1

c

i

)

): B C E\left(\hat{c}_{i}, c_{i}\right)=-\hat{c}_{i} * \log \left(c_{i}\right)-\left(1-\hat{c}_{i}\right) * \log \left(1-c_{i}\right)

):BCE(c^i,ci)=c^ilog(ci)(1c^i)log(1ci)

1

i

,

j

noobj 

1_{i, j}^{\text {noobj }}

1i,jnoobj  : 如果

b

o

x

b o x

box 无目标物, 则其值为 1, 否则为

0

;

0 ;

0;

损失由三个部分组成:a、正样本,编码后的长宽与xy轴偏移量与预测值的差距。b、正样本,预测结果中置信度的值与1对比;负样本,预测结果中置信度的值与0对比。c、实际存在的框,种类预测结果与实际结果的对比。

3、How We Do

在这里插入图片描述
上表显示,以一般的

A

P

A P

AP 指标来看,YOLOv3 的表现与SSD 的变体DSSD513 并驾 齐驱。若以

A

P

50

(

I

O

U

A P_{50}(I O U

AP50(IOU 阈值为

0.5

)

0.5)

0.5) 来看,则YOLOv3 甚至表现接近RetinaNet, 但上表没有说的事情是不管是RetinaNet 还是DSSD,YOLOv3 的速度都快上3 倍 以上。然而以

A

P

75

A P_{75}

AP75 来说, YOLOv3 表现反而下滑。
且在小物件的侦测上面, YOLOv3 的表现提升不少。这表明:

  1. YOLOv3 擅于侦测出「合适」,但无法侦测出非常精准的边界框。
  2. YOLOv3 小物件侦测能力提升,但中大型物件的侦测反而相对较差。
  3. 若将速度考量进来,YOLOv3 整体来说表现非常出色。

4、 Things We Tried That Didn’t Work

作者在这部分将一些徒劳无功的做法记录下来。
Anchor box x, y offset predictions
将的偏移量x,y假设为w或h的倍数,这样的尝试导致模型的不稳定,而且表现不是很理想
Linear x, y predictions instead of logistic.
将activation function 从本来的logistic 改为linear,一样导致mAP下滑。
Focal loss
YOLO 其实利用独立的object score 以及class prediction 解决了Focal Loss 要解决的问题,然而使用Focal Loss 后YOLOv3 却有两个百分点的下降,为什么会这样,作者也不太确定。
Dual IOU thresholds and truth assignment
在Faster-RCNN 中使用了两个阈值来进行训练。当预测的边界框

I

O

U

I O U

IOU 大于

0.7

0.7

0.7 则将此视为正样本,介于

0.3

0.7

0.3-0.7

0.30.7 之间则忽略,小于

0.3

0.3

0.3 便视为负样本。 如将YOLOv3 利用类似的方法进行训练,则无法得到好的结果。

5、What This All Means

YOLOv3 是一个快速且准确的物件侦测系统,即使在阈值之间表现得差强人意,但在阈值的状况下,它表现得非常好。

在COCO 论文中追求高阈值的表现,对YOLO 作者来说觉得并不是太有意义。事实上,人类无法用肉眼精准看出值在之间的差异,既然如此,只要有一定的精准度,定位精度并不需要追求这么高标准。

作者希望,应用计算机视觉技术的人们,可以将其用在好的、对的事情上面,我们有责任去考量到我们的工作可能对社会造成的危害。

参考:
为什么 YOLOv3 用了 Focal Loss 后 mAP 反而掉了?
[论文] YOLOv3 : An Incremental Improvement
Yolo v3 loss function
What’s new in YOLO v3?
睿智的目标检测26——Pytorch搭建yolo3目标检测平台
How to implement a YOLO (v3) object detector from scratch in PyTorch: Part 1

版权声明:本文为CSDN博主「zyw2002」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zyw2002/article/details/122917498

zyw2002

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

emgucv4学习21---emgucv+ssd目标检测+vs2019

之前也写过yolov3、yolov4部署在C#上,具体的可以参考下面的博客。可能很多人感觉为啥要用emgucv进行部署呢,我也可以用Opencv、openvino部署,这些也是可以的,甚至可以导出dll给C#调用,总之部署有很多方法。在C#上部