天天看点

YOLOv3 从入门到部署:(一)YOLOv3概述YOLOv3 从入门到部署:(一)YOLOv3概述

文章目录

  • YOLOv3 从入门到部署:(一)YOLOv3概述
    • 目录
    • VOC数据集合coco数据集
    • YOLO的发展
    • YOLOv3的网络架构
    • yolov3-tiny的工作过程概述
    • yolo-fastes和yolo-fastest-xl
    • 目录

YOLOv3 从入门到部署:(一)YOLOv3概述

目录

VOC数据集合coco数据集

这是目标检测领域常用的两个数据集。VOC和coco的区别主要在于图像标注的格式不一样。VOC将目标的标签信息以某种格式保存在.xml格式的文件中,而coco则是保存在.txt文件中。因此有时候VOC和coco不是指数据集,而是指数据集标注格式。我们完全没有必要去研究每种标注格式的细节,网络也有大量的两种格式相互转换的代码以及对应的数据集加载代码。

YOLO的发展

关于YOLO的发展以及对于v1-v3的介绍,网上的资料数不胜数,这里不再赘述,只做简单总结。

  • YOLO的全称:You only look once.
  • YOLOv1:YOLOv1是第一次使用回归的思想进行目标检测。想法很简单,就是使用深度学习,让模型在输入的图片与输出的目标的坐标位置以及类别之间进行回归。其中涉及到的特征提取完全交给神经网络去完成。v1的骨干网络使用与VGG类似的结构。
  • YOLOv2:YOLOv2在v1的基础上将骨干网络替换为DarkNet。DarkNet比v1的骨干网络有更小的卷积核,加入了BN层和passthrough层;最终结果就是参数量更少,速度更快,但是精度相当。v2还设计了先验框,称之为anchor。(这里暂时不解释anchor)
  • YOLOv3:YOLOv3进一步改进了网络架构,引入了残差连接,然后还使用不同尺度的特征图进行预测,极大提高了模型进行多尺度目标检测的能力。YOLOv3还对损失函数进行了一些修改。

YOLOv3的网络架构

YOLOv3 从入门到部署:(一)YOLOv3概述YOLOv3 从入门到部署:(一)YOLOv3概述

上图是YOLOv3的经典架构,图片摘自https://blog.csdn.net/litt1e/article/details/88907542。

除此以外,比较常用的还有YOLOv3-tiny的网络架构,如下图

YOLOv3 从入门到部署:(一)YOLOv3概述YOLOv3 从入门到部署:(一)YOLOv3概述

图片摘自https://zhuanlan.zhihu.com/p/93809416。

yolov3-tiny的工作过程概述

我们以yolov3-tiny为例描述一下yolo的工作过程:

输入是一张416*416大小的三通道图像,输入数据经过不断的卷积核池化的操作,特征图的维度逐渐缩小,但是通道数逐渐增加。直到最后输出结果维度为13*13*255。相比于原始图像的大小,输出结果相当于是缩小了32倍,但是通道数变成了255。

输出的特征图不在意味着“特征”,而是最终的预测结果。对于一个目标,我们要预测这么几个值:目标框的中心坐标(2个值),目标框的长宽(2个值),目标框的置信度(1个值,表示该区域有无目标的置信度),以及目标框的类别(coco数据集一共有80种类别,所以是80个值,每个值表示对应类别的置信度)。总计需要预测85个值。

yolov3使用了anchor,这里我们暂时不深入讲解anchor的详细计算过程(请关注后续篇章),只是大致描述anchor的作用:网络在训练的过程中需要不断搜索优化参数,使得模型能够拟合标签。但是研究者发现如果提前告知模型这些训练样本中的目标的大小,模型可以更快地收敛,并提高检测性能。很容易理解,模型从一个已经可能位于收敛点附近的初始值进行优化,一定比从一个随机的初始值进行优化更容易达到收敛点。这个被提前告知的训练样本中的目标的大小就是anchor。但是训练样本中的目标有很多类型,大小不一,应该提前告知模型几个anchor呢?这是一个超参数,yolov3选择使用3个anchor。那么这3个anchor怎么得到呢?肯定不能随便选3个吧。在yolov3中,作者使用聚类的方法挑选出3个最具有代表性的目标框的长宽作为3个anchor。模型在进行预测的时候,会以这3个anchor为初始值去进行模型的优化。问题来了,对于每个anchor,模型都会以它为初始值进行搜索,从而得到一组拟合结果,也就是上述的85个值。所以对于一个目标,模型会得到3个预测结果,每个预测结果包含85个值,一共是3*85=255个值。因此yolov3-tiny的输出结果的通道数255并不是一个随意设置的数字。

但是问题又来,对于一个目标,模型会得到3个预测结果。那最终应该相信哪一个呢?在训练阶段,我们通过计算每个预测结果与真实标签的IOU(一种评价指标,可自行搜索)来选择应该相信哪一个预测结果;在验证或者推理阶段,同一个目标可能会得到多个预测结果,这时我们通过NMS算法(可自行查阅)来选择使用哪一个预测结果。

但是yolov3-tiny输出结果维度为13*13*255,这意味着它最多只能预测13*13个目标,因为它最多只能拟合出这么多参数。也可以从感受野的角度理解为什么它最多只能预测13*13个目标。之前我们说道,网络的特征图大小是在不断缩小的,从输入到输出一共缩小了32倍。输出结果也是一张特征图,我们粗略估算输出结果的每个值的感受野是32*32(这里计算方法并不严谨,详细的感受野计算可查阅相关资料)。试想,如果输入图像有两个目标,其中目标A的大小大于感受野,目标B的大小小于感受野。经过层层卷积以后到达输出的时候,目标A在13*13的特征图上还有踪迹,但是目标B早已被缩小得“看不到了”。也就是说,yolov3-tiny输出结果维度为13*13*255只能识别一些比较大的目标,比较小的目标可能就会被忽视。为了解决这一问题,yolov3-tiny选择融合深层和浅层的信息进行预测。浅层的特征图较大,感受野较小,局部信息较强,;深层的特征图较小,全局信息更强。通过将局部信息和全局信息进行融合,提高对小面积的目标的检测性能。如上图所示,yolov3-tiny在右侧又输出了一个维度为26*26*255的结果,其最多可以预测26*26个目标。

YOLO的经典结构的输入输出与yolov3-tiny类似,只是输出有个三个,维度分别为13*13*255,26*26*255,52*52*255。

yolo-fastes和yolo-fastest-xl

https://zhuanlan.zhihu.com/p/234506503

这篇博客介绍了更为轻量化的yolo-fastes和yolo-fastest-xl。

YOLOv3 从入门到部署:(一)YOLOv3概述YOLOv3 从入门到部署:(一)YOLOv3概述

yolo-fastes和yolo-fastest-xl沿用yolov3的思想,但是在网络结构上进行了重大改变,使得极大地减少了网络参数同时还不失性能。与yolov3-tiny相比,其主要特点如下:

  • 加入残差连接,使得网络更深;
  • 减少特征图的通道数,极大减少了参数量;
  • 使用分组卷积,极大减少了参数量;
  • 由于参数量很少,使用droupout防止过拟合。

后续第二篇博客我们会以yolo-fastest-xl为例搭建网络模型。

目录

继续阅读