目录
- 前言:
- 一、下载模型
- 二、导入数据集
- 三、训练自己的数据集
- 四、验证数据集
- 五、测试数据集
前言:
YOLO11于2024年9月30日由YOLOv8团队正式发布,接下来让我们仔细研究一下如何使用YOLO11训练自己的模型
一、下载模型
进入YOLOv11官方网址https://github.com/ultralytics/ultralytics/tree/main下载整个工程
下载完成后解压到自己的目标文件夹,通过自己的IDE打开工程在下图框选位置添加训练train.py、验证val.py和测试detect.py代码,代码如下:
Train.py代码
from ultralytics import YOLO
from ultralytics import RTDETRif __name__ == '__main__':# 加载模型model = YOLO(r'cfg/models/11/yolo11.yaml') # 不使用预训练权重训练# model = YOLO(r'yolov8.yaml').load("yolov8n.pt") # 使用预训练权重训练# 训练参数 ----------------------------------------------------------------------------------------------model.train(data=r'E:/dyh/ultralytics-main/data5/data.yaml',epochs=300, # (int) 训练的周期数patience=50, # (int) 等待无明显改善以进行早期停止的周tiao期数batch=16, # (int) 每批次的图像数量(-1 为自动批处理)imgsz=640, # (int) 输入图像的大小,整数或w,hsave=True, # (bool) 保存训练检查点和预测结果save_period=-1, # (int) 每x周期保存检查点(如果小于1则禁用)cache=False, # (bool) True/ram、磁盘或False。使用缓存加载数据device='', # (int | str | list, optional) 运行的设备,例如 cuda device=0 或 device=0,1,2,3 或 device=cpuworkers=8, # (int) 数据加载的工作线程数(每个DDP进程)project='runs/train', # (str, optional) 项目名称name='exp', # (str, optional) 实验名称,结果保存在'project/name'目录下exist_ok=False, # (bool) 是否覆盖现有实验pretrained=True, # (bool | str) 是否使用预训练模型(bool),或从中加载权重的模型(str)optimizer='SGD', # (str) 要使用的优化器,选择=[SGD,Adam,Adamax,AdamW,NAdam,RAdam,RMSProp,auto]verbose=True, # (bool) 是否打印详细输出seed=0, # (int) 用于可重复性的随机种子deterministic=True, # (bool) 是否启用确定性模式single_cls=False, # (bool) 将多类数据训练为单类rect=False, # (bool) 如果mode='train',则进行矩形训练,如果mode='val',则进行矩形验证cos_lr=False, # (bool) 使用余弦学习率调度器close_mosaic=0, # (int) 在最后几个周期禁用马赛克增强resume=False, # (bool) 从上一个检查点恢复训练amp=True, # (bool) 自动混合精度(AMP)训练,选择=[True, False],True运行AMP检查fraction=1.0, # (float) 要训练的数据集分数(默认为1.0,训练集中的所有图像)profile=False, # (bool) 在训练期间为记录器启用ONNX和TensorRT速度freeze=None, # (int | list, 可选) 在训练期间冻结前 n 层,或冻结层索引列表。# 分割overlap_mask=True, # (bool) 训练期间是否应重叠掩码(仅适用于分割训练)mask_ratio=4, # (int) 掩码降采样比例(仅适用于分割训练)# 分类dropout=0.0, # (float) 使用丢弃正则化(仅适用于分类训练)# 超参数 ----------------------------------------------------------------------------------------------lr0=0.01, # (float) 初始学习率(例如,SGD=1E-2,Adam=1E-3)lrf=0.01, # (float) 最终学习率(lr0 * lrf)momentum=0.937, # (float) SGD动量/Adam beta1weight_decay=0.0005, # (float) 优化器权重衰减 5e-4warmup_epochs=3.0, # (float) 预热周期(分数可用)warmup_momentum=0.8, # (float) 预热初始动量warmup_bias_lr=0.1, # (float) 预热初始偏置学习率box=7.5, # (float) 盒损失增益cls=0.5, # (float) 类别损失增益(与像素比例)dfl=1.5, # (float) dfl损失增益pose=12.0, # (float) 姿势损失增益kobj=1.0, # (float) 关键点对象损失增益label_smoothing=0.0, # (float) 标签平滑(分数)nbs=64, # (int) 名义批量大小hsv_h=0.015, # (float) 图像HSV-Hue增强(分数)hsv_s=0.7, # (float) 图像HSV-Saturation增强(分数)hsv_v=0.4, # (float) 图像HSV-Value增强(分数)degrees=0.0, # (float) 图像旋转(+/- deg)translate=0.1, # (float) 图像平移(+/- 分数)scale=0.5, # (float) 图像缩放(+/- 增益)shear=0.0, # (float) 图像剪切(+/- deg)perspective=0.0, # (float) 图像透视(+/- 分数),范围为0-0.001flipud=0.0, # (float) 图像上下翻转(概率)fliplr=0.5, # (float) 图像左右翻转(概率)mosaic=1.0, # (float) 图像马赛克(概率)mixup=0.0, # (float) 图像混合(概率)copy_paste=0.0, # (float) 分割复制-粘贴(概率))
Val.py代码
from ultralytics import YOLOif __name__ == '__main__':# 加载模型model = YOLO('runs/train/exp31/weights/best.pt')# 验证模型metrics=model.val(val=True, # (bool) 在训练期间进行验证/测试data=r'data5/data.yaml',split='val', # (str) 用于验证的数据集拆分,例如'val'、'test'或'train'batch=1, # (int) 每批的图像数量(-1 为自动批处理)imgsz=640, # 输入图像的大小,可以是整数或w,hdevice='', # 运行的设备,例如 cuda device=0 或 device=0,1,2,3 或 device=cpuworkers=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='exp', # 实验名称,结果保存在'project/name'目录下(可选)max_det=300, # 每张图像的最大检测数half=False, # 使用半精度 (FP16)dnn=False, # 使用OpenCV DNN进行ONNX推断plots=True, # 在训练/验证期间保存图像)print(f"mAP50-95: {metrics.box.map}") # map50-95print(f"mAP50: {metrics.box.map50}") # map50print(f"mAP75: {metrics.box.map75}") # map75speed_metrics = metrics.speedtotal_time = sum(speed_metrics.values())fps = 1000 / total_timeprint(f"FPS: {fps}") # FPS
Detect.py代码
from ultralytics import YOLOif __name__ == '__main__':# 加载模型model = YOLO(r'best.pt') # YOLOv8n模型model.predict(source=r'ultralytics/assets/bus.jpg',save=True, # 保存预测结果imgsz=640, # 输入图像的大小,可以是整数或w,hconf=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, # 类别无关的NMSretina_masks=False, # 使用高分辨率的分割掩码boxes=True, # 在分割预测中显示边界框)
Ok 通过以上操作和设置,训练的模型准备就完成了,接下来导入自己的数据集,进行训练
二、导入数据集
想必大家能看到这里,一定都对YOLO系列有了一定了解,那么数据集的结构大家应该也都清楚,制作自己的数据集对大家来说也不是什么难事,但我这里想给大家提供一个新的获取数据集的渠道,那就是Roboflow数据集网站,官方网址为https://universe.roboflow.com/点击进去之后可以搜索自己想要的数据集例如我这里搜索了hand
搜索后选择适合自己的数据集按照如下顺序下载数据集,当然这个网站功能强大,感兴趣的可以自己先摸索一下,后续我将出一期更详细的利用这个网站的教程
这样数据集也就准备好了,那么接下来就可以使用YOLO11的yaml文件进行训练了
三、训练自己的数据集
在刚才已经编辑好的train.py文件中添加自己的训练模型以及自己的数据集位置
配置好了之后就可以开始训练了,训练成功结果如下:
四、验证数据集
将训练好的权重路径放入到图片中所示的位置
五、测试数据集
与验证数据集步骤类似如下图所示:
OK 以上就是如何使用YOLO11开始训练自己的数据集的全过程了,大家赶紧动手实践起来吧接下来将持续更新相关改进,尽情期待!