首先标注数据使用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_split
def 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 (冻结层)
场景:指定要冻结的模型层。 适用:根据需要设置。multi_scale (是否使用多尺度训练)
场景:决定是否使用多尺度训练。 适用:一般设置为 False。overlap_mask (是否使用重叠掩码)
场景:决定是否使用重叠掩码。 适用:一般设置为 True。mask_ratio (掩码比例)
场景:指定掩码比例。 适用:一般设置为 4。dropout (Dropout 概率)
场景:指定 Dropout 概率。 适用:一般设置为 0.0。val (是否进行验证)
场景:决定是否在训练期间进行验证。 适用:一般设置为 True。split (验证集拆分)
场景:指定验证集拆分方式。 适用:一般设置为 'val'。save_json (是否保存为 JSON)
场景:决定是否保存验证结果为 JSON 格式。 适用:一般设置为 False。save_hybrid (是否保存混合模型)
场景:决定是否保存混合模型。 适用:一般设置为 False。conf (置信度阈值)
场景:指定置信度阈值。 适用:根据需要设置。iou (IOU 阈值)
场景:指定 IOU 阈值。 适用:一