
💡💡💡本文摘要:基于YOLO26的箱子和仓库检测系统,阐述了整个数据制作和训练可视化过程
用YOLO检测该数据集的意义:
1)推动仓储自动化:YOLO速度快,可实时检测箱子,用于分拣、计数、库存盘点和异常预警。
2) 验证数据质量:该数据集已统一标注、清理重复图像并划分训练/验证/测试集,适合作为YOLO训练与评估基准。
3)提升泛化能力:融合多来源、多视角仓库与箱子图像,有助于YOLO适应遮挡、堆叠、光照变化等复杂场景。
4)降低落地成本:YOLO轻量易部署,可运行在边缘设备和监控摄像头,便于实际物流仓储应用。
5)支持迁移学习:可作为预训练或基线模型,加速定制化仓库检测任务开发。

博主简介

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优化器

结构框图如下:


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
伪代码如下:
# -*- coding: utf-8 -*-
"""
基于 YOLO26 的箱子和仓库检测系统 —— 伪代码 / 可运行模板
算法伪代码:
输入:图像/视频/摄像头流 I,YOLO26 权重 W,置信度阈值 tau_conf,IoU 阈值 tau_iou
输出:检测框、类别、置信度、箱子数量 N_box、仓库数量 N_warehouse
1. model = YOLO(W)
2. for frame in I:
3. result = model.predict(frame, conf=tau_conf, iou=tau_iou)
4. for det in result.boxes:
5. if det.cls == 0: N_box += 1
6. if det.cls == 1: N_warehouse += 1
7. draw_box(frame, det)
8. save_or_show(frame)
9. return detections, N_box, N_warehouse
数据集类别:
0: box 箱子
1: warehouse 仓库
"""
import argparse
from pathlib import Path
import cv2
from ultralytics import YOLO
# =========================
# 全局配置
# =========================
CLASS_NAMES = {
0: "box",
1: "warehouse",
}
CLASS_NAMES_CN = {
0: "箱子",
1: "仓库",
}
COLORS = {
0: (0, 255, 0), # 箱子:绿色
1: (255, 128, 0), # 仓库:橙色
}
DATASET_YAML_TEMPLATE = """# datasets/box_warehouse.yaml
path: ./datasets/box_warehouse
train: images/train
val: images/val
test: images/test
names:
0: box
1: warehouse
"""
# =========================
# 数据集 YAML 模板
# =========================
def create_dataset_yaml(out_path: str = "datasets/box_warehouse.yaml"):
"""生成数据集配置文件模板。"""
out = Path(out_path)
out.parent.mkdir(parents=True, exist_ok=True)
out.write_text(DATASET_YAML_TEMPLATE, encoding="utf-8")
print(f"已生成数据集配置模板: {out}")
# =========================
# 训练
# =========================
def train(args):
"""训练 YOLO26 箱子和仓库检测模型。"""
model = YOLO(args.model)
model.train(
data=args.data,
epochs=args.epochs,
imgsz=args.imgsz,
batch=args.batch,
device=args.device,
workers=args.workers,
project=args.project,
name=args.name,
exist_ok=True,
optimizer="auto",
patience=50,
seed=0,
plots=True,
)
print("训练完成。")
# =========================
# 验证
# =========================
def val(args):
"""验证模型性能。"""
model = YOLO(args.weights)
metrics = model.val(
data=args.data,
imgsz=args.imgsz,
batch=args.batch,
device=args.device,
conf=0.001,
iou=0.6,
plots=True,
)
print(f"mAP50: {metrics.box.map50:.4f}")
print(f"mAP50-95: {metrics.box.map:.4f}")
# =========================
# 检测结果统计
# =========================
def count_objects(result):
"""统计当前帧中箱子和仓库数量。"""
counts = {name: 0 for name in CLASS_NAMES.values()}
boxes = result.boxes
if boxes is None:
return counts
for cls_id in boxes.cls.cpu().numpy().astype(int):
name = CLASS_NAMES.get(cls_id, str(cls_id))
counts[name] = counts.get(name, 0) + 1
return counts
# =========================
# 检测框绘制
# =========================
def draw_boxes(result):
"""在图像上绘制检测框和标签。"""
img = result.orig_img.copy()
boxes = result.boxes
if boxes is None:
return img
xyxy = boxes.xyxy.cpu().numpy()
confs = boxes.conf.cpu().numpy()
clss = boxes.cls.cpu().numpy().astype(int)
for (x1, y1, x2, y2), conf, cls_id in zip(xyxy, confs, clss):
x1, y1, x2, y2 = map(int, (x1, y1, x2, y2))
name = CLASS_NAMES.get(cls_id, str(cls_id))
color = COLORS.get(cls_id, (0, 255, 0))
cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)
label = f"{name} {conf:.2f}"
(tw, th), _ = cv2.getTextSize(
label, cv2.FONT_HERSHEY_SIMPLEX, 0.6, 2
)
cv2.rectangle(
img,
(x1, y1 - th - 8),
(x1 + tw, y1),
color,
-1,
)
cv2.putText(
img,
label,
(x1, y1 - 5),
cv2.FONT_HERSHEY_SIMPLEX,
0.6,
(255, 255, 255),
2,
)
return img
# =========================
# 推理 / 检测
# =========================
def predict(args):
"""对图片、视频、目录或摄像头进行检测。"""
model = YOLO(args.weights)
# 如果 source 是 "0",则使用摄像头
source = int(args.source) if str(args.source).isdigit() else args.source
results = model.predict(
source=source,
imgsz=args.imgsz,
conf=args.conf,
iou=args.iou,
device=args.device,
stream=True,
save=args.save,
project=args.project,
name=args.name,
verbose=False,
)
for i, result in enumerate(results):
counts = count_objects(result)
print(
f"Frame {i}: "
f"box={counts.get('box', 0)}, "
f"warehouse={counts.get('warehouse', 0)}"
)
if args.show:
annotated = draw_boxes(result)
cv2.imshow("YOLO26 Box & Warehouse Detection", annotated)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
cv2.destroyAllWindows()
# =========================
# 模型导出
# =========================
def export(args):
"""导出模型为 ONNX、TorchScript、TensorRT 等格式。"""
model = YOLO(args.weights)
model.export(
format=args.format,
imgsz=args.imgsz,
device=args.device,
)
print(f"模型已导出为 {args.format} 格式。")
# =========================
# 命令行参数
# =========================
def build_parser():
parser = argparse.ArgumentParser(
description="基于 YOLO26 的箱子和仓库检测系统"
)
sub = parser.add_subparsers(dest="mode", required=True)
# 训练
p_train = sub.add_parser("train", help="训练 YOLO26 模型")
p_train.add_argument(
"--model",
default="yolo26n.pt",
help="YOLO26 权重或配置,例如 yolo26n.pt",
)
p_train.add_argument(
"--data",
default="datasets/box_warehouse.yaml",
help="数据集 YAML 文件",
)
p_train.add_argument("--epochs", type=int, default=100)
p_train.add_argument("--imgsz", type=int, default=640)
p_train.add_argument("--batch", type=int, default=16)
p_train.add_argument("--device", default="0", help="cuda 设备号或 cpu")
p_train.add_argument("--workers", type=int, default=8)
p_train.add_argument("--project", default="runs/train")
p_train.add_argument("--name", default="yolo26_box_warehouse")
p_train.set_defaults(func=train)
# 验证
p_val = sub.add_parser("val", help="验证模型")
p_val.add_argument(
"--weights",
default="runs/train/yolo26_box_warehouse/weights/best.pt",
)
p_val.add_argument(
"--data",
default="datasets/box_warehouse.yaml",
)
p_val.add_argument("--imgsz", type=int, default=640)
p_val.add_argument("--batch", type=int, default=16)
p_val.add_argument("--device", default="0")
p_val.set_defaults(func=val)
# 推理
p_pred = sub.add_parser("predict", help="推理检测")
p_pred.add_argument(
"--weights",
default="runs/train/yolo26_box_warehouse/weights/best.pt",
)
p_pred.add_argument(
"--source",
default="datasets/box_warehouse/images/val",
help="图片、视频、目录或摄像头编号 0",
)
p_pred.add_argument("--imgsz", type=int, default=640)
p_pred.add_argument("--conf", type=float, default=0.25)
p_pred.add_argument("--iou", type=float, default=0.45)
p_pred.add_argument("--device", default="0")
p_pred.add_argument("--save", action="store_true", help="保存检测结果")
p_pred.add_argument("--show", action="store_true", help="显示检测窗口")
p_pred.add_argument("--project", default="runs/detect")
p_pred.add_argument("--name", default="yolo26_box_warehouse_predict")
p_pred.set_defaults(func=predict)
# 导出
p_export = sub.add_parser("export", help="导出模型")
p_export.add_argument(
"--weights",
default="runs/train/yolo26_box_warehouse/weights/best.pt",
)
p_export.add_argument(
"--format",
default="onnx",
help="onnx / torchscript / engine 等",
)
p_export.add_argument("--imgsz", type=int, default=640)
p_export.add_argument("--device", default="0")
p_export.set_defaults(func=export)
# 生成数据集 YAML 模板
p_data = sub.add_parser("make-yaml", help="生成数据集 YAML 模板")
p_data.add_argument(
"--out",
default="datasets/box_warehouse.yaml",
)
p_data.set_defaults(func=lambda a: create_dataset_yaml(a.out))
return parser
def main():
parser = build_parser()
args = parser.parse_args()
args.func(args)
if __name__ == "__main__":
main()训练集721张,验证集88张,测试集89张

标签可视化分析

ps:建议填写绝对路径
# Dataset unificado a partir de Final_dataset.
path: D:/YOLO26/data/UnifiedDataset
train: train/images
val: val/images
test: test/images
nc: 1
names: ["bulto"]import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO
if __name__ == '__main__':
model = YOLO('ultralytics/cfg/models/26/yolo26.yaml')
model.train(data='data/UnifiedDataset.yaml',
cache=False,
imgsz=640,
epochs=200,
batch=8,
close_mosaic=10,
device='0',
optimizer='SGD', # using SGD
project='runs/train',
name='exp',
)YOLO26 summary (fused): 122 layers, 2,375,031 parameters, 0 gradients, 5.3 GFLOPs
Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 3/3 2.2it/s 1.4s
all 88 246 0.93 0.925 0.969 0.876
预测结果:

受益于人工智能的崛起,Python语言几乎以压倒性优势在众多编程语言中异军突起,成为AI时代的首选语言。在很多情况下,我们想要以图形化方式将我们的人工智能算法打包提供给用户使用,这时候选择以python为主的GUI框架就非常合适了。
PySide是Qt公司的产品,PyQt是第三方公司的产品,二者用法基本相同,不过在使用协议上却有很大差别。PySide可以在LGPL协议下使用,PyQt则在GPL协议下使用。
PySide目前常见的有两个版本:PySide2和PySide6。PySide2由C++版的Qt5开发而来.,而PySide6对应的则是C++版的Qt6。从PySide6开始,PySide的命名也会与Qt的大版本号保持一致,不会再出现类似PySide2对应Qt5这种容易混淆的情况。
pip install --upgrade pip
pip install pyside6 -i https://mirror.baidu.com/pypi/simple基于PySide6开发GUI程序包含下面三个基本步骤:

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