YOLOv11开发流程
1. YOLOv11简介
YOLO(You Only Look Once)是一种实时目标检测算法,自2015年Joseph Redmon等人提出以来,已经发展到第十一代(YOLOv11)。YOLOv11在保持高速检测的同时,大幅提升了检测精度,引入了更多先进技术,如更高效的骨干网络、改进的特征融合策略和优化的损失函数等。
2. 环境搭建
首先需要准备好YOLOv11的运行环境,包括Python、PyTorch和相关依赖库。
# 创建虚拟环境
# 创建虚拟环境(使用venv)
python -m venv yolov11_env --system-site-packages# 激活虚拟环境(Linux/macOS)
source yolov11_env/bin/activate# 安装PyTorch(根据CUDA版本选择),装了的话就不用装了
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118# 克隆YOLOv11仓库
git clone https://github.com/ultralytics/yolov11.git
cd yolov11# 安装依赖库
pip install -r requirements.txt
环境验证:
python check_env.py
该脚本会检查PyTorch版本、CUDA可用性和其他必要依赖是否正确安装。
3. 数据准备
目标检测任务需要标注好的数据集,通常使用COCO、Pascal VOC等公开数据集,也可以使用自己标注的数据集。
3.1 数据集结构
YOLOv11要求数据集遵循特定的目录结构:
datasets/my_dataset/images/train/val/test/labels/train/val/test/data.yaml
3.2 数据标注格式
YOLO使用txt文件存储标注信息,每个txt文件对应一张图像,格式如下:
<class_id> <x_center> <y_center> <width> <height>
其中坐标值都是相对于图像宽高的归一化值。
3.3 数据集配置文件
data.yaml文件需要包含以下信息:
train: ../datasets/my_dataset/images/train/
val: ../datasets/my_dataset/images/val/
test: ../datasets/my_dataset/images/test/ # 可选nc: 80 # 类别数量
names: ['person', 'bicycle', 'car', ...] # 类别名称
3.4 数据增强
YOLOv11内置了丰富的数据增强方法,包括随机缩放、旋转、翻转、色域变换等。可以通过修改配置文件来调整增强策略:
# 数据增强配置示例
augment:hsv_h: 0.015 # 色调增强系数hsv_s: 0.7 # 饱和度增强系数hsv_v: 0.4 # 亮度增强系数flipud: 0.5 # 上下翻转概率fliplr: 0.5 # 左右翻转概率rotate: 10.0 # 旋转角度范围scale: 0.5 # 缩放比例范围
4. 模型配置
YOLOv11提供了多种预训练模型,可以根据任务需求选择合适的模型。模型配置文件位于models/目录下。
4.1 模型选择
常见的YOLOv11模型有:
- yolov11n.pt:超轻量模型,适合边缘设备
- yolov11s.pt:小模型,平衡速度和精度
- yolov11m.pt:中等模型,适合通用场景
- yolov11l.pt:大模型,高精度
- yolov11x.pt:超大模型,最高精度
4.2 自定义模型
如果需要自定义模型结构,可以修改相应的yaml文件。例如,修改anchors、深度和宽度系数等:
# 模型配置示例
nc: 80 # 类别数
depth_multiple: 0.33 # 模型深度系数
width_multiple: 0.50 # 模型宽度系数backbone:# [from, number, module, args][[-1, 1, Conv, [64, 3, 2]], # 0-P1/2[-1, 1, Conv, [120, 3, 2]], # 1-P2/4[-1, 3, C3, [120]],[-1, 1, Conv, [240, 3, 2]], # 3-P3/8[-1, 6, C3, [240]],[-1, 1, Conv, [480, 3, 2]], # 5-P4/16[-1, 9, C3, [480]],[-1, 1, Conv, [960, 3, 2]], # 7-P5/32[-1, 3, C3, [960]],[-1, 1, SPPF, [960, 5]], # 9]
5. 模型训练
准备好数据和模型配置后,就可以开始训练了。
5.1 基础训练命令
python train.py --img 640 --batch 16 --epochs 100 --data data.yaml --cfg models/yolov11s.yaml --weights yolov11s.pt --name my_yolov11s_run
5.2 训练参数详解
--img 640
:输入图像尺寸,YOLOv11支持不同尺寸的输入--batch 16
:批次大小,根据GPU内存调整--epochs 100
:训练轮次,通常需要数百轮--data data.yaml
:数据集配置文件路径--cfg models/yolov11s.yaml
:模型配置文件路径--weights yolov11s.pt
:预训练权重路径,从头训练用--weights ''
--name my_yolov11s_run
:训练运行名称,用于保存结果--device 0
:指定GPU ID,多GPU用0,1,2
或CPU
--workers 8
:数据加载线程数--hyp data/hyps/hyp.scratch.yaml
:超参数配置文件
5.3 高级训练技巧
# 混合精度训练(加速训练)
python train.py --img 640 --batch 16 --epochs 100 --data data.yaml --weights yolov11s.pt --amp# 多GPU训练
python -m torch.distributed.run --nproc_per_node 4 train.py --img 640 --batch 64 --epochs 100 --data data.yaml --weights yolov11s.pt# 断点续训
python train.py --resume# 超参数优化
python train.py --hyp data/hyps/hyp.scratch.yaml --epochs 30 --data data.yaml --weights yolov11s.pt --evolve 50
6. 模型验证
训练完成后,需要验证模型的性能。
python val.py --weights runs/train/my_yolov11s_run/weights/best.pt --data data.yaml --img 640 --batch 32 --task val
验证参数详解:
--task val/test
:验证类型(验证集/测试集)--conf 0.001
:置信度阈值--iou 0.65
:IoU阈值--save-txt
:保存预测结果到txt文件--save-conf
:保存置信度分数--save-json
:保存结果到COCO JSON格式
验证完成后,会生成一系列评估指标,包括mAP@0.5、mAP@0.5:0.95等。
7. 模型推理
使用训练好的模型进行目标检测推理。
python detect.py --weights runs/train/my_yolov11s_run/weights/best.pt --source path/to/images/ --img 640 --conf 0.4 --iou 0.5
推理参数详解:
--source 0
:0表示摄像头,也可以是图像/视频路径或文件夹--view-img
:显示推理结果--save-txt
:保存预测框坐标到txt文件--save-conf
:保存预测置信度--line-thickness 3
:边界框线条粗细--hide-labels
:隐藏标签--hide-conf
:隐藏置信度
7.1 对视频进行推理
python detect.py --weights best.pt --source path/to/video.mp4
7.2 对摄像头进行实时推理
python detect.py --weights best.pt --source 0 --view-img
8. 模型导出
将训练好的模型导出为不同格式,以便在不同平台上部署。
python export.py --weights runs/train/my_yolov11s_run/weights/best.pt --img 640 --batch 1 --include onnx tensorrt openvino
导出参数详解:
--include onnx/tensorrt/openvino/coreml/pb/tflite
:导出格式--half
:半精度FP16导出--dynamic
:动态批处理导出(ONNX)--simplify
:简化ONNX模型--opset 16
:ONNX opset版本
8.1 导出为ONNX格式
python export.py --weights best.pt --include onnx --dynamic
8.2 导出为TensorRT格式
python export.py --weights best.pt --include tensorrt --half
9. 模型部署
导出的模型可以部署到不同平台上。
9.1 ONNX模型部署
import onnxruntime
import cv2
import numpy as np# 加载模型
session = onnxruntime.InferenceSession('best.onnx')# 预处理图像
def preprocess(image):image = cv2.resize(image, (640, 640))image = image.transpose(2, 0, 1)image = np.expand_dims(image, 0)image = image.astype(np.float32) / 255.0return image# 后处理结果
def postprocess(outputs, conf_thres=0.4, iou_thres=0.5):# 实现NMS和边界框解码pass# 推理
image = cv2.imread('image.jpg')
input_tensor = preprocess(image)
outputs = session.run(None, {'images': input_tensor})
results = postprocess(outputs)
9.2 TensorRT模型部署
import tensorrt as trt
import pycuda.driver as cuda
import pycuda.autoinit
import cv2
import numpy as np# 加载TensorRT引擎
def load_engine(engine_file_path):with open(engine_file_path, 'rb') as f:engine_data = f.read()runtime = trt.Runtime(trt.Logger(trt.Logger.WARNING))return runtime.deserialize_cuda_engine(engine_data)# 推理函数
def inference(engine, image):# 分配内存h_input = cuda.pagelocked_empty(trt.volume(engine.get_binding_shape(0)), dtype=np.float32)h_output = cuda.pagelocked_empty(trt.volume(engine.get_binding_shape(1)), dtype=np.float32)# 创建CUDA流stream = cuda.Stream()# 预处理图像input_tensor = preprocess(image)np.copyto(h_input, input_tensor.ravel())# 创建执行上下文context = engine.create_execution_context()# 分配GPU内存d_input = cuda.mem_alloc(h_input.nbytes)d_output = cuda.mem_alloc(h_output.nbytes)# 传输数据到GPUcuda.memcpy_htod_async(d_input, h_input, stream)# 执行推理context.execute_async(bindings=[int(d_input), int(d_output)], stream_handle=stream.handle)# 传输结果到CPUcuda.memcpy_dtoh_async(h_output, d_output, stream)# 同步流stream.synchronize()# 后处理结果output = h_output.reshape(engine.get_binding_shape(1))results = postprocess(output)return results
10. 自定义数据集训练
如果使用自己的数据集,需要进行以下步骤:
- 收集图像数据
- 使用标注工具(如LabelImg、CVAT)标注数据
- 转换标注格式为YOLO格式
- 创建data.yaml配置文件
- 开始训练
# 示例:使用自定义数据集训练
python train.py --img 640 --batch 16 --epochs 100 --data datasets/my_dataset/data.yaml --weights yolov11s.pt
11. 性能优化
提高YOLOv11性能的方法:
- 调整模型大小:根据需求选择合适的模型(n/s/m/l/x)
- 优化超参数:使用
--evolve
命令自动寻找最优超参数 - 数据增强:增加训练数据的多样性
- 混合精度训练:使用
--amp
加速训练 - 模型剪枝和量化:减少模型大小和计算量
12. 常见问题解决
- CUDA内存不足:减小batch size或使用更小的模型
- 训练不收敛:检查数据标注质量,调整学习率
- 推理速度慢:使用TensorRT加速,减小输入尺寸
- 精度低:增加训练轮次,使用更大的模型,改进数据增强
13. 应用案例
YOLOv11可以应用于多种场景:
- 安防监控:人员检测、行为分析
- 自动驾驶:车辆、行人、交通标志检测
- 工业检测:产品缺陷检测
- 农业:农作物病虫害检测
- 无人机:地形分析、目标跟踪