在Colab上使用YOLOv8训练自定义数据集

准备环境

  1. 在github上打开https://github.com/ultralytics/ultralytics
  2. 点击 file 跳转到Colab
  3. 点击复制到云端硬盘,将运行环境复制到自己的云盘
  4. 安装yolov8
    %pip install ultralytics
    import ultralytics
    ultralytics.checks()

准备数据

  1. 首先数据集压缩包上传到谷歌云盘

  2. 挂载云端硬盘

    from google.colab import drive
    drive.mount('/content/drive')
  3. 解压数据集

    !unzip /content/drive/MyDrive/defect_Images.zip -d /content/dataset
  4. 将数据集转化为yolo格式,并生成训练集和验证集。此处使用的数据集是天池比赛:2019广东工业智造创新大赛 赛场一的数据集,注意修改josn_pathimage_path

    import numpy as np
    import os
    import json
    from tqdm.auto import tqdm
    import shutil as sh
    import cv2
    josn_path = "/content/drive/MyDrive/Annotations/anno_train.json"
    image_path = "/content/dataset/defect_Images"
    defect_name2label = {
    '破洞': 1, '水渍': 2, '油渍': 2, '污渍': 2, '三丝': 3, '结头': 4, '花板跳': 5, '百脚': 6, '毛粒': 7,
    '粗经': 8, '松经': 9, '断经': 10, '吊经': 11, '粗维': 12, '纬缩': 13, '浆斑': 14, '整经结': 15, '星跳': 16, '跳花': 16,
    '断氨纶': 17, '稀密档': 18, '浪纹档': 18, '色差档': 18, '磨痕': 19, '轧痕': 19, '修痕': 19, '烧毛痕': 19, '死皱': 0, '云织': 0,
    '双纬': 0, '双经': 0, '跳纱': 0, '筘路': 0, '纬纱不良': 0,
    }
    name_list = []
    image_h_list = []
    image_w_list = []
    c_list = []
    w_list = []
    h_list = []
    x_center_list = []
    y_center_list = []
    with open(josn_path, 'r') as f:
    temps = tqdm(json.loads(f.read()))
    for temp in temps:
        # image_w = temp["image_width"]
        # image_h = temp["image_height"]
        name = temp["name"].split('.')[0]
        path = os.path.join(image_path, temp["name"])
        # print('path: ',path)
        im = cv2.imread(path)
        sp = im.shape
        image_h, image_w = sp[0], sp[1]
        # print("image_h, image_w: ", image_h, image_w)
        # print("defect_name: ",temp["defect_name"])
        # bboxs
        x_l, y_l, x_r, y_r = temp["bbox"]
        # print(temp["name"], temp["bbox"])
        defect_name = defect_name2label[temp["defect_name"]]
        # print(image_w, image_h)
        # print(defect_name)
        x_center = (x_l + x_r) / (2 * image_w)
        y_center = (y_l + y_r) / (2 * image_h)
        w = (x_r - x_l) / (image_w)
        h = (y_r - y_l) / (image_h)
        # print(x_center, y_center, w, h)
        name_list.append(temp["name"])
        c_list.append(defect_name)
        image_h_list.append(image_w)
        image_w_list.append(image_h)
        x_center_list.append(x_center)
        y_center_list.append(y_center)
        w_list.append(w)
        h_list.append(h)
    index = list(set(name_list))
    print(len(index))
    for fold in [0]:
        val_index = index[len(index) * fold // 5:len(index) * (fold + 1) // 5]
        print(len(val_index))
        for num, name in enumerate(name_list):
            print(c_list[num], x_center_list[num], y_center_list[num], w_list[num], h_list[num])
            row = [c_list[num], x_center_list[num], y_center_list[num], w_list[num], h_list[num]]
            if name in val_index:
                path2save = 'val/'
            else:
                path2save = 'train/'
            # print('convertor\\fold{}\\labels\\'.format(fold) + path2save)
            # print('convertor\\fold{}/labels\\'.format(fold) + path2save + name.split('.')[0] + ".txt")
            # print("{}/{}".format(image_path, name))
            # print('convertor\\fold{}\\images\\{}\\{}'.format(fold, path2save, name))
            if not os.path.exists('convertor/fold{}/labels/'.format(fold) + path2save):
                os.makedirs('convertor/fold{}/labels/'.format(fold) + path2save)
            with open('convertor/fold{}/labels/'.format(fold) + path2save + name.split('.')[0] + ".txt", 'a+') as f:
                for data in row:
                    f.write('{} '.format(data))
                f.write('\n')
                if not os.path.exists('convertor/fold{}/images/{}'.format(fold, path2save)):
                    os.makedirs('convertor/fold{}/images/{}'.format(fold, path2save))
                sh.copy(os.path.join(image_path, name),
                        'convertor/fold{}/images/{}/{}'.format(fold, path2save, name))
  5. 修改配置文件my.yaml

    # Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
    path: /content/convertor/fold0  # dataset root dir
    train: images/train  # train images (relative to 'path') 128 images
    val: images/val  # val images (relative to 'path') 128 images
    test:  # test images (optional)
    # Classes
    names:
    0: 0
    1: 1
    2: 2
    3: 3
    4: 4
    5: 5
    6: 6
    7: 7
    8: 8
    9: 9
    10: 10
    11: 11
    12: 12
    13: 13
    14: 14
    15: 15
    16: 16
    17: 17
    18: 18
    19: 19

附:数据集转换工具https://github.com/FireworksFallDown/TypeTotype,可将COCO,YOLO,VOC数据集相互转化

模型训练

可用以下命令行方式进行训练

!yolo detect train model=yolov8n.yaml data=/content/drive/MyDrive/my.yaml epochs=200 batch=64 imgsz=640

训练参数详解:

名称默认值描述
batch16训练的批量大小
modelnull训练模型权重,可指定具体位置,如yolov8n.pt,yolov8n.yaml等
epochs100训​​练的轮次
imgsz640输入图像压缩后的尺寸
devicenull用于训练的设备,可选0或1或cpu等
workers8多线程数据加载,默认8
datanull数据路径,使用自定义的yaml文件或者官方yaml
lr0float初始学习率
lrffloat最终学习率(lr0 * lrf)
patience50早期训练时,准确率如果没有显著上升则停止的轮次
saveTrue是否需要保存训练的模型和预测结果
cacheFalse使用缓存进行数据加载,可选True/ram, disk 或者 False
projectnull项目名称
namenull实验的名称
exist_okFalse是否覆盖现有实验
pretrainedFalse是否使用预训练模型
optimizer‘SGD’优化器,可选[‘SGD’, ‘Adam’, ‘AdamW’, ‘RMSProp’]
verboseFalse是否打印详细输出
seed0重复性实验的随机种子
deterministicTrue是否启用确定性模式
single_clsFalse是否将多类数据训练为单类
image_weightsFalse是否使用加权图像选择进行训练
rectFalse是否支持矩形训练
cos_lrFalse是否使用余弦学习率调度器
close_mosaic10禁用最后 10 个 epoch 的马赛克增强
resumeFalse是否从上一个检查点恢复训练
lr00.01初始学习率(SGD=1E-2, Adam=1E-3)
lrf0.01余弦退火超参数 (lr0 * lrf)
momentum0.937学习率动量
weight_decay0.0005权重衰减系数
warmup_epochs3.0预热学习轮次
warmup_momentum0.8预热学习率动量
warmup_bias_lr0.1预热学习率
box7.5giou损失的系数
cls0.5分类损失的系数
dfl1.5dfl损失的系数
fl_gamma0.0焦点损失的gamma系数 (efficientDet默认gamma=1.5)
label_smoothing0.0标签平滑
nbs64名义批次,比如实际批次为16,那么64/16=4,每4 次迭代,才进行一次反向传播更新权重,可以节约显存
overlap_maskTrue训练期间掩码是否重叠(仅限分割训练)
mask_ratio4掩码下采样率 (仅限分割训练)
dropout0.0使用 dropout 正则化 (仅限分类训练)

模型验证

使用如下命令,即可完成对验证数据的评估。

!yolo detect val model=runs/detect/train3/weights/best.pt data=/content/drive/MyDrive/my.yaml

验证参数详解:

名称默认值描述
valTrue在训练期间验证/测试
save_jsonFalse将结果保存到JSON文件
save_hybridFalse保存标签的混合版本(标签+附加预测)
conf0.001用于检测的对象置信度阈值(预测时默认0.25,验证时默认0.001)
iou0.6NMS的交并比(IoU)阈值
max_det300每张图像的最大检测数
halfTrue使用半精度(FP16)
dnnFalse使用OpenCVDNN进行ONNX推理
plotsFalse在训练期间显示图片

模型预测

使用如下命令,即可完成对新数据的预测,source需要指定为自己的图像路径,或者摄像头(0)。

!yolo detect predict model=runs/detect/train3/weights/best.pt source=data/images

预测参数详解:

名称默认值描述
sourceultralytics/assets图片或视频的源目录
saveFalse是否保存结果
showFalse是否显示结果
save_txtFalse将结果保存为.txt文件
save_confFalse保存带有置信度分数的结果
save_cropFasle保存裁剪后的图像和结果
conf0.3置信度阈值
hide_labelsFalse隐藏标签
hide_confFalse隐藏置信度分数
vid_strideFalse视频帧率步幅
line_thickness3边界框厚度(像素)
visualizeFalse可视化模型特征
augmentFalse将图像增强应用于预测源
agnostic_nmsFalse类别不可知的NMS
retina_masksFalse使用高分辨率分割蒙版
classesnull只显示某几类结果,如class=0,或者class=[0,2,3]

模型导出

使用如下命令,即可完成训练模型的导出。

!yolo detect export model=runs/detect/train3/weights/best.pt
暂无评论

发送评论 编辑评论

|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇