工业级YOLOv11实战:8倍效跃迁与全栈部署指南1.1

本文皆为个人原创,请尊重创作,未经许可不得转载。

引言

目前在项目中使用了yolo进行目标识别,替代传统的电子检测,可将大大减少机械手臂运动轨迹,提高自动化流水线效率,从之前的50秒直接提高到6-7秒。故此研究一些时日,目前技术架构设计和落地方案定为YOLO11x+Python+ONNX+OpenCV+Spring Boot进行搭建。

YOLO(You Only Look Once)系列作为实时目标检测领域的里程碑,自2016年推出以来不断进化。从YOLOv1到YOLOv8,每一代都带来了显著的性能提升和架构优化。随着YOLOv11的发布,这一系列再次在速度与精度之间取得了新的平衡,成为当前最先进的目标检测模型之一。

一、YOLOv11 的基本原理

1.1 概述

YOLOv11 是 Ultralytics 公司推出的最新一代目标检测模型,基于改进的 CSPDarknet 架构,并结合了最新的轻量化设计和多尺度预测技术。它不仅继承了YOLO系列"单次前向传播"的高效特性,还在模型结构、损失函数、训练策略等方面进行了多项创新。

1.2 网络结构

主干网络(Backbone)

YOLOv11 的主干网络采用了 CSPDarknet11 ,该结构通过引入 Cross Stage Partial Connections (CSP) 来增强梯度路径,减少冗余计算,提高模型效率。

  • CSP模块:将特征图分为两部分,一部分直接传递,另一部分经过卷积处理后合并,从而减少计算量并提升信息流动。
  • 深度可分离卷积(Depthwise Separable Convolution) :用于进一步压缩模型大小和推理时间。

特征金字塔网络(FPN)

YOLOv11 使用了 PANet++(Path Aggregation Network Plus) ,这是一种高效的特征融合结构,能够更好地聚合不同层级的特征信息,提升小目标检测能力。

  • Top-down pathway:从高层语义特征向下传递。
  • Bottom-up pathway:从低层细节特征向上传递。
  • 横向连接:融合不同层次的特征图。

检测头(Detection Head)

YOLOv11 的检测头采用 Decoupled Detection Head,将分类、回归和对象性预测解耦,分别进行建模:

  • Class Prediction Head:预测类别概率。
  • Box Regression Head:预测边界框坐标。
  • Objectness Head:预测是否包含目标。

这种解耦设计提高了模型的灵活性和准确性。

1.3 损失函数

YOLOv11 的损失函数由三部分组成:

  • 分类损失(Classification Loss) :通常使用 Focal Loss 或 BCEWithLogitsLoss。
  • 边界框回归损失(Box Regression Loss) :使用 CIoU Loss 提升边界框的定位精度。
  • 对象性损失(Objectness Loss) :用于判断是否包含目标。

Ltotal​=λcls​⋅Lcls​+λobj​⋅Lobj​+λbox​⋅Lbox

其中 λ 为权重系数,用于平衡各部分损失。

二、YOLOv11 的实现与使用

2.1 安装

在安装pytorch前需要安装cuda,需从developer.nvidia.com/cuda-toolki... 下载安装

找小于等于当前cuda版本,torch选择页面 Previous PyTorch Versions

安装 Python 3.8+ 和 PyTorch 1.13+。 若有独立显卡则安装GPU版本的pytorch,若无独立显卡则安装CPU版本的pytorch。

复制代码
pip install ultralytics

2.2 使用预训练模型进行推理

ini 复制代码
from ultralytics import YOLO # 加载预训练模型 

model = YOLO('yolov11s.pt') # 可替换为 yolov11n, yolov11m, yolov11l, yolov11x 
# 进行图像推理 
results = model('https://ultralytics.com/images/bus.jpg')
# 显示结果
results[0].show()

以上是简单版本的实现:

这个是真实的实现版本:

ini 复制代码
from ultralytics import YOLO
import torch.multiprocessing as mp
import os

def start_train():
    # 检查预训练模型是否存在
    pretrained_weights = "weights/yolo11x.pt"  
    if not os.path.exists(pretrained_weights):
        raise FileNotFoundError(f"预训练权重文件 {pretrained_weights} 不存在")

    # 初始化模型
    model = YOLO(pretrained_weights)  # 使用Nano模型

    try:
        # 训练参数配置
        results = model.train(
            data="conf/derek.yml",
            epochs=300,
            batch=8,                      # 提升batch size需根据显存调整
            imgsz=640,                     # 明确指定输入图像尺寸
            device=0,                      # 使用GPU 0
            workers=4,                     # 数据加载线程数
            optimizer="AdamW",             # 使用现代优化器
            lr0=0.001,                    # 初始学习率
            weight_decay=0.05,             # 权重衰减
            project="derek-yolo",      # 项目名称
            name="derek",                   # 实验名称
            seed=42,                      # 固定随机种子
            deterministic=True,            # 确定性训练
            val=True,                      # 开启周期验证
            pretrained=True,               # 确保使用预训练权重
        )
    except Exception as e:
        print(f"训练过程中发生错误: {str(e)}")
        raise

if __name__ == '__main__':
    mp.set_start_method('spawn', force=True)

    # 检查配置文件是否存在
    if not os.path.exists("conf/derek.yml"):
        raise FileNotFoundError("数据集配置文件 conf/derek.yml 不存在")

    start_train()
    print("训练完成,最终模型保存在 runs/derek-yolo/derek/weights 目录")

2.3 自定义数据集训练

数据准备

自定义数据集:

kotlin 复制代码
dataset/
├── images/ 
│ ├── train/ 
│ └── val/ 
| |__test/
├── labels/ 
│ ├── train/ 
│ └── val/ 
| |__test/
└── data.yaml

data.yaml 示例:

yaml 复制代码
train: dataset/images/train/
val: dataset/images/val/
test: dataset/images/test/
nc: 5 # 类别数量
names: ['person', 'car', 'dog', 'cat', 'bicycle']
# 数据增强配置
augment:
  fliplr: 0.2
  flipud: 0.1
  mosaic: 1.0
  mixup: 0.5
  hsv_h: 0.015
  hsv_s: 0.5
  hsv_v: 0.3
  degrees: 45
  scale: 0.5

训练命令

以下是demo 版本

ini 复制代码
from ultralytics import YOLO 
# 创建新模型或加载预训练模型 
model = YOLO('derek.yaml') # 使用配置文件创建新模型 
# 或者: #model = YOLO('yolov11s.pt') # 使用预训练模型继续训练 
# 开始训练 
results = model.train(data='data.yaml', epochs=300, imgsz=640)

正式版:

ini 复制代码
from ultralytics import YOLO
import torch.multiprocessing as mp

def start_train():
    # 加载预训练模型
    model = YOLO("weights/yolo11x.pt")  
    config_file = "conf/derek.yml"
    # 启动训练
    results = model.train(
        data=config_file,           # 数据集配置文件
        imgsz=640,
        epochs=500,                     # 推荐最少300轮[4](@ref)
        batch=8,                        # 根据GPU显存调整(RTX3090建议32)
        device=0                      # 指定GPU
    )
    model.val()

if __name__ == '__main__':
    start_train()

参数说明

  • data: 数据集配置文件路径
  • epochs: 训练轮数
  • imgsz: 输入图像尺寸
  • batch: 批次大小
  • device: GPU 设备编号(如 0, 0,1
  • workers: 数据加载线程数
  • project: 输出目录
  • name: 子目录名称

因测试本机显卡较差 只能训练三轮,为了好的效果得至少三百轮以上才行。

2.4 模型评估

python 复制代码
# 在验证集上评估模型
metrics = model.val()
# 打印 [email protected]:0.95 
print(metrics.box.map) # [email protected]:0.95 
print(metrics.box.map50) # [email protected]

2.5 模型导出

ini 复制代码
# 导出为 ONNX 格式 
model.export(format='onnx')

真实版本

ini 复制代码
from ultralytics import YOLO

model = YOLO("weights/best.pt")

model.export(
    format="onnx",
    imgsz=(640, 640),
    simplify=False,
    opset=12,
    agnostic_nms=False
)

2.6 模型验证

ini 复制代码
from pathlib import Path

from ultralytics import YOLOE
import cv2
import glob
import time

# 加载训练好的模型
model = YOLOE("weights/best.pt")
image_paths = glob.glob("images/test/*.jpg")

# 执行推理
results = model.predict(
    source=image_paths,  # 输入路径(支持jpg/png等)
    conf=0.3,          # 置信度阈值
    iou=0.45,          # NMS的IoU阈值
    save=True,         # 自动保存带检测框的结果图
    show_labels=True,  # 显示类别标签
    show_conf=True,     # 显示置信度
)

# 结构化解析检测结果
for idx, result in enumerate(results):
    # 获取当前图片路径与结果文件名
    img_path = image_paths[idx]
    output_path = f"runs/detect/exp/{Path(img_path).name}"

    # 获取检测信息
    boxes = result.boxes.xyxy.cpu().numpy()  # [N,4]数组:x1,y1,x2,y2
    confidences = result.boxes.conf.cpu().numpy()  # [N,]置信度数组
    class_ids = result.boxes.cls.cpu().numpy().astype(int)  # [N,]类别ID


    print(f"\n图片 {idx + 1}/{len(results)}: {img_path}")
    print(f"检测到 {len(boxes)} 个目标")

    # 遍历每个检测目标并输出详细信息
    for i, (box, conf, cls_id) in enumerate(zip(boxes, confidences, class_ids)):
        label = model.names[cls_id]
        print(f"目标 {i + 1}: {label} | 置信度: {conf:.4f} | 坐标: {box}")


    plotted_img = result.plot(line_width=2, font_size=10)
    cv2.imwrite(output_path, plotted_img)

P-R图:

三、总结

以上就是yolo 部分理论和环境的搭建。其核心讲述的python 语言实现的模型训练,导出和验证。及其不同参数的说明介绍。后期文章将详细描述导出的onnx如何在java 环境中进行使用和利用openCV 如何操作图像与AI进行完美结合。

四、参考资料

docs.ultralytics.com/zh/models/y...

本文皆为个人原创,请尊重创作,未经许可不得转载。

相关推荐
自学前端_又又1 小时前
3年Vue3,借Trae之力,实现转React的有缝连接
前端·javascript·trae
踩着两条虫4 小时前
AI + 低代码 技术揭秘(八):UI 组件库
低代码·ai编程
不识君5 小时前
编程的门槛真的越来越低了
cursor·trae
饼干哥哥5 小时前
我靠!90%的Cursor请求都白花了!一个脚本把额度暴涨到2500次!!
ai编程
饼干哥哥5 小时前
不是吧?现在还有人手动去抄网站页面?这3个工具10分钟像素级复制一个网站
ai编程
Goboy5 小时前
Trae 制作动态布局生成器,解放双手,排布从此不再靠摆积木
ai编程·trae
90后的晨仔19 小时前
使用Trae这个AI工具实现一个个性的技术博客
ai编程
AI大模型技术社1 天前
🔧 PyTorch高阶开发工具箱:自定义模块+损失函数+部署流水线完整实现
人工智能·pytorch
MrSkye1 天前
从零到一:我用AI对话写出了人生第一个弹幕游戏 | Prompt编程实战心得
前端·ai编程·trae