💡💡💡本文解决什么问题:教会你如何用自己的数据集转换成对应格式的数据集以及如何训练YOLOv13-pose关键点检测
Pose mAP50 为0.893,相较于YOLO11的Pose mAP50 为 0.871 ,大幅提升
《YOLOv13魔术师专栏》将从以下各个方向进行创新:
1.YOLOv13介绍
论文:[2506.17733] YOLOv13: Real-Time Object Detection with Hypergraph-Enhanced Adaptive Visual Perception
摘要—YOLO 系列模型因其卓越的准确性和计算效率在实时目标检测领域占据主导地位。然而,无论是 YOLO11 及更早版本的卷积架构,还是 YOLOv12 引入的基于区域的自注意力机制,都仅限于局部信息聚合和成对相关性建模,缺乏捕捉全局多对多高阶相关性的能力,这限制了在复杂场景下的检测性能。本文提出了一种准确且轻量化的 YOLOv13 目标检测器。为应对上述挑战,我们提出了一种基于超图的自适应相关性增强(HyperACE)机制,通过超图计算自适应地利用潜在的高阶相关性,克服了以往方法仅基于成对相关性建模的限制,实现了高效的全局跨位置和跨尺度特征融合与增强。随后,我们基于 HyperACE 提出了全链路聚合与分配(FullPAD)范式,通过将相关性增强特征分配到整个网络,有效实现了全网的细粒度信息流和表征协同。最后,我们提出用深度可分离卷积代替常规的大核卷积,并设计了一系列块结构,在不牺牲性能的前提下显著降低了参数量和计算复杂度。我们在广泛使用的 MS COCO 基准测试上进行了大量实验,结果表明,我们的方法在参数更少、浮点运算量更少的情况下达到了最先进性能。具体而言,我们的 YOLOv13-N 相比 YOLO11-N 提升了 3.0% 的 mAP,相比 YOLOv12-N 提升了 1.5% 的 mAP。
以往的 YOLO 系列遵循 “骨干网络 → 颈部网络 → 检测头” 的计算范式,这本质上限定了信息流的充分传输。相比之下,我们的模型通过超图自适应关联增强(HyperACE)机制,实现全链路特征聚合与分配(FullPAD),从而增强传统的 YOLO 架构。因此,我们提出的方法在整个网络中实现了细粒度的信息流和表征协同,能够改善梯度传播并显著提升检测性能。具体而言,如图 2 所示,我们的 YOLOv13 模型首先使用类似以往工作的骨干网络提取多尺度特征图 B1、B2、B3、B4、B5,但其中的大核卷积被我们提出的轻量化 DS-C3k2 模块取代。然后,与传统 YOLO 方法直接将 B3、B4 和 B5 输入颈部网络不同,我们的方法将这些特征收集并传递到提出的 HyperACE 模块中,实现跨尺度跨位置特征的高阶关联自适应建模和特征增强。随后,我们的 FullPAD 范式利用三个独立通道,将关联增强后的特征分别分配到骨干网络与颈部网络的连接处、颈部网络的内部层以及颈部网络与检测头的连接处,以优化信息流。最后,颈部网络的输出特征图被传递到检测头中,实现多尺度目标检测。
ultralytics/cfg/models/v13/yolov13.yaml
nc: 80 # number of classes scales: # model compound scaling constants, i.e. 'model=yolov13n.yaml' will call yolov13.yaml with scale 'n' # [depth, width, max_channels] n: [0.50, 0.25, 1024] # Nano s: [0.50, 0.50, 1024] # Small l: [1.00, 1.00, 512] # Large x: [1.00, 1.50, 512] # Extra Large backbone: # [from, repeats, module, args] - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2 - [-1, 1, Conv, [128, 3, 2, 1, 2]] # 1-P2/4 - [-1, 2, DSC3k2, [256, False, 0.25]] - [-1, 1, Conv, [256, 3, 2, 1, 4]] # 3-P3/8 - [-1, 2, DSC3k2, [512, False, 0.25]] - [-1, 1, DSConv, [512, 3, 2]] # 5-P4/16 - [-1, 4, A2C2f, [512, True, 4]] - [-1, 1, DSConv, [1024, 3, 2]] # 7-P5/32 - [-1, 4, A2C2f, [1024, True, 1]] # 8 head: - [[4, 6, 8], 2, HyperACE, [512, 8, True, True, 0.5, 1, "both"]] - [-1, 1, nn.Upsample, [None, 2, "nearest"]] - [ 9, 1, DownsampleConv, []] - [[6, 9], 1, FullPAD_Tunnel, []] #12 - [[4, 10], 1, FullPAD_Tunnel, []] #13 - [[8, 11], 1, FullPAD_Tunnel, []] #14 - [-1, 1, nn.Upsample, [None, 2, "nearest"]] - [[-1, 12], 1, Concat, [1]] # cat backbone P4 - [-1, 2, DSC3k2, [512, True]] # 17 - [[-1, 9], 1, FullPAD_Tunnel, []] #18 - [17, 1, nn.Upsample, [None, 2, "nearest"]] - [[-1, 13], 1, Concat, [1]] # cat backbone P3 - [-1, 2, DSC3k2, [256, True]] # 21 - [10, 1, Conv, [256, 1, 1]] - [[21, 22], 1, FullPAD_Tunnel, []] #23 - [-1, 1, Conv, [256, 3, 2]] - [[-1, 18], 1, Concat, [1]] # cat head P4 - [-1, 2, DSC3k2, [512, True]] # 26 - [[-1, 9], 1, FullPAD_Tunnel, []] - [26, 1, Conv, [512, 3, 2]] - [[-1, 14], 1, Concat, [1]] # cat head P5 - [-1, 2, DSC3k2, [1024,True]] # 30 (P5/32-large) - [[-1, 11], 1, FullPAD_Tunnel, []] - [[23, 27, 31], 1, Detect, [nc]] # Detect(P3, P4, P5)
1.1 HyperACE
超图自适应相关性增强机制 HyperACE
- 超图理论借鉴与创新 :借鉴超图理论,将多尺度特征图的像素视为超图顶点,不同的是,传统超图方法依赖手工设定参数构建超边,而 HyperACE 设计了可学习的超边生成模块,能自适应地学习并构建超边,动态探索不同特征顶点间的潜在关联。
- 超图卷积操作 :在生成自适应超边后,通过超图卷积操作进行特征聚合与增强。每条超边先从其连接的所有顶点处聚合信息形成高阶特征,再将这些高阶特征传播回各个顶点,更新与增强顶点特征,从而实现高效地跨位置和跨尺度的特征融合与增强,强化不同尺度特征间的语义关联,对小目标和密集目标检测效果显著。
代码位置ultralytics/nn/modules/block.py
1.2 FullPAD_Tunnel
全流程聚合 - 分发范式 FullPAD
- 多通道特征传递 :打破传统的 “骨干→颈部→头部” 单向计算范式,通过三条独立通路传递特征,即主干 - 颈部连接层、颈部内部层、颈部 - 头部连接层,将 HyperACE 聚合后的多尺度特征,通过这些 “隧道” 分发回网络的不同位置,实现细粒度信息流与全流程表征协同。
- 改善梯度传播 :该范式有效解决了梯度消失或爆炸问题,显着改善了梯度传播效率,从而提升模型整体的检测性能,使模型在复杂场景下能够更好地捕捉目标特征,提高检测的准确性和稳定性。
代码位置ultralytics/nn/modules/block.py
1.3 DSC3k2
基于深度可分离卷积的轻量化模块
- 模块创新与替代 :采用深度可分离卷积构建了 DSConv、DS-Bottleneck、DS-C3k 等模块,替代传统的大核卷积。例如使用 DS-C3k2 模块作为轻量化的骨干网络提取多尺度特征,在保持感受野的同时,大幅降低了参数量与计算量,提高了模型的计算效率。
- 性能与效率平衡 :在几乎不牺牲性能的前提下,显著减少了模型的参数量和计算复杂度,使得 YOLOv13 能够在保持较高检测精度的同时,具备更快的推理速度,适合实时目标检测应用场景,降低了模型的部署难度和资源消耗。
代码位置ultralytics/nn/modules/block.py
2.如何标注自己的关键点数据集
2.1 labelme下载
# 安装labelme pip install labelme
2.2使用labelme下
直接在python环境下运行
labelme
2.3 labelme介绍
关键点标记主要使用
1)Create Rectangle生成矩形框;
2)Create Point生成关键点;
2.4 数据集标注
3.数据集格式转换
3.1标记后的数据格式如下
一张图片对应一个json文件
json部分内容如下:
{ "version": "5.1.1", "flags": {}, "shapes": [ { "label": "Ulna", "points": [ [ 474.71929824561397, 1443.4035087719294 ] ], "group_id": null, "shape_type": "point", "flags": {} }, { "label": "Radius", "points": [ [ 639.6315789473683, 1445.1578947368416 ] ], "group_id": null, "shape_type": "point", "flags": {} }, { "label": "FMCP", "points": [ [ 832.6140350877192, 1222.3508771929824 ] ], "group_id": null, "shape_type": "point", "flags": {} }, { "label": "FPIP", "points": [ [ 1023.8421052631577, 1089.0175438596489 ] ], "group_id": null, "shape_type": "point", "flags": {} }, { "label": "FDIP", "points": [ [ 1157.1754385964912, 987.2631578947367 ] ], "group_id": null, "shape_type": "point", "flags": {} }, { "label": "MCP5", "points": [ [ 430.85964912280696, 946.9122807017543 ] ], "group_id": null, "shape_type": "point", "flags": {} }, { "label": "MCP4", "points": [ [ 543.1403508771929, 910.0701754385964 ] ], "group_id": null, "shape_type": "point", "flags": {} }, { "label": "MCP3", "points": [ [ 657.1754385964912, 881.9999999999998 ] ], "group_id": null, "shape_type": "point", "flags": {} }, { "label": "MCP2", "points": [ [ 797.5263157894736, 896.035087719298 ] ], "group_id": null, "shape_type": "point", "flags": {} }, { "label": "PIP5", "points": [ [ 401.0350877192982, 864.4561403508769 ] ], "group_id": null, "shape_type": "point", "flags": {} }, { "label": "PIP4", "points": [ [ 529.1052631578947, 801.2982456140348 ] ], "group_id": null, "shape_type": "point", "flags": {} }, { "label": "PIP3", "points": [ [ 678.2280701754386, 773.2280701754385 ] ], "group_id": null, "shape_type": "point", "flags": {} }, { "label": "PIP2", "points": [ [ 843.1403508771929, 810.0701754385964 ] ], "group_id": null, "shape_type": "point", "flags": {} }, { "label": "MIP5", "points": [ [ 329.1052631578947, 696.035087719298 ] ], "group_id": null, "shape_type": "point", "flags": {} }, { "label": "MIP4", "points": [ [ 513.3157894736842, 562.7017543859647 ] ], "group_id": null, "shape_type": "point", "flags": {} }, { "label": "MIP3", "points": [ [ 713.3157894736842, 515.3333333333333 ] ], "group_id": null, "shape_type": "point", "flags": {} }, { "label": "MIP2", "points": [ [ 944.8947368421052, 608.3157894736839 ] ], "group_id": null, "shape_type": "point", "flags": {} }, { "label": "DIP5", "points": [ [ 313.31578947368416, 601.2982456140348 ] ], "group_id": null, "shape_type": "point", "flags": {} }, { "label": "DIP4", "points": [ [ 509.8070175438596, 411.8245614035086 ] ], "group_id": null, "shape_type": "point", "flags": {} }, { "label": "DIP3", "points": [ [ 727.3508771929824, 345.15789473684185 ] ], "group_id": null, "shape_type": "point", "flags": {} }, { "label": "DIP2", "points": [ [ 994.017543859649, 492.52631578947353 ] ], "group_id": null, "shape_type": "point", "flags": {} }, { "label": "hand", "points": [ [ 204.82608695652186, 183.95652173913044 ], [ 1265.695652173913, 1775.2608695652175 ] ], "group_id": null, "shape_type": "rectangle", "flags": {} } ], "imagePath": "1525.png",
3.2 生成适合yolo格式的关键点数据集
labelme2yolo-keypoint
详见CSDN
https://cv2023.blog.csdn.net/article/details/149509625
生成的txt内容如下:
0 0.48481 0.47896 0.70079 0.77886 0.31308 0.70597 2 0.42206 0.70695 2 0.54954 0.59785 2 0.67569 0.53278 2 0.76420 0.48288 2 0.28402 0.46282 2 0.35865 0.44521 2 0.43395 0.43102 2 0.52642 0.43836 2 0.26486 0.42270 2 0.34941 0.39188 2 0.44782 0.37818 2 0.55680 0.39628 2 0.21731 0.34051 2 0.33884 0.27495 2 0.47094 0.25196 2 0.62351 0.29746 2 0.20674 0.29403 2 0.33620 0.20108 2 0.48018 0.16879 2 0.65654 0.24070 2
讲解:
第一个0代表:框的类别,因为只有hand一类,所以为0
0.48481 0.47896 0.70079 0.77886 代表:归一化后的 框的中心点横纵坐标、宽、高
0.31308 0.70597 2代表:归一化后的 第一个关键点的横纵坐标、关键点可见性
关键点可见性理解:0代表不可见、1代表遮挡、2代表可见
3.3生成的yolo数据集如下
hand_keypoint: -images: --train: png图片 --val:png图片 -labels: --train: txt文件 --val:txt文件
4.手部关键点训练
4.1 新建data/hand_keypoint.yaml
参考coco8-pose.yaml即可
# Ultralytics YOLO 🚀, AGPL-3.0 license # COCO8-pose dataset (first 8 images from COCO train2017) by Ultralytics # Example usage: yolo train data=coco8-pose.yaml # parent # ├── ultralytics # └── datasets # └── coco8-pose ← downloads here (1 MB) # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..] path: ./ultralytics-7.31/data/hand_keypoint # dataset root dir train: images/train # train images (relative to 'path') 4 images val: images/val # val images (relative to 'path') 4 images test: # test images (optional) # Keypoints kpt_shape: [21, 3] # number of keypoints, number of dims (2 for x,y or 3 for x,y,visible) flip_idx: [0, 2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16, 15,17,18,19,20] # Classes names: 0: hand # Download script/URL (optional) #download: https://ultralytics.com/assets/coco8-pose.zip
4.2修改ultralytics/cfg/models/v13/yolov13-pose.yaml
修改为21个关键点和一个类别nc:1
# Ultralytics YOLO 🚀, AGPL-3.0 license # YOLO11-pose keypoints/pose estimation model. For Usage examples see https://docs.ultralytics.com/tasks/pose # Parameters nc: 1 # number of classes kpt_shape: [21, 3] # number of keypoints, number of dims (2 for x,y or 3 for x,y,visible) scales: # model compound scaling constants, i.e. 'model=yolov13n.yaml' will call yolov13.yaml with scale 'n' # [depth, width, max_channels] n: [0.50, 0.25, 1024] # Nano s: [0.50, 0.50, 1024] # Small l: [1.00, 1.00, 512] # Large x: [1.00, 1.50, 512] # Extra Large
4.3默认参数开启训练
import warnings warnings.filterwarnings('ignore') from ultralytics import YOLO if __name__ == '__main__': model = YOLO('ultralytics/cfg/models/v13/yolov13-pose.yaml') #model.load('yolov13n.pt') # loading pretrain weights model.train(data='data/hand_keypoint.yaml', cache=False, imgsz=640, epochs=200, batch=16, #close_mosaic=10, device='2', optimizer='SGD', # using SGD project='runs/train', name='exp', )
4.4 训练结果分析
200个epoch以后,训练结果可视化如下:
Pose mAP50 为0.893,相较于YOLO11的Pose mAP50 为 0.871 ,大幅提升
YOLOv13-pose summary: 554 layers, 2,821,743 parameters, 0 gradients, 7.7 GFLOPs Class Images Instances Box(P R mAP50 mAP50-95) Pose(P R mAP50 mAP50-95): 100%|██████████| 2/2 [00:04<00:00, 2.07s/it] all 64 64 0.998 1 0.995 0.874 0.691 0.922 0.922 0.893 0.893 0.72
PosePR_curve.png
预测结果如下: