本文皆为个人原创,请尊重创作,未经许可不得转载。
引言
目前在项目中使用了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...
本文皆为个人原创,请尊重创作,未经许可不得转载。