版本:commit id为d6be91d7866549ccad4b19d65d0e03c7fdbd0ec8

基于YOLOv8训练自定义数据集

  1. 克隆下yolov8源码后,在项目源码目录下新建data目录,将自定义数据集放置data目录下。自定义数据集按照如下目录结构存放:
├─images
│  ├─train
│  └─val
└─labels
    ├─train
    └─val
  1. 然后再data目录下新建加载数据的配置文件person.yaml,其内容示例如下:
train: E:\ultralytics\data\images\train
val: E:\ultralytics\data\images\val

nc: 1
names: ['person']
  1. 安装依赖:
# 1.安装适合自身硬件配置的torch和torchvision
# 2.安装requirements中的依赖包
pip install -r requirements.txt -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
  1. 训练模型
    1. 方式1:输入命令yolo task=detect mode=train model=weights/yolov8n.pt data=data/person.yaml batch=4 epochs=100 imgsz=640 workers=16 device=0
    2. 方式2:
      1. 在项目根目录下运行yolo copy-cfg将在当前目录下生成ultralytics\ultralytics\yolo\cfg\default.yaml配置文件的拷贝,即default_copy.yaml
      2. 根据需求修改default_copy.yaml文件中的内容,主要修改如下:
      # Train settings 
      model: weights/yolov8n.pt # path to model file, i.e. yolov8n.pt, yolov8n.yaml
      data:  data/person.yaml # path to data file, i.e. coco128.yaml
      epochs: 100  # number of epochs to train for
      batch: 2  # number of images per batch (-1 for AutoBatch)
      
      1. 使用yolo cfg=default_copy.yaml命令即可开始训练
    3. 方式3:自定义train.py文件,内容如下
    from ultralytics import YOLO
    
    if __name__ == '__main__':
        # 加载模型
        # model = YOLO(r'yolov8-seg.yaml')  # 不使用预训练权重训练
        
        model = YOLO(r"E:\ultralytics\weights\yolov8n.pt")  # 使用预训练权重训练
        
        model.train(data = r"E:\ultralytics\data\person.yaml", epochs=500,batch=16)
       
    
    1. 训练时报错TypeError: concatenate() got an unexpected keyword argument 'dtype'解决方案是将numpy的版本更改为1.23.3
  2. 模型推理:
    1. 方式1:使用命令yolo detect predict model=weights/best.pt source=data/test_images save=True即可
    2. 方式2:自定义predict.py,内容如下:
    from ultralytics import YOLO
    
    
    if __name__ == '__main__':
    
        model = YOLO('weights/best.pt')  # build from YAML and transfer weights
        model.predict(source='data/test_images/test', conf = 0.4, save = True)
    
    1. 问题AttributeError: Can't get attribute 'v8DetectionLoss',解决方案是升级ultralytics。
    pip install ultralytics --upgrade
    

目标检测模型的推理输出分析

  1. 使用如下脚本进行模型的推理
from ultralytics import YOLO


if __name__ == '__main__':

    model = YOLO('weights/yolov8n.pt')  # build from YAML and transfer weights
    result = model.predict(source='data/test_images/', conf = 0.4, save = True)
    print("result:", result)
1.模型的输入
  1. source参数:指定输入模型的图片的位置
2.模型的输出
  1. 上述推理脚本中,result是一个由ultralytics.engine.results.Results类型的对象组成的列表,Results类封装了推理结果。其主要属性如下:
    1. boxes:检测边界框,可能有多个,其属性如下
    1. xyxy:The boxes in xyxy format
    2. conf:检测框的置信度值
    3. cls:检测框的类别值
    4. id:检测框的追踪id
    5. xywh:The boxes in xywh format
    6. xyxyn:The boxes in xyxy format normalized by original image size。归一化后的
    7. xywhn:The boxes in xywh format normalized by original image size。归一化后的
    8. data:The raw bboxes tensor
    
    1. keypoints:包含检测的关键点信息,yolo做关键点检测时会有这个信息
    2. masks:包含检测的掩码信息,yolo做实例分割时会有这个信息
    3. names:A dictionary of class names.即目标检测的类别
    4. orig_img:以numpy数组格式存储的原始图片,形状为(height,width,dimension)
    5. orig_shape:以元组表示的原始图片的形状,例如(height,width)
    6. path:The path to the image file.即输入模型的图片的路径
    7. probs:每个类别的概率,yolo做分类任务会有这个信息
    8. save_dir:模型输出可视化结果的路径,例如
    9. speed:A dictionary of preprocess, inference, and postprocess speeds in milliseconds per image
  2. 对于目标检测,需要特别关注Results的boxes属性

YOLOv8将后缀名为pt的模型导出为onnx格式

  1. 下载依赖包onnx
pip install onnx==1.16.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
  1. 在ultralytics目录下新建脚本,并执行python export_onnx.py
from ultralytics import YOLO

// 待转换模型所在的位置
model = YOLO(r"C:\Users\root\Desktop\data\ultralytics\runs\detect\train2\weights\fruit.pt")
model.export(format="onnx")