准备环境
- 在github上打开https://github.com/ultralytics/ultralytics
- 点击
跳转到Colab
- 点击
复制到云端硬盘
,将运行环境复制到自己的云盘 - 安装yolov8
%pip install ultralytics import ultralytics ultralytics.checks()
准备数据
首先数据集压缩包上传到谷歌云盘
挂载云端硬盘
from google.colab import drive drive.mount('/content/drive')
解压数据集
!unzip /content/drive/MyDrive/defect_Images.zip -d /content/dataset
将数据集转化为yolo格式,并生成训练集和验证集。此处使用的数据集是天池比赛:2019广东工业智造创新大赛 赛场一的数据集,注意修改
josn_path
和image_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))
修改配置文件
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
训练参数详解:
名称 | 默认值 | 描述 |
---|---|---|
batch | 16 | 训练的批量大小 |
model | null | 训练模型权重,可指定具体位置,如yolov8n.pt,yolov8n.yaml等 |
epochs | 100 | 训练的轮次 |
imgsz | 640 | 输入图像压缩后的尺寸 |
device | null | 用于训练的设备,可选0或1或cpu等 |
workers | 8 | 多线程数据加载,默认8 |
data | null | 数据路径,使用自定义的yaml文件或者官方yaml |
lr0 | float | 初始学习率 |
lrf | float | 最终学习率(lr0 * lrf) |
patience | 50 | 早期训练时,准确率如果没有显著上升则停止的轮次 |
save | True | 是否需要保存训练的模型和预测结果 |
cache | False | 使用缓存进行数据加载,可选True/ram, disk 或者 False |
project | null | 项目名称 |
name | null | 实验的名称 |
exist_ok | False | 是否覆盖现有实验 |
pretrained | False | 是否使用预训练模型 |
optimizer | ‘SGD’ | 优化器,可选[‘SGD’, ‘Adam’, ‘AdamW’, ‘RMSProp’] |
verbose | False | 是否打印详细输出 |
seed | 0 | 重复性实验的随机种子 |
deterministic | True | 是否启用确定性模式 |
single_cls | False | 是否将多类数据训练为单类 |
image_weights | False | 是否使用加权图像选择进行训练 |
rect | False | 是否支持矩形训练 |
cos_lr | False | 是否使用余弦学习率调度器 |
close_mosaic | 10 | 禁用最后 10 个 epoch 的马赛克增强 |
resume | False | 是否从上一个检查点恢复训练 |
lr0 | 0.01 | 初始学习率(SGD=1E-2, Adam=1E-3) |
lrf | 0.01 | 余弦退火超参数 (lr0 * lrf) |
momentum | 0.937 | 学习率动量 |
weight_decay | 0.0005 | 权重衰减系数 |
warmup_epochs | 3.0 | 预热学习轮次 |
warmup_momentum | 0.8 | 预热学习率动量 |
warmup_bias_lr | 0.1 | 预热学习率 |
box | 7.5 | giou损失的系数 |
cls | 0.5 | 分类损失的系数 |
dfl | 1.5 | dfl损失的系数 |
fl_gamma | 0.0 | 焦点损失的gamma系数 (efficientDet默认gamma=1.5) |
label_smoothing | 0.0 | 标签平滑 |
nbs | 64 | 名义批次,比如实际批次为16,那么64/16=4,每4 次迭代,才进行一次反向传播更新权重,可以节约显存 |
overlap_mask | True | 训练期间掩码是否重叠(仅限分割训练) |
mask_ratio | 4 | 掩码下采样率 (仅限分割训练) |
dropout | 0.0 | 使用 dropout 正则化 (仅限分类训练) |
模型验证
使用如下命令,即可完成对验证数据的评估。
!yolo detect val model=runs/detect/train3/weights/best.pt data=/content/drive/MyDrive/my.yaml
验证参数详解:
名称 | 默认值 | 描述 |
---|---|---|
val | True | 在训练期间验证/测试 |
save_json | False | 将结果保存到JSON文件 |
save_hybrid | False | 保存标签的混合版本(标签+附加预测) |
conf | 0.001 | 用于检测的对象置信度阈值(预测时默认0.25,验证时默认0.001) |
iou | 0.6 | NMS的交并比(IoU)阈值 |
max_det | 300 | 每张图像的最大检测数 |
half | True | 使用半精度(FP16) |
dnn | False | 使用OpenCVDNN进行ONNX推理 |
plots | False | 在训练期间显示图片 |
模型预测
使用如下命令,即可完成对新数据的预测,source需要指定为自己的图像路径,或者摄像头(0)。
!yolo detect predict model=runs/detect/train3/weights/best.pt source=data/images
预测参数详解:
名称 | 默认值 | 描述 |
---|---|---|
source | ultralytics/assets | 图片或视频的源目录 |
save | False | 是否保存结果 |
show | False | 是否显示结果 |
save_txt | False | 将结果保存为.txt文件 |
save_conf | False | 保存带有置信度分数的结果 |
save_crop | Fasle | 保存裁剪后的图像和结果 |
conf | 0.3 | 置信度阈值 |
hide_labels | False | 隐藏标签 |
hide_conf | False | 隐藏置信度分数 |
vid_stride | False | 视频帧率步幅 |
line_thickness | 3 | 边界框厚度(像素) |
visualize | False | 可视化模型特征 |
augment | False | 将图像增强应用于预测源 |
agnostic_nms | False | 类别不可知的NMS |
retina_masks | False | 使用高分辨率分割蒙版 |
classes | null | 只显示某几类结果,如class=0,或者class=[0,2,3] |
模型导出
使用如下命令,即可完成训练模型的导出。
!yolo detect export model=runs/detect/train3/weights/best.pt