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

2020-12-08 09:50:52 浏览数 (1)

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 的公式。 bw​=pw​∗etw 我曾经搞不懂,为什么要弄这么奇怪的指数函数进去,有没有多此一举,直接预测不好吗? 后来,我想了一下,大概有 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 的尺寸是:

代码语言:javascript复制
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 种尺寸:

代码语言:javascript复制
(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

0 人点赞