死嗑YOLO系列(三),YOLOv3风月无边

YOLOv2 的时候,作者在 YOLOv1 的基础上运用了许多有效的 tricks,所以展示了它的 better、faster、stronger 因素,到了 YOLOv3 的时候,这个模型仍然在进化,保持速度的同时,把准确率给提升了许多。

速度始终是YOLO系列安身立命之本.

我面试过许多的求职者,大家在日常工作当中,最常用的模型还是 YOLO,这说明 YOLO 真的成为了工业界的事实标准,尤其是在边缘设备。

在这里插入图片描述
这是极具挑衅的一张性能对比图。

以实时性要求为分界,这世界上只有 2 种算法,YOLOv3 和其它。

他山之石可以攻玉

YOLO 作者是个很实诚的人,在论文中有解释道 YOLOv3 的改进借助于其他同行的很多 ideal。

bbox 预测

从 YOLOv2 开始,预测 bbox 就是借助于 anchor box。
anchor box 是通过尺寸聚类计算出来的。
每一个 bbox 预测 5 个数值,前 4 个为 tx,ty,tw,th,后 1 个为 ojectness score.

尺寸相关的预测值如下图:
在这里插入图片描述
tx,ty,tw,th 4 个是预测出来的值,最终通过上面公式得到归一化的数值:bx,by,bw,bh。
在这里插入图片描述
这里极具迷惑性的是,如何通过 bx,by,bw,bh 得到 bbox 的位置尺寸?

因为论文讲得不是很明白,所以需要结合自己的理解去做推断。

bx 是 tx 经过 sigmoid 转换,加上 cx 的结果。

因为 sigmoid 的函数取值是 0 到 1,所以 bx 的取值范围是 cx ~ cx + 1。

这显然不是在原始的输入图像上的位置关系。

实际上,YOLOv3 所有的检测都是在最后一层 featuremap 上的。

YOLOv3 产生了 3 个分支,分别产生了 13x13,26x26,52x52 三种尺寸的 featuremap。

每个 featuremap 的一个像素,也就一个点会生成 3 个 AnchorBox,所以,每个 AnchorBox 距离 featuremap 原点的距离也就是上图中的 cx,cy 是固定的,所以也可以解释了一些同学的疑问,cx 和 cy 要不要预测。

pw 和 ph 是 AnchorBox 的尺寸,这个尺寸也是基于 featuremap 而言的。

另外,有同学可能会注意 bw 和 bh 的公式。
b w = p w ∗ e t w b_{w} = p_{w}*e^{tw} bw=pwetw
我曾经搞不懂,为什么要弄这么奇怪的指数函数进去,有没有多此一举,直接预测不好吗?
后来,我想了一下,大概有 2 个原因:

  • 原因1:直接预测 bw,会有负数,而宽高信息不会是负责,ex 函数可以保证值 > 0
  • 原因2:指数函数求导非常方便,反向传播训练时是个好东西

至于 bx 为什么要引入 sigmoid 也不是多此一举,这是因为作者尝试过直接预测但导致模型不稳定,所以就直接将 x,y 归一化了。

作者也在论文中说了,在训练时采用的是 SSE,也就是平方差的和,ground box 求一个梯度就形成了 groundtruth value,非常方便执行 loss 函数。

yolov3 预测 bbox 除了 4 个尺寸值外,还有 1 个 objectness,代表当前 bbox 中有目标的置信度,它采用 logistic 函数回归,所以取值是 0 到 1。

当一个 bbox 和 groudtruth 的重叠区域超过其它的 bbox 时,在反向传播的时候计算 Loss 时就设定这个 bbox 的 objectness 为 1。

如果一个 bbox 不是和 groundtruth IOU 匹配最佳的那个,但又超过 threshold 许多,YOLOv3 仍然会忽略它。

一个 bbox 只能和一个 groundtruth box 匹配,如果 bbox 未和任何 groundtruth box 匹配,那么它在计算 Loss 时,只计算 objectness,而尺寸信息和 label 信息不参与。

class 预测

YOLOv3 没有采用 Softmax 去预测类别,因为作者觉得它没有什么用处。

YOLOv3 针对每一个类别采用独立的 logstic 函数去分类,训练时采用的 binary cross-entropy loss。

多尺度预测

YOLOv3 采用一种类似金字塔网络的概念,分别基于 3 种不同尺寸的feature map 做预测。

在基础的 feature exactor 后面添加若干卷积层,每一种尺寸,feature map 单点预测 3 个 bbox。

所以,为了更好解释这一节,我将论文中后一节的内容挪到这一节。

作者说的 feature exactor 其实就是一个分类模型:Darknet-53。

在这里插入图片描述

作者说叫 Darknet-53 是因为它有 53 个卷积层,较真的我仔细数了数发现只有 52 个卷积层,后来才发现最后一层 Connected 层是由 1x1 的卷积核实现的。

好的,回到多尺度预测的话题上来。

为了利用不同的尺度信息,YOLO 作者借鉴了金字塔网络的思想。

以 Feature Exactor 为基础后面跟随一系列的卷积层,最后形成不同尺寸的 featuremap。

然后在 featuremap 上为每个像素产生指定数量(3个)的 bbox。

YOLOv3 的难点之一在于理解如何生成 3 个不同尺寸的 featuremap。

骚操作颇多,现在细细说来。

YOLOv3 进行了 3 次操作,得到了 3 张不同尺寸的 featuremap。

第 1 张 featuremap 的诞生

在这里插入图片描述

第 1 张 featuremap 是从 Darknet-53 最后一个 Residual 层(layer 71) 基础上生成的。
原始数据尺寸是 3x3x1024,通过一系列的卷积操作,最终生成 13x13xNum的 featuremap。

num 和数据相关.
num = 3*(4+1+N)

4 是一个 bbox 的位置信息,1 是 objectness 分数。
N 是 label 类别数量,voc 是 20,coco 是80.乘以 3 代表一个 featuremap 像素预测 3 个 bbox。
所以,num 在 voc 数据集时是 75,coco 是 255.

回到前面的话题,一系列的卷积操作指得是连续堆积的 7 个卷积层。
1x1 的卷积将输入数据维度减半,但尺寸不变。
3x3 的卷积将维度还原,同时尺寸不变。
同样的操作进行 3 次。
最后用 1x1xNum 数量的卷积核产生目标 featuremap。

第 2 张 featuremap 的生成

第 2 张 featuremap 开始有些复杂。

它有一个维度拼接的操作(concatenation)。

它有几个步骤:

  • 步骤1,在 13x13 featuremap 向前两个卷积层引出一个分支。
  • 步骤2,对这个分支进行 2x 上采样,维度保持不变,那么 featuremap 就变成 26x26 的尺寸了。
  • 步骤3,从darknet 前面的卷积层引出 26x26 的 featuremap。
  • 步骤4,两个 featuremap 进行 concatenation。
  • 步骤5,concatenation 之后的 featuremap 又经历一系列的卷积层,最终形成 26x26xNum 尺寸的 featuremap。

在这里插入图片描述
这里有 2 个细节需要注意:

  1. 参与 concatenation 的卷积层不是 featuremap1,而是它向上2层。
  2. 通过 1x1x256 的卷积形成了 13x13x256 的 层,经 2x 上采样形成 26x26x512 的卷积层,然后和前面最后一个 26x26 的卷积层拼接,最终拼接成 26x26x768 的卷积层。
第 3 张 featuremap 的生成

搞懂第 2 张featuremap 后,第 3 张 featuremap 也就弄懂了,因为它们操作是一样的,只不过拼接的层不一样的。

看图:

在这里插入图片描述

自此,YOLOv3 的 3 张 featuremap 生成过程都已经解释清楚,YOLOv3 论文实在是太过于精简,所以很多同学在结构上没有搞明白,导致学习 YOLOv3 总感觉一知半解,似是而非。

featuremap1、2、3 统称为 Detection。
它们都是 3d-tensor,它们的尺寸和 featuremap 的尺寸为关,维度和数据集合的 label 数量有关。

以 COCO 数据集为例,它有 80 个类,所以最后 3-d tensor 的尺寸是:

N*N*(3*(4+1+80))

4 代表 bbox 的坐标尺寸,1 代表 objectness score,80 代表 coco 中的 80 个种类。N 是 featuremap 的尺寸。

YOLOv3 的 anchor

和 YOLOv2 一样,YOLOv3 仍然使用 k-means 在数据集合中聚类,不同的是它选择了 9 个 cluster。

比如在 coco 数据集中聚类的结果,其实对应了 3 种尺寸:

(10×13),(16×30),(33×23), 小尺寸
(30×61),(62×45),(59×119),中尺寸
(116 × 90),(156 × 198),(373 × 326).大尺寸

具体分配是 Detection 中 featuremap 尺寸越小,用的 anchor box 尺寸越大。

比如 13x13 的 featuremap,它经过 5 次下采样,感受野比较大,适合检测大目标。
同样 52x52 的 featuremap,它只经过 3 次下采样,感受野相对比较小,适合检测小目标。

而实际上,YOLOv2 对小目标检测不好,YOLOv3 极大改善了,这种多尺度预测功不可没。

特征提取器

YOLOv3 带来了一个新的网络,运用了大量的 3x3 和 1x1 的卷积核,同时运用了大量的 shortcut,其实也就是残差网络单元。

因为有 53 层卷积层,所以就取名叫做 Darknet-53。
在这里插入图片描述
Darknet-53 其实就是在 Darknet-19 的基础上加上残差单元,没有什么新奇的地方,但在当时作者还是同步比较了其他的同类型网络,对比表现还是非常棒的。

在这里插入图片描述
Darknet-53 和 ResNet-101,ResNet-152 表现差不多,但是速度却快了很多。

作者还特别说明了一件事情,Darknet-53 拥有最高的 BFLOP/s,作者认为 Yolov3 最大限度利用了 GPU 资源,没有浪费算力。

关键指标看是骡子还是马

目标检测有 2 个关键指标:

  • 检测速度
  • 检测精度

YOLO 是唯快不破的流派,所以 YOLOv1 到 YOLOv2 一直在速度上取得绝对优势。

但有个问题是精度上过不去,特别是之前一直在小物体的识别上挣扎。

好在 YOLOv3 有改善这个问题
在这里插入图片描述
我们可以看到,YOLOv2 在精度上真的很感人,尤其是在 APs 小目标指标下,真的是副班长的存在。
但 YOLOv3 赶上来了,至少没有落后别人了。
上面的图说明了当时精度上最优秀的是 RetinaNet,但俏皮的作者马上又在速度上找了平衡。

在这里插入图片描述
在边缘设备上,你精度差点没有关系,不够快就很要命,好吧,我摊牌了我说的应用场景就是我现在从事的行业:自动驾驶。

无用之功

YOLO 作者非常实诚,YOLOv3 是一系列的 tricks 尝试,有些很有效,有些就没有什么作用。

作者也在论文中陈述了一番,这里不在复述,一笔带过,有兴趣的同学自己阅读论文了解一下。

无用的 tricks:

  • 预测 Anchor Box 的 x,y 偏移量
  • 用线性激活函数代替 logistic 直接预测 xy
  • Focal Loss
  • 双 IOU 阈值

总结

YOLOv3 的论文内容只有 4 页,作者写得很随性,所以忽略了很多细节,这个就导致阅读 YOLOv3 论文时是非常头痛的。

当你看完时,你会觉得自己很有收获,但当你仔细想想时,论文好像又没有讲什么具体的事情。

如果阅读完 YOLOv3 论文你啥都想不起,那么一定提醒自己一点:

YOLOv3 的多尺度预测用 3 个 featuremap 预测实现了质的突破.

要真正弄懂 YOLOv3,需要复现它。

复现 YOLOv3 有几个要求:

  • 对于输入数据的处理,这个容易实现
  • 对于 Darknet-53 的复现,这个也容易
  • 对于 YOLOv3 检测网络的复现,这个非常难,不看代码是做不到的
  • YOLOv3 训练中的超参数设计,这个也需要看代码
  • YOLOv3 的 Loss 函数实现,这个也要看代码,论文没有讲

YOLOv3 的官方实现是 Darknet 框架,比较小巧,我之前也是直接用它,因为是 c 语言写的,所以相对比较高效。

但 Darknet 是一个不常用的小众框架,又没有官方说明文档,要搞得它能自己摸索,所以比较痛苦。

但我认为这种痛苦是值得的,YOLO 论文中讲得不明不白的地方,全部在 Darknet 代码中能够体现。

后面的系列,我也会尝试去分析 Darknet,然后基于其中的思想,用 Pytorch 去复现它,虽然世面上有现成的 Pytorch ,但那是别人的,代码的应用可能不要重复造轮子,但算法工程师却很必要复现轮子,这是我的观点。

回到 YOLO 本身,我给的文章标题是风月无边,我认为它担当的上。

YOLO 在能用的情况下,快到没有朋友。

现在有 YOLOv4,YOLOv5 依旧是快到没有朋友,学术界可能没有那么喜欢,毕竟已经没有什么新的 ideal 了,但工业应用上却深受喜欢。

另外,说一句 YOLO 的作者 Redmon 因为 AI 论理考虑,在 2020 年 2 月宣布退出 CV 界。
在这里插入图片描述
不可否认的是 YOLOv4,YOLOv5 非常好用,但感觉少了点灵魂。

YOLO 系列的灵魂是 Redmon 这个有趣的人注入的,从这个角度而言世上再无 YOLO.

参考

1.https://pjreddie.com/
2.https://pjreddie.com/media/files/papers/YOLOv3.pdf
3.https://blog.csdn.net/Gentleman_Qin/article/details/84350496

frank909 CSDN认证博客专家 CV(computer vision)
爱阅读的程序员,专注于技术思考和分享。关注架构设计、Android 开发、AI、数学、自动驾驶领域,个人公号:Frankcall
<p> <span style="font-size:18px;color:#E53333;"><strong><span style="color:#000000;">课程演示环境:Ubuntu</span><br /> <br /> <span style="color:#000000;">需要学习Windows系统YOLOv4的同学请前往《Windows版YOLOv4目标检测实战:训练自己的数据集》,课程链接https://edu.csdn.net/course/detail/28748</span><br /> <br /> YOLOv4</strong></span><span style="font-size:18px;color:#E53333;"><strong>来了!速度和精度双提升!</strong></span> </p> <p> <span style="font-size:16px;"> </span> </p> <p> <span style="font-size:16px;">与</span><span style="font-size:16px;"> YOLOv3 </span><span style="font-size:16px;">相比,新版本的</span><span style="font-size:16px;"> AP(精度) </span><span style="font-size:16px;">和</span><span style="font-size:16px;"> FPS </span><span style="font-size:16px;">(每秒帧率)分别提高了</span><span style="font-size:16px;"> 10% </span><span style="font-size:16px;">和</span><span style="font-size:16px;"> 12%</span><span style="font-size:16px;">。</span><span></span> </p> <p> <span style="font-size:16px;"> </span> </p> <p> <span style="font-size:16px;">YOLO系列是基于深度学习的端到端实时目标检测方法。本课程将手把手地教大家使用</span><span style="font-size:16px;">labelImg</span><span style="font-size:16px;">标注和使用</span><span style="font-size:16px;">YOLOv4</span><span style="font-size:16px;">训练自己的数据集。课程实战分为两个项目:单目标检测(足球目标检测)和多目标检测(足球和梅西同时检测)。</span><span></span> </p> <p> <span style="font-size:16px;"> </span> </p> <p> <span style="font-size:16px;">本课程的</span><span style="font-size:16px;">YOLOv4</span><span style="font-size:16px;">使用</span><span style="font-size:16px;">AlexAB/darknet</span><span style="font-size:16px;">,在</span><span style="font-size:16px;">Ubuntu</span><span style="font-size:16px;">系统上做项目演示。包括:安装</span><span style="font-size:16px;">YOLOv4、</span><span style="font-size:16px;">标注自己的数据集、整理自己的数据集、修改配置文件、训练自己的数据集、测试训练出的网络模型、性能统计</span><span style="font-size:16px;">(mAP</span><span style="font-size:16px;">计算和画出</span><span style="font-size:16px;">PR</span><span style="font-size:16px;">曲线</span><span style="font-size:16px;">)</span><span style="font-size:16px;">和先验框聚类分析。还将介绍改善</span><span style="font-size:16px;">YOLOv4</span><span style="font-size:16px;">目标训练性能的技巧。</span><span></span> </p> <p> <span style="font-size:16px;"> </span> </p> <p> <span style="font-size:16px;">除本课程《</span><span style="font-size:16px;">YOLOv4</span><span style="font-size:16px;">目标检测实战:训练自己的数据集》外,本人将推出有关</span><span style="font-size:16px;">YOLOv4</span><span style="font-size:16px;">目标检测系列课程。请持续关注该系列的其它视频课程,包括:</span><span></span> </p> <p> <span style="font-size:16px;">《</span><span style="font-size:16px;">YOLOv4</span><span style="font-size:16px;">目标检测实战:人脸口罩佩戴识别》</span><br /> <span style="font-size:16px;">《</span><span style="font-size:16px;">YOLOv4</span><span style="font-size:16px;">目标检测实战:中国交通标志识别》</span><br /> <span style="font-size:16px;">《</span><span style="font-size:16px;">YOLOv4</span><span style="font-size:16px;">目标检测:原理与源码解析》</span> </p> <p> <br /> </p> <p> <span style="font-size:16px;"><br /> </span> </p> <p> <span style="font-size:16px;"><img src="https://img-bss.csdn.net/202004260858382698.jpg" alt="" /><br /> </span> </p> <p> <span style="font-size:16px;"><br /> </span> </p> <p> <span style="font-size:16px;"><img src="https://img-bss.csdn.net/202004260858535136.jpg" alt="" /><br /> </span> </p> <p> <span style="font-size:16px;"><img src="https://img-bss.csdn.net/202004260859074920.jpg" alt="" /><br /> </span> </p> <p> <span></span> </p> <p> <span></span> </p>
相关推荐
<p> <br /> </p> <p align="left" class="MsoNormal" style="background:white;"> Linux创始人<span>Linus Torvalds</span>有一句名言:<span>Talk is cheap, Show me the code.</span>(冗谈不够,放码过来!)。<span></span> </p> <p align="left" class="MsoNormal" style="background:white;"> 代码阅读是从入门到提高的必由之路。尤其对深度学习,许多框架隐藏了神经网络底层的实现,只能在上层调包使用,对其内部原理很难认识清晰,不利于进一步优化和创新。<span></span> </p> <p align="left" class="MsoNormal" style="background:white;">   </p> <p align="left" class="MsoNormal" style="background:white;"> YOLOv3是一种基于深度学习的端到端实时目标检测方法,以速度快见长。 </p> <p align="left" class="MsoNormal" style="background:white;"> YOLOv3的实现<span>Darknet</span>是使用<span>C</span>语言开发的轻型开源深度学习框架,依赖少,可移植性好,可以作为很好的代码阅读案例,让我们深入探究其实现原理。<span></span> </p> <p align="left" class="MsoNormal" style="background:white;">   </p> <p align="left" class="MsoNormal" style="background:white;"> 本课程将解析<span>YOLOv3</span>的实现原理和源码,具体内容包括:<span></span> </p> <p align="left" class="MsoNormal" style="text-indent:-18pt;background:white;"> <br /> </p> <ul> <li>      <span>YOLO目标检测原理 </span> </li> <li>      神经网络及Darknet的C语言实现,尤其是反向传播的梯度求解和误差计算  </li> <li>      代码阅读工具及方法  </li> <li>      深度学习计算的利器:BLAS和GEMM  </li> <li>      GPU的CUDA编程方法及在Darknet的应用  </li> <li>      YOLOv3的程序流程及各层的源码解析 </li> </ul> <!--[if !supportLists]--> <p> <br /> </p> <p align="left" class="MsoNormal" style="background:white;">   </p> <p align="left" class="MsoNormal" style="background:white;"> 本课程将提供注释后的<span>Darknet</span>的源码程序文件。<span></span> </p> <p align="left" class="MsoNormal" style="background:white;">   </p> <p align="left" class="MsoNormal" style="background:white;"> 除本课程《<span>YOLOv3</span>目标检测:原理与源码解析》外,本人推出了有关<span>YOLOv3</span>目标检测系列课程,包括:<span></span> </p> <p align="left" class="MsoNormal" style="background:white;"> <br /> </p> <ul> <li>   《YOLOv3目标检测实战:训练自己的数据集》 </li> <li>   《YOLOv3目标检测实战:交通标志识别》 </li> <li>   《YOLOv3目标检测:原理与源码解析》 </li> <li>   《YOLOv3目标检测:网络模型改进方法》 </li> </ul> <p> <br /> </p> <p align="left" class="MsoNormal" style="background:white;">   </p> <p align="left" class="MsoNormal" style="background:white;"> 建议先学习课程《<span>YOLOv3</span>目标检测实战:训练自己的数据集》或课程《<span>YOLOv3</span>目标检测实战:交通标志识别》,对<span>YOLOv3</span>的使用方法了解以后再学习本课程。<span></span> </p> <p> <br /> </p> <p> <span></span><span></span><span></span><span></span> </p>
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值