大模型私有化部署实践(十一):YOLO物体检测

456 阅读6分钟

专栏

简介

  • YOLO物体检测实际上已经不太算是大模型的范畴,但因为是深度学习的领域,就放到一起说
  • YOLO是一种流行的实时物体检测算法,由Joseph Redmon等人在2016年提出。它将物体检测视为回归问题,通过卷积神经网络直接从图像中预测物体的边界框和类别。YOLO将输入图像划分为多个网格,每个网格负责预测中心点落在该网格内的物体。其优点在于速度快,可实时检测,且能捕捉到图像的全局信息,减少假阳性检测。YOLO系列算法经过多个版本的改进,如YOLOv2引入的anchor boxes、YOLOv3的多尺度预测等,检测精度和效率不断提升。YOLO广泛应用于视频监控、自动驾驶、工业自动化等领域,展现出强大的泛化能力和实用性。

安装

conda create --name yolo python=3.10
conda activate yolo
  • 下载yolo相关模型的时候网速比较慢这边使用多线程下载, x m l模型区别x最大l次之,m比较综合
aria2c -x 16 -s 16 https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11x.pt

可视化YOLO标注数据

pip install label-studio

label-studio start
  • 记得注册,我比较习惯选下面标签去处理打标签 11.png

12.png

微调YOLO

  • 使用label-studio标注需要微调的物体,然后导出
  • 项目结构

1.png

  • 先新增一个配置文件, classes里面的内容填你想要打标图像的类型
E:\py_proj_v2\ultralytics\ultralytics\cfg\models\11\auto-parts-det.yaml


train: E:/py_proj_v2/ultralytics/ultralytics/cfg/datasets/det_auto_parts_20250114/images/res # train images
val: E:/py_proj_v2/ultralytics/ultralytics/cfg/datasets/det_auto_parts_20250114/images/res # val images

# Classes
names:
  0: mailBox
  1: repo
  • 导出的数据合集放到下面目录,按照导出的格式,下面代码也可以改从中断位置训练,记得改模型地址

3.png

训练

  • 训练代码, 我的模型放在runs底下
from ultralytics import YOLO

# 加载预训练的模型
model = YOLO("E:\py_proj_v2\ultralytics\runs\yolo11m.pt")

# 定义训练参数,添加默认值、范围和中文注释
train_params = {
    'data': "E:\py_proj_v2\ultralytics\ultralytics\cfg\models\11\auto-parts-det.yaml",  # 数据集配置文件路径,需要自定义修改
    'epochs': 100,  # 总训练轮次,默认值 100,范围 >= 1
    'imgsz': 600,  # 输入图像大小,默认值 640,范围 >= 32
    'batch': 8,  # 批次大小,默认值 16,范围 >= 1
    'save': True,  # 是否保存训练结果和模型,默认值 True
    'save_period': -1,  # 模型保存频率,默认值 -1,表示只保存最终结果
    'cache': False,  # 是否缓存数据集,默认值 False
    'device': None,  # 训练设备,默认值 None,支持 "cpu", "gpu"(device=0,1), "mps"
    'workers': 8,  # 数据加载线程数,默认值 8,影响数据预处理速度
    'name': None,  # 训练运行的名称,用于创建子目录保存结果,默认值 None
    'exist_ok': False,  # 是否覆盖已有项目/名称目录,默认值 False
    'optimizer': 'auto',  # 优化器,默认值 'auto',支持 'SGD', 'Adam', 'AdamW'
    'verbose': True,  # 是否启用详细日志输出,默认值 False
    'seed': 0,  # 随机种子,确保结果的可重复性,默认值 0
    'deterministic': True,  # 是否强制使用确定性算法,默认值 True
    'single_cls': False,  # 是否将多类别数据集视为单一类别,默认值 False
    'rect': False,  # 是否启用矩形训练(优化批次图像大小),默认值 False
    'cos_lr': False,  # 是否使用余弦学习率调度器,默认值 False
    'close_mosaic': 10,  # 在最后 N 轮次中禁用 Mosaic 数据增强,默认值 10
    'resume': False,  # 是否从上次保存的检查点继续训练,默认值 False
    'amp': True,  # 是否启用自动混合精度(AMP)训练,默认值 True
    'fraction': 1.0,  # 使用数据集的比例,默认值 1.0
    'profile': False,  # 是否启用 ONNX 或 TensorRT 模型优化分析,默认值 False
    'freeze': None,  # 冻结模型的前 N 层,默认值 None
    'lr0': 0.01,  # 初始学习率,默认值 0.01,范围 >= 0
    'lrf': 0.01,  # 最终学习率与初始学习率的比值,默认值 0.01
    'momentum': 0.937,  # SGD 或 Adam 的动量因子,默认值 0.937,范围 [0, 1]
    'weight_decay': 0.0005,  # 权重衰减,防止过拟合,默认值 0.0005
    'warmup_epochs': 3.0,  # 预热学习率的轮次,默认值 3.0
    'warmup_momentum': 0.8,  # 预热阶段的初始动量,默认值 0.8
    'warmup_bias_lr': 0.1,  # 预热阶段的偏置学习率,默认值 0.1
    'box': 7.5,  # 边框损失的权重,默认值 7.5
    'cls': 0.5,  # 分类损失的权重,默认值 0.5
    'dfl': 1.5,  # 分布焦点损失的权重,默认值 1.5
    'pose': 12.0,  # 姿态损失的权重,默认值 12.0
    'kobj': 1.0,  # 关键点目标损失的权重,默认值 1.0
    'label_smoothing': 0.0,  # 标签平滑处理,默认值 0.0
    'nbs': 64,  # 归一化批次大小,默认值 64
    'overlap_mask': True,  # 是否在训练期间启用掩码重叠,默认值 True
    'mask_ratio': 4,  # 掩码下采样比例,默认值 4
    'dropout': 0.0,  # 随机失活率,用于防止过拟合,默认值 0.0
    'val': True,  # 是否在训练期间启用验证,默认值 True
    'plots': True,  # 是否生成训练曲线和验证指标图,默认值 True
    'project': "runs/train", # 保存的地方

    # 数据增强相关参数
    'hsv_h': 0.2,  # 色相变化范围 (0.0 - 1.0),默认值 0.015
    'hsv_s': 0.7,  # 饱和度变化范围 (0.0 - 1.0),默认值 0.7
    'hsv_v': 0.4,  # 亮度变化范围 (0.0 - 1.0),默认值 0.4
    'degrees': 30.0,  # 旋转角度范围 (-180 - 180),默认值 0.0
    'translate': 0.1,  # 平移范围 (0.0 - 1.0),默认值 0.1
    'scale': 0.5,  # 缩放比例范围 (>= 0.0),默认值 0.5
    'shear': 0.0,  # 剪切角度范围 (-180 - 180),默认值 0.0
    'perspective': 0.0,  # 透视变化范围 (0.0 - 0.001),默认值 0.0
    'flipud': 0.0,  # 上下翻转概率 (0.0 - 1.0),默认值 0.0
    'fliplr': 0.5,  # 左右翻转概率 (0.0 - 1.0),默认值 0.5
    'bgr': 0.0,  # BGR 色彩顺序调整概率 (0.0 - 1.0),默认值 0.0
    'mosaic': 0.5,  # Mosaic 数据增强 (0.0 - 1.0),默认值 1.0
    'mixup': 0.0,  # Mixup 数据增强 (0.0 - 1.0),默认值 0.0
    'copy_paste': 0.0,  # Copy-Paste 数据增强 (0.0 - 1.0),默认值 0.0
    'copy_paste_mode': 'flip',  # Copy-Paste 增强模式 ('flip' 或 'mixup'),默认值 'flip'
    'auto_augment': 'randaugment',  # 自动增强策略 ('randaugment', 'autoaugment', 'augmix'),默认值 'randaugment'
    'erasing': 0.4,  # 随机擦除增强比例 (0.0 - 0.9),默认值 0.4
    'crop_fraction': 1.0,  # 裁剪比例 (0.1 - 1.0),默认值 1.0

}

if __name__ == '__main__':
    # 进行训练
    results = model.train(**train_params)

推理

  • 是否有GPU速度差距非常大,best.pt是训练好的模型
from ultralytics import YOLO
import time

model = YOLO("E:\py_proj_v2\ultralytics\runs\best.pt")

if __name__ == '__main__':
    # 对指定的图像文件夹进行推理,并设置各种参数
    start_time = time.time()
    results = model.predict(
        source=["E:\\predict\130.jpg", "E:\\predict\131.jpg"],  # 数据来源,可以是文件夹、图片路径、视频、URL,或设备ID(如摄像头)
        conf=0.45,  # 置信度阈值
        iou=0.6,  # IoU 阈值
        imgsz=640,  # 图像大小
        half=False,  # 使用半精度推理
        device=None,  # 使用设备,None 表示自动选择,比如'cpu','0'
        max_det=300,  # 最大检测数量
        vid_stride=1,  # 视频帧跳跃设置
        stream_buffer=False,  # 视频流缓冲
        visualize=False,  # 可视化模型特征
        augment=False,  # 启用推理时增强
        agnostic_nms=False,  # 启用类无关的NMS
        classes=None,  # 指定要检测的类别
        retina_masks=False,  # 使用高分辨率分割掩码
        embed=None,  # 提取特征向量层
        show=False,  # 是否显示推理图像
        save=True,  # 保存推理结果
        save_frames=False,  # 保存视频的帧作为图像
        save_txt=True,  # 保存检测结果到文本文件
        save_conf=False,  # 保存置信度到文本文件
        save_crop=False,  # 保存裁剪的检测对象图像
        show_labels=True,  # 显示检测的标签
        show_conf=True,  # 显示检测置信度
        show_boxes=True,  # 显示检测框
        line_width=None  # 设置边界框的线条宽度,比如2,4
    )
    execution_time = time.time() - start_time
    print(f"程序执行时间:{execution_time:.4f} 秒")

参考文章