首先标注数据使用lebalme 或者 lebalimg
标注的时候选择txt格式就行,yolov8训的时候用这个格式,别的看情况可以写代码转格式
标注完之后要训练之前需要划分数据集,比如7:3 8:2 之类的,这个就看个人了,一般5000张以内基本7:3开就行,大概8千到1万就8:2开,或者8.5:1.5开,看个人。
划分数据集,我上个7:3和8:2开的代码:
8:2开的demo
import os import shutil from sklearn.model_selection import train_test_split def split_dataset(image_dir, label_dir, train_ratio, val_ratio, test_ratio=None): # 获取所有图像文件名(假设图像和标签文件同名) all_images = [f for f in os.listdir(image_dir) if f.endswith('.jpg')] # 创建对应的标签文件名列表,假设标签文件扩展名为 .txt all_labels = [f.replace('.jpg', '.txt') for f in all_images] # 按比例划分训练集和验证集(以及可选的测试集) train_images, temp_images, train_labels, temp_labels = train_test_split( all_images, all_labels, test_size=(1 - train_ratio), random_state=42 ) # 如果指定了测试集比例 if test_ratio: # 调整验证集比例,确保验证集和测试集的比例正确 val_ratio_adjusted = val_ratio / (val_ratio + test_ratio) # 按调整后的比例划分验证集和测试集 val_images, test_images, val_labels, test_labels = train_test_split( temp_images, temp_labels, test_size=(1 - val_ratio_adjusted), random_state=42 ) else: # 如果未指定测试集比例,全部分配给验证集 val_images, test_images, val_labels, test_labels = temp_images, [], temp_labels, [] # 创建目标目录,如果不存在则创建 os.makedirs('datasets/images/train', exist_ok=True) os.makedirs('datasets/images/val', exist_ok=True) os.makedirs('datasets/images/test', exist_ok=True) os.makedirs('datasets/labels/train', exist_ok=True) os.makedirs('datasets/labels/val', exist_ok=True) os.makedirs('datasets/labels/test', exist_ok=True) # 复制训练集文件到目标目录 for img, lbl in zip(train_images, train_labels): shutil.copy(os.path.join(image_dir, img), os.path.join('datasets/images/train', img)) shutil.copy(os.path.join(label_dir, lbl), os.path.join('datasets/labels/train', lbl)) # 复制验证集文件到目标目录 for img, lbl in zip(val_images, val_labels): shutil.copy(os.path.join(image_dir, img), os.path.join('datasets/images/val', img)) shutil.copy(os.path.join(label_dir, lbl), os.path.join('datasets/labels/val', lbl)) # 复制测试集文件到目标目录(如果有测试集) for img, lbl in zip(test_images, test_labels): shutil.copy(os.path.join(image_dir, img), os.path.join('datasets/images/test', img)) shutil.copy(os.path.join(label_dir, lbl), os.path.join('datasets/labels/test', lbl)) # 打印训练集、验证集和测试集的图片数量 print(f"Training images: {len(train_images)}") print(f"Validation images: {len(val_images)}") if test_ratio: print(f"Testing images: {len(test_images)}") # 示例使用 image_dir = 'datasets/images' # 图像文件目录 label_dir = 'datasets/labels' # 标签文件目录 # 按照 80% 训练集,10% 验证集,10% 测试集的比例划分数据集 split_dataset(image_dir, label_dir, train_ratio=0.8, val_ratio=0.1, test_ratio=0.1)
7:3开的demo
import os
import shutil
from sklearn.model_selection import train_test_splitdef split_dataset(image_dir, label_dir, train_ratio):
# 获取所有图像文件名(假设图像和标签文件同名)
all_images = [f for f in os.listdir(image_dir) if f.endswith('.jpg')]
all_labels = [f.replace('.jpg', '.txt') for f in all_images]# 按比例划分训练集和验证集
train_images, val_images, train_labels, val_labels = train_test_split(
all_images, all_labels, test_size=(1 - train_ratio), random_state=42
)# 创建目标目录
train_image_dir = os.path.join(image_dir, 'train')
val_image_dir = os.path.join(image_dir, 'val')
train_label_dir = os.path.join(label_dir, 'train')
val_label_dir = os.path.join(label_dir, 'val')
os.makedirs(train_image_dir, exist_ok=True)
os.makedirs(val_image_dir, exist_ok=True)
os.makedirs(train_label_dir, exist_ok=True)
os.makedirs(val_label_dir, exist_ok=True)# 复制文件到目标目录
for img, lbl in zip(train_images, train_labels):
shutil.copy(os.path.join(image_dir, img), os.path.join(train_image_dir, img))
shutil.copy(os.path.join(label_dir, lbl), os.path.join(train_label_dir, lbl))for img, lbl in zip(val_images, val_labels):
shutil.copy(os.path.join(image_dir, img), os.path.join(val_image_dir, img))
shutil.copy(os.path.join(label_dir, lbl), os.path.join(val_label_dir, lbl))print(f"Training images: {len(train_images)}")
print(f"Validation images: {len(val_images)}")# 示例使用
image_dir = 'datasets/images' # 图像文件目录
label_dir = 'datasets/labels' # 标签文件目录
split_dataset(image_dir, label_dir, train_ratio=0.7) # 按照 70% 训练集和 30% 验证集的比例划分数据集
训练的代码demo
from ultralytics import YOLO def main(): # 加载YOLOv8模型(这里以yolov8s为例) model = YOLO('yolov8s.pt') # 你可以使用预训练的模型权重 # 设置超参数 hyperparameters = { 'epochs': 1, # 训练轮数 'imgsz': 640, # 输入图像大小 'batch': 8, # 批次大小 'device': 0, # 使用的GPU设备编号,-1表示使用CPU 'lr0': 0.01, # 初始学习率 'lrf': 0.01, # 最终学习率 'momentum': 0.937, # 动量 'weight_decay': 0.0005, # 权重衰减 'warmup_epochs': 3.0, # 预热轮数 'warmup_momentum': 0.8, # 预热动量 'warmup_bias_lr': 0.1, # 预热偏置学习率 'box': 7.5, # box 损失增益 'cls': 0.5, # cls 损失增益 'dfl': 1.5, # dfl 损失增益 'hsv_h': 0.015, # HSV 色调增益 'hsv_s': 0.7, # HSV 饱和度增益 'hsv_v': 0.4, # HSV 值增益 'degrees': 0.0, # 旋转度数 'translate': 0.1, # 平移增益 'scale': 0.5, # 尺度增益 'shear': 0.0, # 剪切度数 'perspective': 0.0, # 透视度数 'flipud': 0.0, # 上下翻转概率 'fliplr': 0.5, # 左右翻转概率 'mosaic': 1.0, # 马赛克增强 'mixup': 0.0, # MixUp增强 'copy_paste': 0.0, # 复制粘贴增强 'auto_augment': 'randaugment', # 自动增强策略 'erasing': 0.4, # 随机擦除增强 'crop_fraction': 1.0, # 裁剪比例 'cfg': None, # 模型配置文件 'tracker': 'botsort.yaml', # 跟踪器配置文件 'save_dir': 'runs/train', # 保存目录 'rect': False, # 是否使用矩形训练 'cos_lr': False, # 是否使用余弦学习率 'close_mosaic': 10, # 关闭马赛克增强的epoch 'resume': False, # 是否恢复训练 'amp': True, # 是否使用混合精度 'fraction': 1.0, # 数据集使用比例 'profile': False, # 是否性能分析 'freeze': None, # 冻结层 'multi_scale': False, # 是否使用多尺度训练 'overlap_mask': True, # 是否使用重叠掩码 'mask_ratio': 4, # 掩码比例 'dropout': 0.0, # Dropout 概率 'val': True, # 是否进行验证 'split': 'val', # 验证集拆分 'save_json': False, # 是否保存为JSON 'save_hybrid': False, # 是否保存混合模型 'conf': None, # 置信度阈值 'iou': 0.7, # IOU 阈值 'max_det': 300, # 最大检测数量 'half': False, # 是否使用半精度 'dnn': False, # 是否使用DNN 'plots': True, # 是否绘制图表 'source': None, # 数据源 'vid_stride': 1, # 视频步长 'stream_buffer': False, # 是否使用流缓冲 'visualize': False, # 是否可视化 'augment': False, # 是否数据增强 'agnostic_nms': False, # 是否使用类别无关NMS 'classes': None, # 使用的类别 'retina_masks': False, # 是否使用视网膜掩码 'embed': None, # 嵌入 'show': False, # 是否显示 'save_frames': False, # 是否保存帧 'save_txt': False, # 是否保存为TXT 'save_conf': False, # 是否保存置信度 'save_crop': False, # 是否保存裁剪结果 'show_labels': True, # 是否显示标签 'show_conf': True, # 是否显示置信度 'show_boxes': True, # 是否显示边界框 'line_width': None, # 线宽 'format': 'torchscript', # 格式 'keras': False, # 是否使用Keras 'optimize': False, # 是否优化 'int8': False, # 是否使用int8量化 'dynamic': False, # 是否动态 'simplify': False, # 是否简化 'opset': None, # ONNX opset版本 'workspace': 4, # 工作空间 'nms': False # 是否使用NMS } # 训练模型 model.train( data=r'D:\PycharmProjects\Project\ultralytics-main\datasets\mydata.yaml', # 数据集配置文件 **hyperparameters ) # 评估模型 results = model.val() # 使用模型进行推理 results = model(r'D:\PycharmProjects\Project\ultralytics-main\datasets\images\train\a_1559.jpg') # 输入图片路径 # 打印结果 print(results) if __name__ == "__main__": main()
训练结果出来了出现那个路径就是训练成功了
其中超参数适用的场景,根据所需调整
epochs (训练轮数)
场景:决定模型训练的轮数。较多的轮数可以提高模型的性能,但会增加训练时间。
适用:一般任务,建议从较小的值开始,如 50,然后根据模型收敛情况调整。
imgsz (输入图像大小)场景:决定输入图像的大小。较大的图像大小可以提高检测精度,但会增加计算量。
适用:高分辨率任务,推荐使用 640 或 1024。
batch (批次大小)场景:决定每个批次中处理的图像数量。较大的批次大小可以提高训练稳定性,但需要更多的显存。
适用:显存充足时,可以增大批次大小,如 16 或 32。
device (设备编号)场景:指定训练使用的设备编号。-1 表示使用 CPU,其他数字表示使用对应编号的 GPU。
适用:有多 GPU 环境时,可指定不同设备。
lr0 (初始学习率)场景:控制初始的学习率。较高的学习率可以加速收敛,但可能导致不稳定。
适用:一般从 0.01 开始,根据需要调整。
lrf (最终学习率)场景:训练结束时的学习率。通常设置为初始学习率的一个较小比例。
适用:通常设置为 0.01。
momentum (动量)场景:控制优化器的动量。动量可以帮助模型在梯度下降过程中保持稳定。
适用:一般设置为 0.937。
weight_decay (权重衰减)场景:控制正则化的权重衰减。防止模型过拟合。
适用:一般设置为 0.0005。
warmup_epochs (预热轮数)场景:控制预热阶段的轮数。在预热阶段,学习率逐渐增加到初始学习率。
适用:一般设置为 3.0。
warmup_momentum (预热动量)场景:控制预热阶段的动量。预热阶段,动量逐渐增加到正常动量。
适用:一般设置为 0.8。
warmup_bias_lr (预热偏置学习率)场景:控制预热阶段偏置项的学习率。
适用:一般设置为 0.1。
box (box 损失增益)场景:控制边界框损失的增益。
适用:一般设置为 7.5。
cls (cls 损失增益)场景:控制分类损失的增益。
适用:一般设置为 0.5。
dfl (dfl 损失增益)场景:控制分布焦点损失的增益。
适用:一般设置为 1.5。
hsv_h (HSV 色调增益)场景:数据增强时的色调增益。
适用:一般设置为 0.015。
hsv_s (HSV 饱和度增益)场景:数据增强时的饱和度增益。
适用:一般设置为 0.7。
hsv_v (HSV 值增益)场景:数据增强时的值增益。
适用:一般设置为 0.4。
degrees (旋转度数)场景:数据增强时的图像旋转度数。
适用:一般设置为 0.0。
translate (平移增益)场景:数据增强时的图像平移增益。
适用:一般设置为 0.1。
scale (尺度增益)场景:数据增强时的图像尺度增益。
适用:一般设置为 0.5。
shear (剪切度数)场景:数据增强时的图像剪切度数。
适用:一般设置为 0.0。
perspective (透视度数)场景:数据增强时的图像透视度数。
适用:一般设置为 0.0。
flipud (上下翻转概率)场景:数据增强时的图像上下翻转概率。
适用:一般设置为 0.0。
fliplr (左右翻转概率)场景:数据增强时的图像左右翻转概率。
适用:一般设置为 0.5。
mosaic (马赛克增强)场景:数据增强时的马赛克增强概率。
适用:一般设置为 1.0。
mixup (MixUp增强)场景:数据增强时的 MixUp 增强概率。
适用:一般设置为 0.0。
copy_paste (复制粘贴增强)场景:数据增强时的复制粘贴增强概率。
适用:一般设置为 0.0。
auto_augment (自动增强策略)场景:选择自动增强策略。
适用:一般设置为 'randaugment'。
erasing (随机擦除增强)场景:数据增强时的随机擦除增强概率。
适用:一般设置为 0.4。
crop_fraction (裁剪比例)场景:数据增强时的裁剪比例。
适用:一般设置为 1.0。
cfg (模型配置文件)场景:指定自定义的模型配置文件。
适用:根据具体需求设置。
tracker (跟踪器配置文件)场景:指定跟踪器配置文件。
适用:一般设置为 'botsort.yaml'。
save_dir (保存目录)场景:指定训练结果的保存目录。
适用:一般设置为 'runs/train'。
rect (是否使用矩形训练)场景:决定是否使用矩形训练。
适用:一般设置为 False。
cos_lr (是否使用余弦学习率)场景:决定是否使用余弦学习率调度。
适用:一般设置为 False。
close_mosaic (关闭马赛克增强的 epoch)场景:指定在训练多少个 epoch 后关闭马赛克增强。
适用:一般设置为 10。
resume (是否恢复训练)场景:决定是否从上次中断的地方恢复训练。
适用:一般设置为 False。
amp (是否使用混合精度)场景:决定是否使用混合精度训练。
适用:一般设置为 True。
fraction (数据集使用比例)场景:指定使用的数据集比例。
适用:一般设置为 1.0。
profile (是否性能分析)场景:决定是否进行性能分析。
适用:一般设置为 False。
freeze (冻结