
💡💡💡本文主要内容:YOLO26全新发布(原理介绍+代码详见+结构框图)| YOLO26如何训练自己的数据集(手部关键点为案列)

结构框图如下:


AI小怪兽 | 计算机视觉布道者 | 视觉检测领域创新者
深耕计算机视觉与深度学习领域,专注于视觉检测前沿技术的探索与突破。长期致力于YOLO系列算法的结构性创新、性能极限优化与工业级落地实践,旨在打通从学术研究到产业应用的最后一公里。
🚀 核心专长与技术创新
🏆 行业影响力与商业实践
💡 未来方向与使命
秉持 “让每一行代码都有温度” 的技术理念,未来将持续聚焦于实时检测、语义分割及工业缺陷检测的商业化闭环等核心方向。愿与业界同仁协同创新,共同推动技术边界,以坚实的技术能力赋能实体经济与行业变革。
💡💡💡本文主要内容:YOLO26全新发布(原理介绍+代码详见+结构框图)| YOLO26如何训练自己的数据集(裂缝分割为案列)

添加描述
结构框图如下:

添加描述

添加描述
AI小怪兽 | 计算机视觉布道者 | 视觉检测领域创新者
深耕计算机视觉与深度学习领域,专注于视觉检测前沿技术的探索与突破。长期致力于YOLO系列算法的结构性创新、性能极限优化与工业级落地实践,旨在打通从学术研究到产业应用的最后一公里。
🚀 核心专长与技术创新
🏆 行业影响力与商业实践
💡 未来方向与使命
秉持 “让每一行代码都有温度” 的技术理念,未来将持续聚焦于实时检测、语义分割及工业缺陷检测的商业化闭环等核心方向。愿与业界同仁协同创新,共同推动技术边界,以坚实的技术能力赋能实体经济与行业变革。

添加描述
论文:https://arxiv.org/pdf/2509.25164
摘要:本研究对Ultralytics YOLO26进行了全面分析,重点阐述了其关键架构改进及其在实时边缘目标检测中的性能基准测试。YOLO26于2025年9月发布,是YOLO系列最新、最先进的成员,专为在边缘及低功耗设备上实现高效、精确且易于部署的目标而构建。本文依次详述了YOLO26的架构创新,包括:移除了分布焦点损失(DFL);采用端到端的无NMS推理;集成了渐进损失(ProgLoss)与小目标感知标签分配(STAL);以及引入了用于稳定收敛的MuSGD优化器。除架构外,本研究将YOLO26定位为多任务框架,支持目标检测、实例分割、姿态/关键点估计、定向检测及分类。我们在NVIDIA Jetson Nano与Orin等边缘设备上呈现了YOLO26的性能基准测试,并将其结果与YOLOv8、YOLOv11、YOLOv12、YOLOv13及基于Transformer的检测器进行比较。本文进一步探讨了其实时部署路径、灵活的导出选项(ONNX、TensorRT、CoreML、TFLite)以及INT8/FP16量化技术。文章重点展示了YOLO26在机器人、制造业及物联网等领域的实际应用案例,以证明其跨行业适应性。最后,讨论了关于部署效率及更广泛影响的见解,并展望了YOLO26及YOLO系列的未来发展方向。
关键词:YOLO26;边缘人工智能;多任务目标检测;无NMS推理;小目标识别;YOLO(You Only Look Once);目标检测;MuSGD优化器

添加描述
Detection (COCO)

添加描述
结构框图如下:


1)池化次数灵活性:YOLO11 的 3 次池化是硬编码的,要修改必须改源码;YOLO26 通过n参数可灵活调整(比如设为 2 次或 4 次),无需改核心逻辑。
2)Shortcut 设计:YOLO26 新增的残差连接能缓解深层网络的梯度消失问题,提升特征复用能力,而 YOLO11 无此设计。
3)激活函数控制:YOLO26 禁用 Conv1 的激活函数,让特征在池化前保持更 “原始” 的状态,是工程上对特征提取的优化。

添加描述
源码位置:ultralytics/nn/modules/block.py
1)注意力机制的新增:YOLO26 的 C3k2 首次引入PSABlock(金字塔注意力模块),通过attn参数控制是否启用,这是两者最核心的功能差异 —— 启用后模块会先通过 Bottleneck 提取基础特征,再通过 PSABlock 增强关键区域的特征权重,提升小目标 / 复杂场景的检测效果。
2)分支逻辑的扩展:YOLO11 的分支仅受c3k控制,而 YOLO26 的分支逻辑优先级为attn > c3k,即只要attn=True,会优先启用注意力模块,忽略c3k的配置。

重复模块m (n次迭代):
┌─────────────────────────────────────────────────────────┐
│ │
│ 如果 attn=True: │
│ Sequential( │
│ Bottleneck(self.c, self.c), │ ←─ 先特征提取
│ PSABlock(self.c, attn_ratio=0.5, num_heads=...) │ ←─ 后注意力增强
│ ) │
│ │
│ 否则如果 c3k=True: │
│ C3k(self.c, self.c, 2) │ ←─ 同YOLOv11
│ │
│ 否则: │
│ Bottleneck(self.c, self.c) │ ←─ 同YOLOv11
│ │
└─────────────────────────────────────────────────────────┘YOLO26 C3k2代码:
源码位置:ultralytics/nn/modules/block.py
YOLO26引入了多项关键架构创新,使其区别于前几代YOLO模型。这些增强不仅提高了训练稳定性和推理效率,还从根本上重塑了实时边缘设备的部署流程。本节将详细描述YOLO26的四项主要贡献:(i)移除分布焦点损失(DFL),(ii)引入端到端无NMS推理,(iii)新颖的损失函数策略,包括渐进损失平衡(ProgLoss)和小目标感知标签分配(STAL),以及(iv)开发用于稳定高效收敛的MuSGD优化器。我们将详细讨论每一项架构增强,并通过对比分析突显其相对于YOLOv8、YOLOv11、YOLOv12和YOLOv13等早期YOLO版本的优势。

YOLO26最重要的架构简化之一是移除了分布焦点损失(DFL)模块(图3a),该模块曾存在于YOLOv8和YOLOv11等早期YOLO版本中。DFL最初旨在通过预测边界框坐标的概率分布来改进边界框回归,从而实现更精确的目标定位。虽然该策略在早期模型中展示了精度提升,但也带来了不小的计算开销和导出困难。在实践中,DFL在推理和模型导出期间需要专门处理,这使针对ONNX、CoreML、TensorRT或TFLite等硬件加速器的部署流程变得复杂。
源码位置:ultralytics/utils/loss.py
通过reg_max 设置为1,移除了分布焦点损失(DFL)
class BboxLoss(nn.Module):
"""Criterion class for computing training losses for bounding boxes."""
def __init__(self, reg_max: int = 16):
"""Initialize the BboxLoss module with regularization maximum and DFL settings."""
super().__init__()
self.dfl_loss = DFLoss(reg_max) if reg_max > 1 else NoneYOLO26从根本上重新设计了预测头,以直接产生非冗余的边界框预测,无需NMS。这种端到端设计不仅降低了推理复杂度,还消除了对手动调优阈值的依赖,从而简化了集成到生产系统的过程。对比基准测试表明,YOLO26实现了比YOLOv11和YOLOv12更快的推理速度,其中nano模型在CPU上的推理时间减少了高达43%。这使得YOLO26对于移动设备、无人机和嵌入式机器人平台特别有利,在这些平台上,毫秒级的延迟可能产生重大的操作影响。
源码位置:ultralytics/utils/nms.py
训练稳定性和小目标识别仍然是目标检测中持续存在的挑战。YOLO26通过整合两种新颖策略来解决这些问题:渐进损失平衡(ProgLoss)和小目标感知标签分配(STAL),如图(图3c)所示。
ProgLoss在训练期间动态调整不同损失分量的权重,确保模型不会过拟合于主导物体类别,同时防止在稀有或小类别上表现不佳。这种渐进式再平衡改善了泛化能力,并防止了训练后期的不稳定。另一方面,STAL明确优先为小目标分配标签,由于像素表示有限且易被遮挡,小目标尤其难以检测。ProgLoss和STAL共同为YOLO26在包含小目标或被遮挡目标的数据集(如COCO和无人机图像基准)上带来了显著的精度提升。
YOLO26的最后一项创新是引入了MuSGD优化器(图3d),它结合了随机梯度下降(SGD)的优势与最近提出的Muon优化器(一种受大型语言模型训练中使用的优化策略启发而发展的技术)。MuSGD利用SGD的鲁棒性和泛化能力,同时融入了来自Muon的自适应特性,能够在不同数据集上实现更快的收敛和更稳定的优化。
源码位置:ultralytics/optim/muon.py
手部关键点数据集包含26,768张标注了关键点的手部图像,适用于训练Ultralytics YOLO等模型以完成姿态估计任务。标注使用Google MediaPipe库生成,确保了高精度与一致性,且数据集兼容Ultralytics YOLO26格式。
关键点 数据集包含手部检测的关键点,标注方式如下:
核心特点
数据集结构 手部关键点数据集分为两个子集:

伪代码如下:
# YOLO26手势关键点检测伪代码
# 假设检测21个手势关键点(类似MediaPipe手势模型)
class YOLO26_HandPose:
def __init__(self):
# 初始化参数
self.num_keypoints = 21 # 21个手势关键点
self.num_classes = 1 # 手部类别
self.input_size = 640 # 输入尺寸
def build_backbone(self):
"""改进的骨干网络"""
# 使用CSPNet或RepVGG风格的架构
backbone = Sequential([
FocusLayer(3, 32), # 聚焦层减少计算量
CSPBlock(32, 64, num_blocks=3),
CSPBlock(64, 128, num_blocks=6),
CSPBlock(128, 256, num_blocks=9),
CSPBlock(256, 512, num_blocks=3),
SPPF(512, 512) # 空间金字塔池化
])
return backbone
def build_neck(self):
"""特征金字塔网络(改进版)"""
# 使用PANet或BiFPN进行多尺度特征融合
neck = BiFPN([
FeatureMap(512, 256),
FeatureMap(256, 128),
FeatureMap(128, 64)
])
return neck
def build_head(self):
"""检测头 - 输出边界框、关键点和置信度"""
# 每个检测头包含:
# 1. 边界框预测 (x, y, w, h, obj_conf)
# 2. 类别预测 (cls_conf)
# 3. 关键点预测 (21个关键点的x,y,可见性)
head_outputs = {
'bbox': Conv2D(256, 4 + 1), # 4个bbox坐标 + 1个obj置信度
'cls': Conv2D(256, self.num_classes),
'keypoints': Conv2D(256, self.num_keypoints * 3) # 每个点(x,y,visibility)
}
return head_outputs
def forward(self, x):
"""前向传播"""
# 1. 特征提取
features = self.backbone(x)
# 2. 多尺度特征融合
pyramid_features = self.neck(features)
# 3. 多尺度预测
predictions = []
for feature in pyramid_features:
# 在不同尺度上进行预测
bbox_pred = self.head.bbox(feature)
cls_pred = self.head.cls(feature)
kpts_pred = self.head.keypoints(feature)
predictions.append({
'bbox': bbox_pred,
'cls': cls_pred,
'keypoints': kpts_pred
})
return predictions
def decode_predictions(self, predictions, conf_threshold=0.5):
"""解码预测结果"""
decoded_results = []
for pred in predictions:
# 应用sigmoid激活
bbox_scores = sigmoid(pred['bbox'][..., 4:5])
cls_scores = sigmoid(pred['cls'])
kpts_scores = sigmoid(pred['keypoints'][..., 2::3])
# 筛选高置信度检测
mask = bbox_scores > conf_threshold
if mask.any():
# 解码边界框 (从grid坐标到原图坐标)
bboxes = self.decode_boxes(pred['bbox'][mask])
# 解码关键点
keypoints = self.decode_keypoints(pred['keypoints'][mask])
# 非极大值抑制
indices = nms(bboxes, bbox_scores[mask])
for idx in indices:
result = {
'bbox': bboxes[idx],
'confidence': bbox_scores[idx],
'class_id': argmax(cls_scores[mask][idx]),
'keypoints': keypoints[idx], # shape: (21, 3) - [x, y, visibility]
'keypoints_confidence': kpts_scores[mask][idx]
}
decoded_results.append(result)
return decoded_results
def decode_keypoints(self, kpts_pred):
"""将关键点预测解码为实际坐标"""
# kpts_pred shape: [N, 21*3]
# 前两个通道是坐标,第三个通道是可见性
batch_size = kpts_pred.shape[0]
keypoints = kpts_pred.reshape(batch_size, self.num_keypoints, 3)
# 应用sigmoid到可见性分数
keypoints[..., 2] = sigmoid(keypoints[..., 2])
return keypoints
def calculate_loss(self, predictions, targets):
"""损失函数计算"""
total_loss = 0
# 1. 边界框损失 (CIoU损失)
bbox_loss = ciou_loss(predictions['bbox'][..., :4], targets['bboxes'])
# 2. 目标置信度损失 (二元交叉熵)
obj_loss = binary_cross_entropy(
predictions['bbox'][..., 4:5],
targets['obj_mask']
)
# 3. 类别损失 (交叉熵)
cls_loss = cross_entropy(
predictions['cls'],
targets['cls']
)
# 4. 关键点损失 (改进的Wing Loss或MSE)
kpts_loss = wing_loss(
predictions['keypoints'][..., :2], # 坐标
targets['keypoints'][..., :2]
)
# 5. 关键点可见性损失
kpts_vis_loss = binary_cross_entropy(
predictions['keypoints'][..., 2:3], # 可见性
targets['keypoints'][..., 2:3]
)
# 总损失 (加权和)
total_loss = (
bbox_loss * 0.05 +
obj_loss * 0.7 +
cls_loss * 0.3 +
kpts_loss * 0.1 +
kpts_vis_loss * 0.05
)
return total_loss
def train_step(self, images, targets):
"""训练步骤"""
# 前向传播
predictions = self.forward(images)
# 计算损失
loss = self.calculate_loss(predictions, targets)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
return loss
def visualize_results(self, image, results):
"""可视化检测结果"""
for result in results:
# 绘制边界框
draw_bbox(image, result['bbox'], result['confidence'])
# 绘制关键点
for kp in result['keypoints']:
x, y, visible = kp
if visible > 0.5: # 只绘制可见的关键点
draw_keypoint(image, (x, y))
# 绘制关键点连接线
connections = [
(0,1), (1,2), (2,3), (3,4), # 拇指
(0,5), (5,6), (6,7), (7,8), # 食指
(0,9), (9,10), (10,11), (11,12), # 中指
(0,13), (13,14), (14,15), (15,16), # 无名指
(0,17), (17,18), (18,19), (19,20) # 小指
]
for start_idx, end_idx in connections:
start_kp = result['keypoints'][start_idx]
end_kp = result['keypoints'][end_idx]
if start_kp[2] > 0.5 and end_kp[2] > 0.5:
draw_line(image, start_kp[:2], end_kp[:2])
return image
# 使用示例
def main():
# 初始化模型
model = YOLO26_HandPose()
# 训练模式
model.train()
for epoch in range(100):
for batch_images, batch_targets in train_loader:
loss = model.train_step(batch_images, batch_targets)
# 推理模式
model.eval()
image = load_image("hand_image.jpg")
# 预处理
processed_img = preprocess(image)
# 推理
with torch.no_grad():
predictions = model.forward(processed_img)
results = model.decode_predictions(predictions)
# 可视化
output_image = model.visualize_results(image, results)
save_image(output_image, "result.jpg")
# 关键点定义(21个点)
KEYPOINT_NAMES = [
'WRIST', # 0 - 手腕
'THUMB_CMC', 'THUMB_MCP', 'THUMB_IP', 'THUMB_TIP', # 1-4 - 拇指
'INDEX_FINGER_MCP', 'INDEX_FINGER_PIP', # 5-6 - 食指
'INDEX_FINGER_DIP', 'INDEX_FINGER_TIP', # 7-8
'MIDDLE_FINGER_MCP', 'MIDDLE_FINGER_PIP', # 9-10 - 中指
'MIDDLE_FINGER_DIP', 'MIDDLE_FINGER_TIP', # 11-12
'RING_FINGER_MCP', 'RING_FINGER_PIP', # 13-14 - 无名指
'RING_FINGER_DIP', 'RING_FINGER_TIP', # 15-16
'PINKY_MCP', 'PINKY_PIP', 'PINKY_DIP', 'PINKY_TIP' # 17-20 - 小指
]训练方式:
import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO
if __name__ == '__main__':
model = YOLO('ultralytics/cfg/models/26/yolo26-pose.yaml')
#model.load('yolo26n-seg.pt') # loading pretrain weights
model.train(data='data/hand-keypoints/hand-keypoints.yaml',
cache=False,
imgsz=640,
epochs=200,
batch=32,
close_mosaic=10,
workers=2,
device='0',
# optimizer='SGD', # using SGD,auto
project='runs/train',
name='exp',
)
训练结果可视化结果
YOLO26-pose summary (fused): 132 layers, 3,116,730 parameters, 0 gradients, 8.3 GFLOPs
Class Images Instances Box(P R mAP50 mAP50-95) Pose(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 123/123 2.7it/s 46.1s
all 7847 7847 0.979 0.977 0.992 0.914 0.923 0.907 0.938 0.833
预测结果:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。