YOLO V2 论文阅读总结和讨论

YOLOV2检测算法精讲
本文深入探讨YOLOV2目标检测算法,介绍其结构改进、性能提升策略及半监督学习方法。从全卷积网络到多尺度训练,详述YOLOV2如何在精度和速度上超越前辈。

 

YOLO V2 论文阅读总结和讨论

look for papers for yolo2 contributer : leoluopy

github地址:https://github.com/leoluopy/paper_discussing/blob/master/yolo/yolo2/yolo2_discussing.md

YOLO V1: https://github.com/leoluopy/paper_discussing/blob/master/yolo/yolo1/yolo1_discussing.md

YOLO V2:https://github.com/leoluopy/paper_discussing/blob/master/yolo/yolo2/yolo2_discussing.md

YOLO V3:https://github.com/leoluopy/paper_discussing/blob/master/yolo/yolo3/yolo3_discussing.md

Overview

  • 提出一种新型半监督的学习方法未标注boundingBox的分类图像来学习box检测任务
  • yolo1的升级版本,更快,更准。

结构综述

结构与yolov1类似,但是提出了改进。网络支持多种分辨率,采用了全卷积网络,在不同数据集和不同场景下可以设置不同S。

输入分辨率最终特征图
41613x13
44814x14
48015x15
51216x16
60819x19

对于预测时的Anchor以及tensor如下图所示:

对比YOLOv1预测tensor: (5 x B +C )× S × S

每一个BoundingBox回归的是(x,y,w,h ,confidence)还有一个confidence:代表是否有对象的置信度。

YOLOv2 做出了扩展和改进 预测tensor:(B x (5 + C) )× S × S : 每个BoundingBox,都做预测类别。

B是Bounding Box 个数,也是YOLOV2 通过聚类得到的先验框个数。YOLOV2 对于每个Box都做了类别的预测。Cx 和Cy 是网格位置,Pw 和 Ph 是先验框参考长宽。

由于这种新机制的加入,每个cell会预测多个Box和多个类别,使得Yolov2对于小目标和单个网格多目标的检测效果得到不错提升。在顶级比赛中超越了当时的 FasterRCNN 系列和 SSD 系列。

模型及训练方法

  • 类似VGG模型,3x3卷积提取特征,在pool层降维后扩充特征提取深度至filter数2倍。在feature压缩上仍然使用1x1卷积,和yolo1一致。

  • 每个卷积层后加入BN,加速梯度下降。

  • 分类网络的训练:

    • 224 分辨率分类网络训练: 72.9% top-1 accuracy and 91.2% top-5 accuracy on ImageNet
    • 224 网络训练方法:
      • 160 epochs , momentum SGD优化方法
      • 起始学习率 0.1,多项式衰减 power:4 ,decay: 0.0005 , momentum : 0.9
    • 448 分辨率分类网络训练(全卷积网络直接finetune): a top-1 accuracy of 76.5% and a top-5 accuracy of 93.3%
    • 图像增广方法:中心裁剪, 图像旋转, 色相调整, 饱和调整, 曝光调整
  • 基于分类网络作为backbone修改为检测网络:

    • 去除最后一层卷积网络,替换为3x3和1024个filter的卷积网络,随后再跟一层1x1卷积网络(filter数目就是最后需要输出的tensor)
  • 检测网络训练:

    • 训练超参:10^-3 前60epoch ,10^-4 第60-90 epoch,10^-5第90-160 epoch
    • 使用momentum优化方法 decay:0.0005

性能与速率提升

  • 对于每个卷积层后加入BN,给mAP贡献大约2个点。

  • 预训练分辨率提升(先224分辨率训练,随后448分辨率训练高分辨率分类器),给mAP贡献约4个点

  • AnchorBox使得预测框数量大量增加,对于mAP影响不大,但提高了召回

    • No Anchor:69.5 mAP with a recall of 81%
    • With Anchor:69.2 mAP with a recall of 88%
  • 先验框聚类选择K=5,保持了IOU,以及召回之间的平衡。

  • 细粒度特征 原始维度:13x13x1024 (详见上文检测网络修改) + passthrough layer: 26x26x512 -》 13x13x2048,类似于resNet的shortCut机制,给mAP贡献了大约1个点。
  • 多尺度训练 每10个epoch切换输入图像输入维度,图像维度: {320, 352, ..., 608},由此,yolo网络在训练中得到了对多个尺度下输入图片的鲁棒性,并且在多个图像大小情况下,非常便捷得到速度与精度的折中。只需要修改输入图像大小即可,而网络没有发生变化。。

    smallest option is 320 × 320 and the largest is 608 × 608

  • 分类器训练 见上文
  • 检测器训练 见上文

9000类别检测器的半监督训练

使用wordNet构建如上图所示,树状分类label网络。

ImageNet对1000个类直接使用softmax分类,因为类之间互斥。新建的wordTree,对同义类之间使用SoftMax。

同义类之间不存在绝对的互斥关系,特别是父子关系的类别,不存在互斥关系

对于没有detection标签的数据训练方式:对于分类loss的反向传播不变,随后找到对于该分类预测置信度最高的BoundingBox,使用这个BoundingBox的信息来做反向传播,并且假设和groundTruth至少有0.3的IOU ;使用这种方法在COCO这种本来就有detection label的类别上取得了不错的效果,但是比如想clothing , sunglasses 这样在COCO上没有的数据,就没有取得比较好的效果。

 

<think>好的,我需要帮助用户分析YOLO算法的源码实现细节。首先,我应该回顾YOLO的基本原理,因为理解算法结构对源码分析至关重要。YOLO的核心思想是将目标检测视为回归问题,直接在图像网格上预测边界框类别概率。用户提到的引用[2][3]涉及到YOLO的输入分辨率调整位置预测机制,这些可能在源码中有具体体现。 接下来,我应该考虑YOLO的网络架构。引用[4]提到了Darknet-19作为YOLOv2的基础,使用3x3卷积、批标准化等。源码中的网络层结构可能包含这些组件,需要查看卷积层、池化层激活函数的实现。用户可能对网络的前向传播反向传播过程感兴趣。 然后,数据预处理部分也很重要。YOLO在训练时可能对输入图像进行缩放、归一化,并生成对应的标签数据,比如将真实框匹配到网格单元。引用[2]指出YOLO调整输入分辨率,这部分在数据加载增强的代码中可能有体现。 目标函数的实现是关键,包括坐标损失、置信度损失分类损失。用户提到的引用[3]讨论了直接位置预测,源码中可能有计算预测框坐标的部分,如使用Sigmoid函数限制偏移量,避免位置预测不稳定。需要分析损失函数的具体计算方式,比如均方误差或交叉熵的应用。 后处理步骤如非极大值抑制(NMS)也是源码的重要组成部分。预测后,模型会生成多个边界框,NMS用于筛选最优结果。这部分代码可能涉及排序阈值处理,用户可能想知道如何实现高效的NMS。 此外,训练流程参数设置,如学习率调整、优化器选择,以及多尺度训练策略(引用[2]中的分辨率变化)也需要解释。用户可能关心如何复现论文中的训练过程。 最后,结合用户提供的引用,需要指出源码中与这些改进相关的地方,比如位置预测的优化(引用[3])、网络结构设计(引用[4])等。用户的问题可能涉及YOLO不同版本的差异,比如v1、v2v3在源码上的变化。 现在需要确保回答结构清晰,分点阐述源码的关键部分,并引用相关的文献支持。同时生成相关问题,帮助用户进一步深入。</think>### YOLO算法源码实现关键分析 #### 1. 网络架构实现 YOLO系列算法的网络架构在不同版本中有所区别,以YOLOv3为例,其主干网络为Darknet-53: ```python class Darknet53(nn.Module): def __init__(self): super().__init__() self.conv1 = ConvBN(3, 32, kernel=3, padding=1) self.layer1 = self._make_layer(32, 64, 1) # 后续包含残差块多尺度预测头 ``` 该架构使用$3×3$$1×1$卷积组合,通过跨层连接实现特征复用[^4]。每个卷积层后接批量标准化LeakyReLU激活: $$f(x) = \begin{cases} x & \text{if } x > 0 \\ 0.1x & \text{otherwise} \end{cases}$$ #### 2. 目标定位预测 YOLO通过网格单元预测边界框坐标,实现直接位置预测: ```python # 预测偏移量计算 raw_xy = predictions[..., 0:2] grid_xy = grid.view(1, grid_size, grid_size, 1, 2) pred_xy = (torch.sigmoid(raw_xy) + grid_xy) * stride ``` 这对应论文中公式: $$b_x = \sigma(t_x) + c_x \\ b_y = \sigma(t_y) + c_y$$ 有效避免了早期训练不稳定问题[^3] #### 3. 多尺度预测 YOLOv3实现三个尺度的预测: ```python for idx, (pred_l, feature_l) in enumerate(zip(predictions, features)): # 13x13, 26x26, 52x52三种尺度 grid_size = feature_l.size(2) anchor = self.anchors[idx] ``` 每个尺度预测$3×(4+1+num\_class)$维向量,其中4为框参数,1为置信度,num_class为类别概率[^4] #### 4. 损失函数实现 损失函数包含三部分: ```python coord_loss = mse_loss(pred_xy, target_xy) + mse_loss(pred_wh, target_wh) conf_loss = bce_loss(pred_conf, target_conf) cls_loss = ce_loss(pred_cls, target_cls) total_loss = coord_weight * coord_loss + conf_loss + cls_loss ``` 其中坐标损失权重通常设置为5,反映位置预测的重要性[^3] #### 5. 数据增强策略 YOLO实现多种数据增强: ```python transform = Compose([ RandomHorizontalFlip(), RandomResize(scales=(320, 608), keep_ratio=True), ColorJitter(brightness=0.5, contrast=0.5, saturation=0.5), ToTensor() ]) ``` 支持多尺度训练策略,验证时输入分辨率可动态调整[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值