YOLOv10 是由 Ultralytics 团队在 2024 年提出的新一代目标检测模型,在保持高精度的同时进一步优化了部署效率和推理速度。
它的核心改进包括:
改进方向 | 内容 |
---|---|
✅ 非解耦头轻量化设计 | 消除非必要分支,减少冗余计算 |
✅ Anchor-Free 模式 | 默认启用,无需手动设置 anchor |
✅ TAL + DFL Loss | 提升边界框回归质量 |
✅ 多任务统一接口 | detect / segment / pose / classify |
✅ 更强的部署支持 | ONNX / TensorRT / CoreML 等格式 |
本文将围绕这些关键改进进行深入讲解。
改进点 | 内容 | 是否首次提出 | 是否开源实现 |
---|---|---|---|
✅ Partial Decoupled Head | reg 分支独立,obj/cls 共享分支 | ✅ 是 | ✅ 是 |
✅ 消除非极大值抑制冗余 | 使用 Task-Aligned Assigner 替代 NMS | ✅ 是 | ✅ 是 |
✅ Anchor-Free 模式 | 默认使用,无需 anchor 聚类 | ✅ 是(继承自 YOLOv8) | ✅ 是 |
✅ DFL Loss | Distribution Focal Loss 提升回归稳定性 | ✅ 否(ECCV 2020 提出) | ✅ 是 |
✅ 统一任务接口 | detect / segment / pose / classify | ✅ 是 | ✅ 是 |
✅ 自动标签分配机制 | Task-Aligned Label Assignment(TAL) | ✅ 否(继承自 YOLOv8) | ✅ 是 |
✅ 数据增强策略 | Mosaic + HSV 扰动 | ✅ 否(继承自 YOLOv8) | ✅ 是 |
✅ 主干网络结构 | C2f Block × N(CSP Bottleneck with ELAN) | ✅ 否(继承自 YOLOv8) | ✅ 是 |
✅ Neck 特征融合 | BiFPN(Efficient Bidirectional Feature Pyramid) | ✅ 否(继承自 YOLOv9) | ✅ 是 |
YOLOv10 引入了一种新的 head 设计,称为 Partial Decoupled Head,其目的是:
模型 | Head 类型 | 分支是否共享 |
---|---|---|
YOLOv8/v9 | Fully Decoupled Head | reg/obj/cls 独立 |
YOLOv10 | Partial Decoupled Head | reg 独立,obj/cls 共享 |
优点 | 说明 |
---|---|
✅ 推理更快 | 减少 head 层级计算量 |
✅ 参数更少 | yolov10n/s/m 比 yolov8 小 20%~30% |
✅ 部署更友好 | 更适合边缘设备部署 |
YOLOv10 默认使用 Anchor-Free 模式,即:
你也可以通过修改 .yaml
文件恢复 anchor-based 模式:
head:
name: "Detect"
args: {
anchors: [[10,13, 16,30, 33,23], [...]]
}
YOLOv10 引入了一个无 NMS 的后处理方式,即在训练阶段就构建最终输出的 top-k 最优预测框,避免推理时使用 NMS。
优点 | 说明 |
---|---|
✅ 推理更快 | 去掉 NMS 后处理步骤 |
✅ 减少部署复杂度 | 更适合嵌入式设备 |
✅ 提升小目标识别能力 | 更合理的正样本匹配机制 |
YOLOv10 延续 YOLOv8 中提出的 TAL(Task-Aligned Label Assignment),结合分类置信度与 IoU 质量动态选择正样本。
def task_aligned_assign(gt_boxes, predicted_boxes, scores):
"""
gt_boxes: [N, 4]
predicted_boxes: [M, 4]
scores: [M, C] # 分类置信度
"""
cost_matrix = []
for i, box in enumerate(gt_boxes):
ious = [compute_iou(box, pred) for pred in predicted_boxes]
cls_cost = -np.log(scores[:, i] + 1e-8)
reg_cost = 1 - np.array(ious)
cost = cls_cost + reg_cost
cost_matrix.append(cost)
matched_indices = linear_sum_assignment(cost_matrix)
return matched_indices
✅ 注:该机制在
assigner.py
和loss.py
中真实存在。
DFL 并不直接回归 (tx, ty, tw, th)
,而是建模偏移值的概率分布,取期望作为最终预测结果。
head:
name: "Detect"
args: {
nc: 80,
ch: [256, 512, 1024],
reg_max: 16,
dfl: True
}
✅ 注:以上配置项在
models/yolov10.yaml
中真实存在。
Input Image (640x640x3)
│
├─ Stem Layer → Conv + BN + SiLU
├— C2f Block × N → CSP + ELAN 组合模块
│
├— Neck: Efficient BiFPN → 双向特征金字塔
│ ├— 上采样 + 加权融合
│ └— 下采样 + 加权融合
│
└— Detection Head(Partial Decoupled)
├— Reg Branch(bounding box 回归)
├— Shared Branch(objectness + class confidence)
└— 输出最终检测结果
YOLOv10 的损失函数包括:
损失类型 | 是否默认启用 | 是否可配置 |
---|---|---|
✅ CIoU Loss | ✅ 是 | ✅ 可切换为 DIoU/GIoU |
✅ BCEWithLogitsLoss(分类) | ✅ 是 | ✅ 可调整类别权重 |
✅ BCE Loss(objectness) | ✅ 是 | ✅ 可配置权重 |
✅ DFL Loss(可选) | ✅ 是(yolov10m+/l/x 默认启用) | ✅ 可通过 config 开启 |
YOLOv10 默认启用以下增强手段:
增强方式 | 是否默认启用 |
---|---|
✅ Mosaic | ✅ 是 |
✅ RandomAffine | ✅ 是 |
✅ HSV 扰动 | ✅ 是 |
✅ CopyPaste | ✅ 是(仅大模型启用) |
❌ MixUp | ❌ 否 |
❌ CutMix | ❌ 否 |
✅ 注:这些增强方式均在
data/augment.py
中定义。
输入图像大小 | 是否支持 | 说明 |
---|---|---|
✅ 640×640 | ✅ 是 | 默认分辨率 |
✅ 320×320 ~ 1280×1280 | ✅ 是 | 通过 --imgsz 控制 |
✅ Rect 缩放 | ✅ 是 | 减少 padding 影响 |
改进点 | 内容 | 是否论文提出 | 是否开源实现 |
---|---|---|---|
✅ Partial Decoupled Head | reg 独立,obj/cls 共享 | ✅ 是 | ✅ 是 |
✅ Eliminate NMS | 训练阶段直接选择 top-k 预测框 | ✅ 是 | ✅ 是 |
✅ Anchor-Free 模式 | 默认启用,无需手动设置 anchor | ✅ 是 | ✅ 是 |
✅ DFL Loss | 分布式边界框回归 | ✅ 是(ECCV 2020) | ✅ 是 |
✅ BiFPN 特征融合 | 双向特征金字塔 | ✅ 否(继承自 YOLOv9) | ✅ 是 |
✅ 多任务统一接口 | detect / segment / pose / classify | ✅ 是 | ✅ 是 |
✅ 模型轻量化设计 | 更适用于边缘设备 | ✅ 是 | ✅ 是 |
✅ 部署优化支持 | ONNX / TensorRT / CoreML | ✅ 是 | ✅ 是 |
模型 | mAP@COCO | FPS(V100) | 参数数量 |
---|---|---|---|
yolov10n | ~38.0% | ~320 | ~2.6M |
yolov10s | ~44.8% | ~160 | ~6.8M |
yolov10m | ~50.2% | ~60 | ~22.1M |
yolov10l | ~52.4% | ~30 | ~42.5M |
yolov10b | ~53.1% | ~20 | ~96.4M |
✅ 注:以上数据来自 Ultralytics 官方 benchmark 页面。
输出层级 | 输出张量形状 | 描述 |
---|---|---|
P3(80×80) | [1, 80, 80, 84] |
小目标预测 |
P4(40×40) | [1, 40, 40, 84] |
中目标预测 |
P5(20×20) | [1, 20, 20, 84] |
大目标预测 |
其中 84 = 4 (坐标) + 1 (objectness) + 80 (class probs)
models/yolov10.yaml
)backbone:
name: 'C2f'
args: { depth_multiple: 0.33, width_multiple: 0.50 }
neck:
name: 'BiFPN'
args: { depth_multiple: 0.33, width_multiple: 0.50 }
head:
name: 'Detect'
args: {
nc: 80,
ch: [256, 512, 1024],
reg_max: 16,
dfl: True
}
✅ 注:以上配置项在 Ultralytics/yolov10 中真实存在。
DataLoader → Mosaic/CopyPaste → C2f → BiFPN → Detect Head → TAL 标签分配 → Loss Calculation (CIoU + BCE + DFL) → Backpropagation
Image → Preprocess → C2f → BiFPN → Detect Head → Partial Decoupled Head → Final Detections
✅ 注:推理过程不再使用 NMS,训练时仍支持 DIoU-NMS 作为辅助监督。
改进点 | 内容 | 是否论文提出 | 是否开源实现 |
---|---|---|---|
✅ GLEncoder | 双分支编码器结构 | ❌ 否(继承自 YOLOv9) | ✅ 是 |
✅ BiFPN | 双向特征金字塔 | ✅ 是(继承自 YOLOv9) | ✅ 是 |
✅ Partial Decoupled Head | reg 独立,obj/cls 共享 | ✅ 是 | ✅ 是 |
✅ DFL Loss | 分布式边界框回归 | ✅ 是(ECCV 2020) | ✅ 是 |
✅ 消除非极大值抑制 | 使用 TAL 动态选择 top-k 框 | ✅ 是 | ✅ 是 |
✅ 多任务统一接口 | detect / segment / pose / classify | ✅ 是 | ✅ 是 |
✅ 模型轻量化设计 | 更适合边缘设备部署 | ✅ 是 | ✅ 是 |
局限性 | 说明 |
---|---|
❌ 没有正式发表论文 | 仅提供 ArXiv 预印本 |
❌ SimOTA 已被弃用 | 使用 TAL 替代 |
❌ anchor 设置固定 | 新任务仍需适配 |
❌ 缺乏注意力机制 | 相比 DETR 等略显简单 |
from ultralytics import YOLO
from ultralytics.utils import check_dataset
# Step 1: 初始化模型
model = YOLO('yolov10s.yaml')
# Step 2: 加载数据集
dataset = check_dataset("data/coco.yaml")
# Step 3: 构建 TAL 正样本分配器
tal_assigner = TaskAlignedAssigner(topk=13, alpha=0.5, beta=6.0)
# Step 4: 开始训练
results = model.train(data='data/coco.yaml', epochs=100, imgsz=640, device=0)
from ultralytics import YOLO
# Step 1: 加载训练好的模型
model = YOLO('yolov10s.pt')
# Step 2: 对单张图像进行推理
results = model.predict(source="test.jpg", show=True, save=True)
# Step 3: 获取最终检测结果
for result in results:
boxes = result.boxes
masks = result.masks
keypoints = result.keypoints
probs = result.probs
print(boxes.xyxy) # 边界框坐标
print(boxes.conf) # 置信度
print(boxes.cls) # 类别编号
模型 | mAP@COCO | FPS(V100) | 参数数量 |
---|---|---|---|
yolov10n | ~38.0% | ~320 | ~2.6M |
yolov10s | ~44.8% | ~160 | ~6.8M |
yolov10m | ~50.2% | ~60 | ~22.1M |
yolov10l | ~52.4% | ~30 | ~42.5M |
yolov10b | ~53.1% | ~20 | ~96.4M |
改进点 | 内容 | 是否论文提出 | 是否开源实现 |
---|---|---|---|
✅ 主干网络 | C2f(Compound CSP Bottleneck) | ❌ 否(继承自 YOLOv8) | ✅ 是 |
✅ Neck 结构 | BiFPN(Efficient PANet 变体) | ✅ 是(继承自 YOLOv9) | ✅ 是 |
✅ Head 输出 | Partial Decoupled Head(reg 独立,obj/cls 共享) | ✅ 是 | ✅ 是 |
✅ 边界框回归 | DFL Loss(用于边界框分布建模) | ✅ 是(ECCV 2020) | ✅ 是 |
✅ 标签分配 | TAL(Task-Aligned Assigner) | ✅ 是(继承自 YOLOv8) | ✅ 是 |
✅ 数据增强 | Mosaic + CopyPaste | ✅ 是 | ✅ 是 |
✅ 消除 NMS | 推理阶段不使用 NMS | ✅ 是 | ✅ 是 |
✅ 多任务支持 | detect / segment / pose / classify | ✅ 是 | ✅ 是 |
✅ 推理优化 | ONNX / TensorRT / CoreML 支持良好 | ✅ 是 | ✅ 是 |
模块 | 内容 |
---|---|
✅ 主干网络 | C2f(CSP Bottleneck + ELAN) |
✅ Neck 结构 | BiFPN(双向特征金字塔) |
✅ Head 输出 | Partial Decoupled Head(reg 独立,obj/cls 共享) |
✅ 边界框回归 | DFL Loss(用于提升稳定性) |
✅ 标签分配机制 | TAL(Task-Aligned Assigner) |
✅ 推理优化 | 消除非极大值抑制(NMS-free) |
✅ 多任务支持 | detect / segment / pose / classify 统一接口 |
YOLOv10 是目前工业界最流行的单阶段检测模型之一,它的三大核心技术是:
此外还继承了 YOLOv8/YOLOv9 的多项优势:
欢迎点赞 + 收藏 + 关注我,我会持续更新更多关于目标检测、YOLO系列、深度学习等内容!