前言
yolov10关于模型的各种参数其实都写到了一起(包括训练、验证和推理的参数),在./ultralytics/cfg/default.yaml中,通过使用这些指令我们可以实现各种所需的操作。
代码地址:https://github.com/THU-MIG/yolov10
目录
- 一、train.py
- 二、val.py
- 三、detect.py
- 四、export_onnx.py
一、train.py
训练时比较重要的几个参数:
YOLOv10(): 这个参数里面可以写你模型 yaml文件的路径,也可以直接写 .pt 文件
model.load(): 如果你不加 .load(),那就是不使用权重从头训练,加了就是使用使用预训练权重训练
data :数据集 yaml 文件的路径
epochs: 训练轮数
batch :batch size的大小
cache :设置成 True 可以加速训练
patience :早停轮数,不想设置早停的话,可以把这个值设置成一个非常大的数
optimizer: 优化器,最新版应该是提供了 7 种,注释有写包含哪几种,还可以设置成 auto
close_mosaic: 最后多少轮关闭马赛克数据增强,这是一种训练技巧,很有效,一般设置 10-30
resume : 断点续训,一个最实用的参数,直接在这里写你断了的那轮的last.pt 的路径就接上了
single_cls: 数据集是单个类别的时候记得开启,不开其实也没事
cos_lr:是否开启余弦学习率
label_smoothing : 数据集标注质量很差的时候可以考虑给这个参数设置个0.1-0.5
device :多 GPu 训练时这里直接写一个列表,比如[0,1]
import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLOv10
if __name__ == '__main__':
model = YOLOv10('/media/sys410/code/sss/yolov10-main/ultralytics/cfg/models/v10/yolov10n-C2fMMLA-SPPELAN-GCSA.yaml')
# 如何切换模型版本, 上面的ymal文件可以改为 yolov8s.yaml就是使用的v8s,
# 类似某个改进的yaml文件名称为yolov8-XXX.yaml那么如果想使用其它版本就把上面的名称改为yolov8l-XXX.yaml即可(改的是上面YOLO中间的名字不是配置文件的)!
model.load('yolov10n.pt') # 是否加载预训练权重,科研不建议大家加载否则很难提升精度
model.train(
data=r"/media/sys410/code/sss/yolov10-main/Xray.yaml",
# 如果大家任务是其它的'ultralytics/cfg/default.yaml'找到这里修改task可以改成detect, segment, classify, pose
cache=False,
imgsz=640,
epochs=300,
single_cls=False, # 是否是单类别检测
batch=8,
close_mosaic=0,
workers=0,
device='0',
optimizer='SGD', # using SGD
# resume='runs/train/exp21/weights/last.pt', # 如过想续训就设置last.pt的地址
amp=True, # 如果出现训练损失为Nan可以关闭amp
project='runs/train',
name='n-SPPELAN-GCSA',
)
二、val.py
YOLOv10(): 这里写你想要验证的权重的路径,如best.pt
data :这里写自己数据集 yaml 文件的路径
split :写val就是看验证集的指标,写 test 就是看测试集的指(前提是划分了测试集)
batch :测试速度时一般都设置成1(验证比较稳定),设置越大,速度越快
from ultralytics import YOLOv10
if __name__ == '__main__':
# 加载模型
model = YOLOv10('runs/train/yolov10n/weights/best.pt')
# 验证模型
metrics=model.val(
val=True, # (bool) 在训练期间进行验证/测试
data='datasets/data_config.yaml',
split='val', # (str) 用于验证的数据集拆分,例如'val'、'test'或'train'
batch=1, # (int) 每批的图像数量(-1 为自动批处理)
imgsz=640, # 输入图像的大小,可以是整数或w,h
device='', # 运行的设备,例如 cuda device=0 或 device=0,1,2,3 或 device=cpu
workers=8, # 数据加载的工作线程数(每个DDP进程)
save_json=False, # 保存结果到JSON文件
save_hybrid=False, # 保存标签的混合版本(标签 + 额外的预测)
conf=0.001, # 检测的目标置信度阈值(默认为0.25用于预测,0.001用于验证)
iou=0.6, # 非极大值抑制 (NMS) 的交并比 (IoU) 阈值
project='runs/val', # 项目名称(可选)
name='yolov10n', # 实验名称,结果保存在'project/name'目录下(可选)
max_det=300, # 每张图像的最大检测数
half=False, # 使用半精度 (FP16)
dnn=False, # 使用OpenCV DNN进行ONNX推断
plots=True, # 在训练/验证期间保存图像
)
print(f"mAP50-95: {metrics.box.map}") # map50-95
print(f"mAP50: {metrics.box.map50}") # map50
print(f"mAP75: {metrics.box.map75}") # map75
speed_metrics = metrics.speed
total_time = sum(speed_metrics.values())
fps = 1000 / total_time
print(f"FPS: {fps}") # FPS
三、detect.py
from ultralytics import YOLOv10
if __name__ == '__main__':
# 加载模型
model = YOLOv10(r'yolov10n.pt') # YOLOv8n模型
model.predict(
source=r'ultralytics/assets/bus.jpg',
save=True, # 保存预测结果
imgsz=640, # 输入图像的大小,可以是整数或w,h
conf=0.25, # 用于检测的目标置信度阈值(默认为0.25,用于预测,0.001用于验证)
iou=0.45, # 非极大值抑制 (NMS) 的交并比 (IoU) 阈值
show=False, # 如果可能的话,显示结果
project='runs/predict', # 项目名称(可选)
name='exp', # 实验名称,结果保存在'project/name'目录下(可选)
save_txt=False, # 保存结果为 .txt 文件
save_conf=True, # 保存结果和置信度分数
save_crop=False, # 保存裁剪后的图像和结果
show_labels=True, # 在图中显示目标标签
show_conf=True, # 在图中显示目标置信度分数
vid_stride=1, # 视频帧率步长
line_width=3, # 边界框线条粗细(像素)
visualize=False, # 可视化模型特征
augment=False, # 对预测源应用图像增强
agnostic_nms=False, # 类别无关的NMS
retina_masks=False, # 使用高分辨率的分割掩码
boxes=True, # 在分割预测中显示边界框
)
四、export_onnx.py
onnx是一种跨平台、开放式的机器学习框架。
from ultralytics import YOLOv10
# Load a model
model = YOLOv10('yolov8n.pt') # load an official model
model = YOLOv10('path/to/best.pt') # load a custom trained
# Export the model
model.export(format='onnx')