共计 1847 个字符,预计需要花费 5 分钟才能阅读完成。
传统目标检测的痛点
在 YOLO 出现之前,主流的目标检测方法(如 R -CNN 系列)通常采用多阶段流程:

- 生成候选区域(Selective Search 等)
- 对每个区域进行特征提取
- 分类和回归
这种方法存在明显缺陷:
- 计算冗余(相同区域被多次处理)
- 速度慢(无法满足实时需求)
- 流程复杂(需要多个独立模块)
YOLO 的革命性突破
YOLO(You Only Look Once)的核心思想是将目标检测转化为单阶段回归问题:
- 将图像划分为 S×S 网格
- 每个网格预测 B 个边界框及其置信度
- 同时预测类别概率
这种设计带来了显著优势:
- 端到端训练
- 推理速度快(可达 45FPS)
- 全局上下文感知
架构演进对比
YOLOv1(2016)
- 24 层卷积 + 2 层全连接
- 输入 448×448
- 7×7 网格,每个网格预测 2 个边界框
YOLOv3(2018)
- Darknet-53 主干网络
- 多尺度预测(3 种尺度)
- 使用 Anchor boxes
- 更优的损失函数
YOLOv5(2020)
- 更灵活的架构(s/m/l/ x 变体)
- 自适应 Anchor 计算
- 改进的数据增强
- 更快的训练速度
PyTorch 实现核心代码
# Darknet-53 残差块
class ResidualBlock(nn.Module):
def __init__(self, in_channels):
super().__init__()
self.conv1 = nn.Conv2d(in_channels, in_channels//2, 1)
self.conv2 = nn.Conv2d(in_channels//2, in_channels, 3, padding=1)
self.bn = nn.BatchNorm2d(in_channels)
self.leaky = nn.LeakyReLU(0.1)
def forward(self, x):
residual = x
out = self.leaky(self.bn(self.conv1(x)))
out = self.leaky(self.bn(self.conv2(out)))
out += residual
return out
# 多尺度预测头
class YOLOLayer(nn.Module):
def __init__(self, anchors, num_classes):
super().__init__()
self.anchors = anchors
self.num_anchors = len(anchors)
self.num_classes = num_classes
def forward(self, x):
# x shape: [batch, anchors*(5+num_classes), grid, grid]
batch_size = x.size(0)
grid_size = x.size(2)
# 调整维度顺序
x = x.view(batch_size, self.num_anchors, 5+self.num_classes, grid_size, grid_size)
x = x.permute(0,1,3,4,2).contiguous()
# 解码预测结果
x[..., 0:2] = torch.sigmoid(x[..., 0:2]) # 中心点坐标
x[..., 4:5] = torch.sigmoid(x[..., 4:5]) # 置信度
x[..., 5:] = torch.sigmoid(x[..., 5:]) # 类别概率
return x
训练常见问题及解决方案
问题 1:小目标检测效果差
解决方案 :
- 增加输入图像分辨率
- 使用更密集的 Anchor boxes
- 加强小目标数据增强(如 mosaic)
- 调整损失函数权重
问题 2:训练出现 NaN 值
排查步骤 :
- 检查学习率是否过大
- 验证数据标注是否合规
- 检查梯度爆炸(添加梯度裁剪)
- 排查数值不稳定操作(如除法)
问题 3:ONNX 导出失败
注意事项 :
- 确保所有操作都支持 ONNX
- 检查动态尺寸问题
- 验证导出后的模型精度
- 使用 opset_version=11 或更高
嵌入式设备优化
在 Jetson Nano 等设备上部署时:
- 模型量化 :
- 训练后量化(PTQ)
-
量化感知训练(QAT)
-
TensorRT 加速 :
- FP16/INT8 优化
- 层融合
-
内存优化
-
剪枝 :
- 通道剪枝
- 层剪枝
延伸思考
- 如何结合 Transformer 提升 YOLO 性能?
- 替换 CNN 主干网络
- 设计混合架构
-
注意力机制改进
-
工业质检场景如何设计损失函数?
- 针对缺陷特点定制
- 平衡不同类别权重
- 引入度量学习
实践建议
对于初学者,建议从 YOLOv5 开始:
- 使用官方预训练模型
- 从小数据集开始实验
- 逐步调整超参数
- 可视化中间结果
记住:目标检测不仅是模型的问题,数据质量、标注精度、预处理流程同样重要。
正文完
