YOLOv1 论文详解【论文笔记 + pytorch实现 附.pth权重文件】

1 绪论

     Yolo算法是运用于目标检测的一种算法,其全称是You Only Look Once: Unified, Real-Time Object Detection,从该论文标题中即可体现出Yolo算法的特点:

  • You Only Look Once指的是在预测时只需要对图片进行一次CNN运算;
  • Unified指的是该算法是一个统一的框架,提供end-to-end的预测;
  • Real-Time指Yolo算法速度快,可实现45fps,已达到实时检测要求。

     此外,再根据paper中的描述对Yolo的优缺点进行一个补充:

  • pros:相比于DPM、R-CNN,Yolo的泛化能力强,可以学习到物体的通用特征;且Yolo假阳性错误少,即把背景预测为物体的错误率少。
  • cons:一个网格仅可预测一种类别的一种物体,对于分布密集的物体检测任务表现较差。

2 YOLO算法思想

2.1 YOLO算法的大致流程

  1. Resize Image :将输入图像尺寸改变为448×448
  2. 将448×448的图像尺寸输入到卷积神经网络中
  3. 利用Non-max suppression得到最后的结果(最后的结果包括类别、置信度、预测边界框)

2.2 YOLO算法的详细思路

  1. 将Resize后的图片隐式得分为S×S个网格;
  2. 如下图,图片中物体的中心落在哪个网格内,哪个网格就负责预测这个物体。下图中狗的中心落在绿色网格内,那么绿色网格负责预测狗;同理蓝色网格负责预测自行车;
  1. 每个网格需要预测B个框,C个类别。(注意: B个框仅能预测同一类别中的一个物体)。
    如果一个网格中出现了两个物体的的中心,或者一个网格中包含了很多小物体,那么YOLO算法仅能检测出一个类别中的一个物体,所以YOLO对靠的很近的物体以及小目标群体检测表现不佳。

  2. YOLO网络最终输出为7×7×30的tensor。对于下图,狗的中心点落在红框网格中,该红框网格负责预测2个框(论文中作者将B设为2),每个框包含了位置信息和置信度(x, y, w, h, confidence),其中x, y表示框的中心点坐标,w, h表示框的宽和高,(x, y, w, h均经过归一化,故它们的值的范围在(0, 1))。
    置信度confidence=Pr(object)×IOU p r e d t r u t h ^{truth}_{pred} predtruth
    其中:Pr(object)表示物体先验概率,即如果框内包含物体,值为1,否则为0;
    IOU p r e d t r u t h ^{truth}_{pred} predtruth表示预测框与真实框的交并比,其范围为(0, 1),故confidence的值的范围也为(0,1)。

  1. 对于每一个网格还要预测出C个类别概率值。对7×7×30的tensor做个解释:7×7为开始将448×448尺寸的图像隐式的分割为S×S的网格,论文中作者将S设为7;论文中采用PASCAL VOC数据集训练,该数据集有20个类别,故对于每个网格需要预测这20个类别的概率。所以对于每个划分的网格,需要由S×S×(B×5+C)维度的tensor。

3 YOLO网络结构

      YOLO把检测任务当做回归任务,故可以进行端到端训练。采用卷积神经网络来提取特征,然后使用全连接层来得到预测值。其网络结构参考GooLeNet模型,包含24个卷积层和2个全连接层。
      对于卷积层,主要使用1x1卷积来做channle reduction,然后紧跟3x3卷积。对于卷积层和全连接层,采用Leaky ReLU激活函数:max(x, 0.1x),最后的输出层采用线性激活函数。
      网络结构输入为448×448×3大小的图片,输出为7×7×30的tensor。

4 网络训练

     在一个网络的实现中,最主要的就是怎么设计损失函数,作者简单粗暴的全部采用了sum-squared error loss来做这件事。但是这种做法存在以下几个问题:
     第一,8维的localization error和20维的classification error同等重要显然是不合理的;
     第二,如果一个网格中没有物体(一幅图中这种网格很多),那么就会将这些网格中的box的confidence push为0,相比于较少的的有物体的网格,这会导致网络不稳定甚至发散。
     考虑以上两个问题,最终的损失函数如下。

4.1 损失函数分析

     损失函数共为5项加和,可把它们看为4个部分。
     第一部分为中心点损失,即为边界框中心坐标的误差项, 1 i j o b j 1^{obj}_{ij} 1ijobj指的是第 i {i} i个单元格存在目标,且该单元格中的第 j {j} j个边界框负责预测该目标;
     第二部分为宽高损失项,即为边界框的高与宽的误差项;
     第三部分为置信度损失项,由包含目标边界框的置信度误差项和不包含目标的边界框的置信度误差项组成;
     最后一部分为类别损失,表示包含目标的单元格的分类误差项, 1 i o b j 1^{obj}_{i} 1iobj指第 i {i} i个单元格存在目标。

     对于每张图片,大多数网格不包含目标,则损失函数中仅包含置信度损失项中的第二项,这样会使得loss计算的失衡,从而影响包含目标的网格的梯度,导致模型不稳定。故损失函数对不同的部分采用了不同的权重值。首先区分定位误差和分类误差。

     我们知道在训练过程中(loss逐渐降低),不含目标的检测框其置信度向0收敛,包含目标的检测框的置信度向1收敛。由于最终的98个检测框中,大部分均不含目标,所以这种noobj的检测框在loss中占的比重更大,会导致其对总体loss下降的贡献也越大,使得包含目标的检测框向1收敛(训练的一个重要目的)的速度较慢。这不是我们想要的结果,因此对其设置权值可以有效地抑制这种情况的发生。

     通过增加包含目标的边界框坐标及宽高对应的loss,减小不包含目标的边界框置信度损失项,引入两个权重: λ c o o r d λ_{coord} λcoord=5、 λ n o o b j λ_{noobj} λnoobj=0.5

     此外,采用均方误差同等对待大小不同的边界框,较小的边界框的坐标误差要比较大的边界框要更敏感。为了缓解这种空间上的不均衡,将网络的边界框的宽与高预测改为对其平方根的预测,即预测值变为(x, y, w \sqrt{w} w , h \sqrt{h} h )。

     最后,由于每个网格预测多个边界框。但其对应类别只有一个。那么在训练时,如果该单元格内确实存在目标,那么只选择与ground truthIOU最大的那个边界框来负责预测该目标,而其它边界框认为不存在目标。

4.2 网络训练细节

  1. 网络预训练:在ImageNet数据集上进行预训练,其预训练的模型采用上图网络结构中前20个卷积层,之后添加一个average-pool层和全连接层。(预训练的输入图片大小为224×224
  2. 预训练后:在预训练得到的20层卷积层之后加上随机初始化的4个卷积层和2个全连接层。由于检测任务一般需要更高清的图片,所以将网络的输入尺寸从224x224增加到了448x448。整个网络的流程如下图所示:
  1. 超参数设置
    batch_size=64、momentum=0.9、decay=0.0005、epochs=135
    learning rate:第一个epoch学习率从0.0001逐渐增长到0.01
    2-75 epochs:learning rate = 0.01
    76-105 epochs:learning rate = 0.001
    106-135 epochs:learning rate = 0.0001

5 pytorch实现YOLOv1

     之前提到过,YOLOv1网络结构是基于GoogleNet设计的,且YOLOv1的前20层是用于特征提取,也就是说随便替换为一个分类网络(除去最后的全连接层)其实都行。而pytorch的torchvision模块中提供了ResNet网络的预训练模型,其训练集也是ImageNet,相当于有先成预训练好的模型可以直接使用。因此,为了节省网络的预训练时间,这里使用ResNet50网络作为特征提取部分。
     然后,去掉ResNet网络的最后两层,再连接上YOLOv1的最后4个卷积层和两个全连接层,作为我们训练的网络结构。
     此外还进行了一些小调整,比如最后增加了一个Sigmoid层,以及在卷积层后增加了BN层等等。

结果展示:

     代码github地址https://github.com/Bryce-HJ/yolov1_pytorch

     该代码附有详细注释,结合本文应该可以很顺利的看懂。若有问题欢迎评论区留言。

     此外运行该项目最好还是使用GPU运行,对于有硬件限制的朋友若不能对网络进行训练,这里也提供项目的训练好的 .pth权重文件 ,大小为100M,下载该权重文件放入对应文件夹,即可直接对图片进行预测。

权重文件获取方式:关注【OAOA】回复【0813】即可获取。

  • 15
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值