YOLO26保姆级教程+YOLO26改进详解(个人踩坑无数,Win10运行)
- 一、总述
-
-
- End-to-End NMS-Free 推理设计
- 去除Distribution Focal Loss (DFL)
- 引入 ProgLoss 与 Small-Target-Aware Label Assignment (STAL)
- MuSGD 优化器
- 多任务统一与边缘设备优化
- 边缘部署与导出格式支持
- 博客作者个人思考
-
- 二、YOLOv13代码下载
- 三、环境配置
-
- ① cd到YOLO26项目并创建虚拟环境
- ② 在Anaconda中搭建的环境
- 四、制作数据集
- 五、开始训练
一、总述
这一篇则详细讲解如何配置YOLO26,在本地电脑或者服务器都可,然后利用自己的数据集进行训练、推理、检测等。 
YOLO26——具有项目落地属性(端到端、边缘化部署、小目标检测)的实时检测器。YOLO26系列包含五个版本:n、s、m、l、x,其技术核心如下:
End-to-End NMS-Free 推理设计
- YOLO26 完全移除传统目标检测中的 非极大抑制(NMS)后处理,实现端到端的预测输出。
- 这样设计减少了推理时的后处理开销,使得推理更快且在边缘设备上部署更简单可靠。
去除Distribution Focal Loss (DFL)
- 全面剔除 DFL 损失模块,简化了边界框回归的损失结构。
- 这一步能够简化模型导出图(如 ONNX/TensorRT),提高不同硬件上的兼容性与效率。
引入 ProgLoss 与 Small-Target-Aware Label Assignment (STAL)
- 使用 Progressive Loss Balance(ProgLoss) 优化模型训练过程中的损失权重调整,提高稳定性。
- 引入 STAL 标签分配策略专注于小目标识别,提升了对小尺度目标检测的精度表现。
MuSGD 优化器
- 提出了 MuSGD 优化器,融合了传统 SGD 和 Muon 风格的优化思想(受大规模语言模型训练启发),提升收敛稳定性与训练效率。
- 结合现代优化策略帮助模型更快达到性能峰值。
多任务统一与边缘设备优化
- YOLO26 不再仅限于目标检测,还支持实例分割、姿势估计、分类以及定向框检测等任务,成为一个统一的多任务架构。
- 设计优化特别针对边缘与低算力设备(如 Jetson 系列、CPU 环境等)进行推理效率提升,包括更快的 CPU 推理速度。
边缘部署与导出格式支持
- 提供灵活的导出选项,包括 ONNX、TensorRT、CoreML、TFLite、OpenVINO 等格式,便于在不同硬件与框架上集成使用。
- 并对 INT8/FP16 量化推理 做了支持与分析,进一步提升低精度部署效率。
博客作者个人思考
目前随着Ultralytics为YOLO26的造势以及YOLO26的出世,我们其实可以从论文发表以及项目落地的两个维度进行探讨。
- 论文发表:其实YOLO作为目标检测中的经典单阶段目标检测算法,它所解决的领域无外乎:普通的目标检测(如:车辆检测)、重叠目标检测(如:行人重识别)、小目标检测(遥感领域小目标检测、工业领域缺陷检测)、模糊样本检测(相机模糊、各种有雾等自然环境干扰的检测)。通用型目标检测,YOLOv5、YOLOv8已经做的很好了;行人重识别YOLOv11做的确实可以;模糊样本检测、小样本检测YOLOv12的图像超分也在解决这一块的问题;而这一次的YOLO26感觉已经没有对单任务或者多任务去进一步解决,而是将实验室算法进行项目落地,成为一种真正的工业使用手段。同时感觉CVPR也很久没有YOLO系列为基础的算法改进了。所以,现在以YOLO进行论文发表似乎不是一个很好的选择。
- 项目落地:YOLO26最为显著的特点就是项目落地,其论文中明确提出“The release of YOLO26 in September 2025 represents the latest milestone in this evolutionary trajectory, introducing architectural simplifications, novel optimizers, and enhanced edge deployment capabilities designed for low-power devices.”翻译为:YOLO26于2025年9月发布,代表了这一演进轨迹中的最新里程碑,引入了架构简化、新颖优化器和专为低功耗设备设计的增强边缘部署能力。某种意义上,工业视觉的门槛被抹平了,学习成本与部署成本将再一次压缩。
二、YOLOv13代码下载
论文地址:YOLO26 GitHub地址:GitHub代码下载地址
代码下载: 此处直接点击【Code】→【Download ZIP】下载即可
权重下载: 此处直接选择权重文件【YOLO26n】下载即可
在全部下载完成后,将权重文件放到项目文件夹内 
三、环境配置
在windows系统下打开Anaconda的终端,创造虚拟环境。
① cd到YOLO26项目并创建虚拟环境
如下:输入 conda create -n YOLO26(代表环境名称) python=3.10 (使用Python的版本),然后创建就可以了
conda create -n YOLO26 python=3.10
是否安装环境所需基础包,输入y安装:
安装完成如下图:
环境安装完成后,【conda activate YOLO26】激活刚才创建的环境
注1:进入环境后,前面会从base变为YOLO26 注2:此处我直接显示的是我环境路径,无关紧要,二者均可
② 在Anaconda中搭建的环境
【查看当前环境的CUDA版本】
nvidia-smiv
右上角可见我的CUDA版本为12.6
【安装pytorch】 打开pytorch官网 :pytorch官网
向下翻动找到适配于自己cuda版本的指令 :
例如说我的是CUDA 12.6版本,此时cuda指令≤12.6即可 
//安装pytorch
pip install torch==2.9.0 torchvision==0.24.0 torchaudio==2.9.0 –index-url https://download.pytorch.org/whl/cu126
安装成功 
【安装ultralytics库】
pip install ultralytics
安装成功 
四、制作数据集


# 将图片和标注数据按比例切分为 训练集和测试集
import shutil
import random
import os
# 原始路径
image_original_path = "E:/A/lycium_barbarum/datasets/mydata/images/"
label_original_path = "E:/A/lycium_barbarum/datasets/mydata/labels/"
cur_path = os.getcwd()
# 训练集路径
train_image_path = os.path.join(cur_path, "E:/A/lycium_barbarum/datasets/images/train/")
train_label_path = os.path.join(cur_path, "E:/A/lycium_barbarum/datasets/labels/train/")
# 验证集路径
val_image_path = os.path.join(cur_path, "E:/A/lycium_barbarum/datasets/images/val/")
val_label_path = os.path.join(cur_path, "E:/A/lycium_barbarum/datasets/labels/val/")
# 测试集路径
test_image_path = os.path.join(cur_path, "E:/A/lycium_barbarum/datasets/images/test/")
test_label_path = os.path.join(cur_path, "E:/A/lycium_barbarum/datasets/labels/test/")
# 训练集目录
list_train = os.path.join(cur_path, "E:/A/lycium_barbarum/datasets/train.txt")
list_val = os.path.join(cur_path, "E:/A/lycium_barbarum/datasets/val.txt")
list_test = os.path.join(cur_path, "E:/A/lycium_barbarum/datasets/test.txt")
train_percent = 0.8
val_percent = 0.1
test_percent = 0.1
def del_file(path):
for i in os.listdir(path):
file_data = path + "\\\\" + i
os.remove(file_data)
def mkdir():
if not os.path.exists(train_image_path):
os.makedirs(train_image_path)
else:
del_file(train_image_path)
if not os.path.exists(train_label_path):
os.makedirs(train_label_path)
else:
del_file(train_label_path)
if not os.path.exists(val_image_path):
os.makedirs(val_image_path)
else:
del_file(val_image_path)
if not os.path.exists(val_label_path):
os.makedirs(val_label_path)
else:
del_file(val_label_path)
if not os.path.exists(test_image_path):
os.makedirs(test_image_path)
else:
del_file(test_image_path)
if not os.path.exists(test_label_path):
os.makedirs(test_label_path)
else:
del_file(test_label_path)
def clearfile():
if os.path.exists(list_train):
os.remove(list_train)
if os.path.exists(list_val):
os.remove(list_val)
if os.path.exists(list_test):
os.remove(list_test)
def main():
mkdir()
clearfile()
file_train = open(list_train, 'w')
file_val = open(list_val, 'w')
file_test = open(list_test, 'w')
total_txt = os.listdir(label_original_path)
num_txt = len(total_txt)
list_all_txt = range(num_txt)
num_train = int(num_txt * train_percent)
num_val = int(num_txt * val_percent)
num_test = num_txt – num_train – num_val
train = random.sample(list_all_txt, num_train)
# train从list_all_txt取出num_train个元素
# 所以list_all_txt列表只剩下了这些元素
val_test = [i for i in list_all_txt if not i in train]
# 再从val_test取出num_val个元素,val_test剩下的元素就是test
val = random.sample(val_test, num_val)
print("训练集数目:{}, 验证集数目:{}, 测试集数目:{}".format(len(train), len(val), len(val_test) – len(val)))
for i in list_all_txt:
name = total_txt[i][:-4]
srcImage = image_original_path + name + '.jpg'
srcLabel = label_original_path + name + ".txt"
if i in train:
dst_train_Image = train_image_path + name + '.jpg'
dst_train_Label = train_label_path + name + '.txt'
shutil.copyfile(srcImage, dst_train_Image)
shutil.copyfile(srcLabel, dst_train_Label)
file_train.write(dst_train_Image + '\\n')
elif i in val:
dst_val_Image = val_image_path + name + '.jpg'
dst_val_Label = val_label_path + name + '.txt'
shutil.copyfile(srcImage, dst_val_Image)
shutil.copyfile(srcLabel, dst_val_Label)
file_val.write(dst_val_Image + '\\n')
else:
dst_test_Image = test_image_path + name + '.jpg'
dst_test_Label = test_label_path + name + '.txt'
shutil.copyfile(srcImage, dst_test_Image)
shutil.copyfile(srcLabel, dst_test_Label)
file_test.write(dst_test_Image + '\\n')
file_train.close()
file_val.close()
file_test.close()
if __name__ == "__main__":
main()
train: E:/A/lycium_barbarum/datasets/images/train # train images (relative to 'path') 128 images
val: E:/A/lycium_barbarum/datasets/images/val # val images (relative to 'path') 128 images
test: E:/A/lycium_barbarum/datasets/images/test # test images (optional)
nc: 2
# Classes
names: ['immaturate', 'mature']
五、开始训练
下面展示 train.py代码片。
import warnings, os
# os.environ["CUDA_VISIBLE_DEVICES"]="-1" # 代表用cpu训练 不推荐!没意义! 而且有些模块不能在cpu上跑
os.environ["CUDA_VISIBLE_DEVICES"]="1" # 代表用第一张卡进行训练 0:第一张卡 1:第二张卡
warnings.filterwarnings('ignore')
from ultralytics import YOLO
if __name__ == '__main__':
model = YOLO(r'E:\\ultralytics-main-YOLO26\\ultralytics\\cfg\\models\\26\\yolo26.yaml')
# model.load('') # loading pretrain weights
model.train(data=r'E:\\A\\A\\A\\A\\Driving_behavior\\data.yaml',
cache=False,
imgsz=640,
epochs=100,
batch=16,
workers=16,
device='1',
# resume='', # last.pt path
project=r'E:\\ultralytics-main-YOLO26\\runs',
name='Driving_behavior-YOLO26',
)
【开始训练】(PS:本次训练时我自己论文中的数据集,而非刚才划分的数据集) 此时我们会发现一个BUG,正常来说,YOLO26在开始训练时加载YOLO26的预训练权重才对,目前的代码中还是加载的YOLO11n的预训练权重。
python train.py
或者直接在pycharm中以当前环境YOLO26运行(此时博主选择了这种方式)
训练正常

结果正常 
如有问题,欢迎大家一起交流,不胜感激!!!

