YOLOV3 原理

Yolo V3的关键技术:
在这里插入图片描述

  • V3改进的出发点是检测效果,最大的改进就是网络结构,更适合小目标检测
  • 特征做的更细致,利用不同层的征图信息来预测不同规格物体
  • 先验框更丰富了,3种scale,每种3个规格,一共9种
    yolov1版本有2种先验框,v2版本有5种先验框,v3版本有9种先验框
  • softmax改进,预测多标签任务,每个种类都作为二分类

YOlO V3 多Scale
为了能检测到不同大小的物体,设计了3个scale特征图,1313,2626,52*52分别预测大,中,小三个目标。在每一种scale上产生三种box,一共产生9种候选框。

在这里插入图片描述核心网络架构

  • 没有池化和全连接层,全部卷积
    池化层压缩了特征,影响效果。
  • 下采样通过stride为2实现,
    通过卷积的stride为2 实现了下采样。
  • 3种scale,更多先验框
  • 基本上当下经典做法全融入了(引入了Res block)

在这里插入图片描述

多scale特征图是怎么得到的呢?

  • 网络输入尺寸是416,通过32倍下采样得到了13*13 特征图。
  • 网络输入尺寸是416,通过16倍下采样,得到了2626特征图,并且再融合1313上采样到26*26的特征。
  • 网络输入尺寸是416,通过8倍下采样,得到了5252特征图,并且再融合2626上采样到52*52的特征。

YOLOv3网络输出

  • YOLOv1的网络输出是772(4+1+80)
  • YOLOv2的网络输出是13135(4+1+80)
  • YOLOv3的网络输出是有三部分组成,分别是:13133*(4+1+80), 26263*(4+1+80) 和 52523(4+1+80)

在这里插入图片描述先验框设计

  • YOLOV1 用了YOLOV2中选了5个,Yolov3,一共有9种
  • 13 ∗ 13 13*13 1313特征图上:(116x90),(156x198),(373x326)
    26 ∗ 26 26*26 2626特征图上:(30x61),(62x45),(59x119)
    52 ∗ 52 52*52 5252特征图上:(10x13),(16x30),(33x23)

类别预测

yolov3不再使用softmax,作为内别预测,而只是使用独立的logistic分类器。在训练期间,我们使用二元交叉熵损失进行类预测。
在迁移到更复杂的领域(如Open Images Dataset)时,此方法会有所帮助。在此数据集中有许多重叠标签(即女人和人)。使用softmax假设每个框只有一个类,而通常不是这种情况。多标签方法可以更好地模拟数据。

### YOLOv3 工作原理详解 #### 特征提取网络 (Feature Extraction Network) YOLOv3 使用 Darknet-53 作为骨干网络,这是一个由多个残差块组成的深层卷积神经网络[^1]。Darknet-53 的设计借鉴了 ResNet 中的残差连接结构,使得更深的网络能够有效训练。 ```python class DarknetBlock(nn.Module): def __init__(self, in_channels, out_channels): super(DarknetBlock, self).__init__() self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=1) self.conv2 = nn.Conv2d(out_channels, out_channels * 2, kernel_size=3, padding=1) def forward(self, x): residual = x out = F.leaky_relu(self.conv1(x), inplace=True) out = F.leaky_relu(self.conv2(out), inplace=True) return out + residual ``` #### 多尺度预测 (Multi-Scale Predictions) 为了提高小物体检测性能,YOLOv3 引入了多尺度特征融合机制。具体来说,模型会从三个不同层次的特征图上分别进行边界框预测: - 尺寸为输入图像大小的 1/32 的最深层特征图负责大尺寸对象; - 尺寸为输入图像大小的 1/16 的中间层特征图用于中等尺寸的对象; - 尺寸为输入图像大小的 1/8 的浅层特征图则专注于小型对象。 这种策略允许模型在同一张图片的不同区域捕捉到各种规模的目标信息。 #### SPP 模块 (Spatial Pyramid Pooling Module) 空间金字塔池化(SPP)模块被应用于主干网之后,旨在增强感受野并捕获更丰富的上下文信息。SPP 层通过在不同的窗口大小下执行最大池操作并将它们拼接在一起形成固定长度向量来实现这一点[^2]。 ```python def spp_layer(x): levels = [1, 2, 4] batch_size, channels, height, width = x.size() features = [] for level in levels: size_h = int(np.ceil(height / float(level))) stride_h = np.floor(height / float(level)) size_w = int(np.ceil(width / float(level))) stride_w = np.floor(width / float(level)) max_pool = nn.MaxPool2d(kernel_size=(size_h, size_w), stride=(stride_h, stride_w)) pooled_features = max_pool(x).view(batch_size, -1) features.append(pooled_features) concatenated_feature = torch.cat(features, dim=-1) return concatenated_feature ``` #### 边界框回归与分类 (Bounding Box Regression and Classification) 对于每一个网格单元格中的每个锚点(Anchor),YOLOv3 预测五个参数:四个坐标偏移量以及一个表示是否存在目标的概率得分。此外还会输出一组条件概率分布用来指示当前候选区域内属于各个类别的可能性[^5]。 损失函数采用均方误差(MSE Loss)计算位置偏差,并结合二元交叉熵(Binary Cross Entropy Loss)评估置信度和类别标签之间的差异。总体而言,总损失函数是由上述三部分损失函数加权求和得到的,其中物体置信度损失、分类损失和坐标损失的权重分别为1、1和5。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值