
💡💡💡本文摘要:基于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优化器

结构框图如下:


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
该数据集包含细菌性叶斑病、霜霉病、花叶病、白粉病等常见植物病害类别。使用YOLO26进行检测的意义在于:实现高精度、实时病害识别,帮助农业从业者快速定位病斑、区分健康叶片与多种病害类型,支持田间无人机或移动设备边缘部署,从而减少农药滥用、降低人力成本,提升作物病害早期预警与精准管理能力,推动智慧农业发展。
# pumpkin_disease_detection.py
# 基于 YOLO26 的南瓜叶片病害检测系统
from ultralytics import YOLO # 假设 YOLO26 遵循 Ultralytics API
import os
import cv2
import glob
import matplotlib.pyplot as plt
# ========================== 1. 配置参数 ==========================
DATA_YAML = "pumpkin_disease.yaml" # 数据集配置文件 (包含 paths, nc, names)
MODEL_NAME = "yolo26n.pt" # 预训练模型 (n/s/m/l/x)
EPOCHS = 100
IMG_SIZE = 640
BATCH_SIZE = 16
DEVICE = 0 # GPU 设备号,-1 表示 CPU
# 数据集配置文件内容示例 (pumpkin_disease.yaml):
"""
train: ./datasets/train/images
val: ./datasets/val/images
test: ./datasets/test/images
nc: 5
names: ['Bacterial Leaf Spot', 'Downy Mildew', 'Healthy Leaf', 'Mosaic disease', 'Powdery_Mildew']
"""
# ========================== 2. 加载模型 ==========================
def load_model(weights_path=MODEL_NAME):
"""加载预训练 YOLO26 模型"""
model = YOLO(weights_path)
return model
# ========================== 3. 训练模型 ==========================
def train_model(model, data_yaml):
"""训练模型"""
results = model.train(
data=data_yaml,
epochs=EPOCHS,
imgsz=IMG_SIZE,
batch=BATCH_SIZE,
device=DEVICE,
project="pumpkin_disease_detection",
name="exp1",
exist_ok=True,
patience=10,
lr0=0.01,
augment=True,
mosaic=0.5,
mixup=0.2,
copy_paste=0.2
)
return results
# ========================== 4. 评估模型 ==========================
def evaluate_model(model, data_yaml):
"""在验证集上评估模型"""
metrics = model.val(data=data_yaml, device=DEVICE)
print(f"mAP@0.5: {metrics.box.map50:.4f}")
print(f"mAP@0.5:0.95: {metrics.box.map:.4f}")
print(f"Precision: {metrics.box.mp:.4f}")
print(f"Recall: {metrics.box.mr:.4f}")
return metrics
# ========================== 5. 单张图像推理 ==========================
def predict_single(model, image_path, conf_thres=0.25, iou_thres=0.45):
"""对单张图像进行病害检测并显示结果"""
results = model(image_path, conf=conf_thres, iou=iou_thres)[0]
# 加载图像并绘制检测框
img = cv2.imread(image_path)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
for box in results.boxes:
x1, y1, x2, y2 = map(int, box.xyxy[0].tolist())
conf = box.conf[0].item()
cls_id = int(box.cls[0].item())
label = f"{results.names[cls_id]} {conf:.2f}"
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.putText(img, label, (x1, y1-5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 2)
# 显示
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.title("Detection Result")
plt.show()
return results
# ========================== 6. 批量推理并保存结果 ==========================
def predict_batch(model, image_dir, output_dir, conf_thres=0.25):
"""批量处理图像并保存标注结果"""
os.makedirs(output_dir, exist_ok=True)
image_paths = glob.glob(os.path.join(image_dir, "*.jpg")) + \
glob.glob(os.path.join(image_dir, "*.png"))
for img_path in image_paths:
results = model(img_path, conf=conf_thres)[0]
# 保存带框的图像
annotated = results.plot()
out_path = os.path.join(output_dir, os.path.basename(img_path))
cv2.imwrite(out_path, annotated)
# 可选:保存检测标签到 txt 文件
label_path = out_path.replace('.jpg', '.txt').replace('.png', '.txt')
with open(label_path, 'w') as f:
for box in results.boxes:
x1, y1, x2, y2 = box.xyxy[0].tolist()
cls_id = int(box.cls[0].item())
conf = box.conf[0].item()
f.write(f"{cls_id} {x1} {y1} {x2} {y2} {conf}\n")
print(f"Detection results saved to {output_dir}")
# ========================== 7. 导出模型(用于边缘部署) ==========================
def export_model(model, format='onnx'):
"""导出模型为 ONNX/TensorRT 等格式"""
model.export(format=format, imgsz=IMG_SIZE)
print(f"Model exported to {format} format.")
# ========================== 8. 主程序 ==========================
if __name__ == "__main__":
print("=== 南瓜叶片病害检测系统 (YOLO26) ===")
# 1. 加载预训练模型
model = load_model()
# 2. 训练模型(如果有标注数据)
print("\n开始训练...")
train_results = train_model(model, DATA_YAML)
# 3. 评估模型
print("\n评估模型...")
eval_metrics = evaluate_model(model, DATA_YAML)
# 4. 单张图像测试
test_image = "./sample/pumpkin_leaf.jpg" # 替换为实际测试图像路径
if os.path.exists(test_image):
print("\n单张图像检测演示...")
predict_single(model, test_image)
# 5. 批量处理测试集
test_image_dir = "./datasets/test/images"
output_dir = "./results"
if os.path.exists(test_image_dir):
print(f"\n批量处理测试集,结果保存至 {output_dir}")
predict_batch(model, test_image_dir, output_dir)
# 6. 导出模型(可选)
# export_model(model, format='onnx')
print("\n系统运行完成。")训练集2933,测试集614张,验证集612张
Bacterial Leaf Spot: 细菌性叶斑病
Downy Mildew: 霜霉病
Healthy Leaf: 健康叶片
Mosaic disease: 花叶病
Powdery_Mildew: 白粉病
标签可视化分析

ps:建议填写绝对路径
path: D:/YOLO26/data/Pumpkin # dataset root dir
names:
- Bacterial Leaf Spot
- Downy Mildew
- Healthy Leaf
- Mosaic disease
- Powdery_Mildew
nc: 5
test: ./test/images
train: ./train/images
val: ./valid/images
import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO
if __name__ == '__main__':
model = YOLO('ultralytics/cfg/models/26/yolo26.yaml')
model.train(data='data/Pumpkin.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,811 parameters, 0 gradients, 5.2 GFLOPs
Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 20/20 3.0it/s 6.6s
all 612 1115 0.801 0.63 0.729 0.478
Bacterial Leaf Spot 121 252 0.727 0.595 0.682 0.409
Downy Mildew 111 196 0.831 0.587 0.698 0.461
Healthy Leaf 120 223 0.783 0.677 0.756 0.513
Mosaic disease 121 208 0.855 0.601 0.722 0.5
Powdery_Mildew 139 236 0.811 0.69 0.787 0.504
预测结果:

受益于人工智能的崛起,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 删除。