参考文章:
超详细目标检测:YOLOv11(ultralytics)训练自己的数据集,新手小白也能学会训练模型,手把手教学一看就会
使用YOLO11训练自己的数据集【下载模型】-【导入数据集】-【训练模型】-【评估模型】-【导出模型】
yolov8(Ultralytics)可视化界面ui设计,基于pyqt5,单py文件即插即用
先说结论:
1.我最终参考第二篇跑成功了,原始数据是28张来自不同镜头的桥梁照片。
2.使用labelimg,直接生成yolo格式的数据,不用经过转换也可以成功,
代码如下:
划分代码直接照抄:
# 作者:CSDN-笑脸惹桃花 https://blog.csdn.net/qq_67105081?type=blog # github:peng-xiaobai https://github.com/peng-xiaobai/Dataset-Conversion import os import shutil import random # random.seed(0) #随机种子,可自选开启 def split_data(file_path, label_path, new_file_path, train_rate, val_rate, test_rate): images = os.listdir(file_path) labels = os.listdir(label_path) images_no_ext = {os.path.splitext(image)[0]: image for image in images} labels_no_ext = {os.path.splitext(label)[0]: label for label in labels} matched_data = [(img, images_no_ext[img], labels_no_ext[img]) for img in images_no_ext if img in labels_no_ext] unmatched_images = [img for img in images_no_ext if img not in labels_no_ext] unmatched_labels = [label for label in labels_no_ext if label not in images_no_ext] if unmatched_images: print("未匹配的图片文件:") for img in unmatched_images: print(images_no_ext[img]) if unmatched_labels: print("未匹配的标签文件:") for label in unmatched_labels: print(labels_no_ext[label]) random.shuffle(matched_data) total = len(matched_data) train_data = matched_data[:int(train_rate * total)] val_data = matched_data[int(train_rate * total):int((train_rate + val_rate) * total)] test_data = matched_data[int((train_rate + val_rate) * total):] # 处理训练集 for img_name, img_file, label_file in train_data: old_img_path = os.path.join(file_path, img_file) old_label_path = os.path.join(label_path, label_file) new_img_dir = os.path.join(new_file_path, 'train', 'images') new_label_dir = os.path.join(new_file_path, 'train', 'labels') os.makedirs(new_img_dir, exist_ok=True) os.makedirs(new_label_dir, exist_ok=True) shutil.copy(old_img_path, os.path.join(new_img_dir, img_file)) shutil.copy(old_label_path, os.path.join(new_label_dir, label_file)) # 处理验证集 for img_name, img_file, label_file in val_data: old_img_path = os.path.join(file_path, img_file) old_label_path = os.path.join(label_path, label_file) new_img_dir = os.path.join(new_file_path, 'val', 'images') new_label_dir = os.path.join(new_file_path, 'val', 'labels') os.makedirs(new_img_dir, exist_ok=True) os.makedirs(new_label_dir, exist_ok=True) shutil.copy(old_img_path, os.path.join(new_img_dir, img_file)) shutil.copy(old_label_path, os.path.join(new_label_dir, label_file)) # 处理测试集 for img_name, img_file, label_file in test_data: old_img_path = os.path.join(file_path, img_file) old_label_path = os.path.join(label_path, label_file) new_img_dir = os.path.join(new_file_path, 'test', 'images') new_label_dir = os.path.join(new_file_path, 'test', 'labels') os.makedirs(new_img_dir, exist_ok=True) os.makedirs(new_label_dir, exist_ok=True) shutil.copy(old_img_path, os.path.join(new_img_dir, img_file)) shutil.copy(old_label_path, os.path.join(new_label_dir, label_file)) print("数据集已划分完成") if __name__ == '__main__': file_path = r"D:\Bob\yolo\train\data\JPEGImages" # 图片文件夹 label_path = r'D:\Bob\yolo\train\data\labels' # 标签文件夹 new_file_path = r"D:\Bob\yolo\train\VOCdevkit" # 新数据存放位置 split_data(file_path, label_path, new_file_path, train_rate=0.8, val_rate=0.1, test_rate=0.1)
训练参考第二篇:
data.yaml
train: D:/Bob/yolo/train/VOCdevkit/train/images # train images (relative to 'path') 128 images val: D:/Bob/yolo/train/VOCdevkit/val/images # val images (relative to 'path') 128 images test: D:/Bob/yolo/train/VOCdevkit/test/images nc: 2 # Classes names: ['line','abort_line']
train训练代码
from ultralytics import YOLO from ultralytics import RTDETR if __name__ == '__main__': # 加载模型 model = YOLO(r'ultralytics/cfg/models/11/yolo11.yaml') # 不使用预训练权重训练 # model = YOLO(r'yolov8.yaml').load("yolov8n.pt") # 使用预训练权重训练 # 训练参数 ---------------------------------------------------------------------------------------------- model.train( data=r'D:/Bob/PyProject/ultralytics-8.3.58/data.yaml', epochs=300, # (int) 训练的周期数 patience=50, # (int) 等待无明显改善以进行早期停止的周tiao期数 batch=16, # (int) 每批次的图像数量(-1 为自动批处理) imgsz=640, # (int) 输入图像的大小,整数或w,h save=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=cpu workers=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 beta1 weight_decay=0.0005, # (float) 优化器权重衰减 5e-4 warmup_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.001 flipud=0.0, # (float) 图像上下翻转(概率) fliplr=0.5, # (float) 图像左右翻转(概率) mosaic=1.0, # (float) 图像马赛克(概率) mixup=0.0, # (float) 图像混合(概率) copy_paste=0.0, # (float) 分割复制-粘贴(概率) )
跑完之后成功了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界