yolo基础学习笔记

环境配置

一、安装anaconda

参考博文https://blog.csdn.net/qq_38313548/article/details/164120604?spm=1011.2415.3001.5331

二、创建yolo v11 环境

pyhton版本最低要求在python 3.10 以上,这是后面相关依赖包的兼容版本。

shelll 复制代码
conda create -n yolov11 python==3.10 -y

三、进入环境

shell 复制代码
conda activate yolov11

四、GPU显卡版本和cpu版本依赖安装

4.1 GPU显卡版本【推荐】

4.1.1 检查CUDA版本

前提已装 NVIDIA 显卡驱动

shell 复制代码
nvidia-smi

检查CUDA Version是否大于11.8。如果不是则更新显卡驱动

例如,我的显卡打印信息如下,CUDA Version: 12.6。符合条件

shell 复制代码
C:\Users\Administrator>nvidia-smi
Fri Nov 21 09:58:05 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 560.94                 Driver Version: 560.94         CUDA Version: 12.6     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                  Driver-Model | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce GTX 1060 5GB  WDDM  |   00000000:01:00.0  On |                  N/A |
| 42%   29C    P8             10W /  120W |    2006MiB /   5120MiB |      3%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A      1400    C+G   ...crosoft\Edge\Application\msedge.exe      N/A      |
|    0   N/A  N/A      2020    C+G   ...on\142.0.3595.80\msedgewebview2.exe      N/A      |
|    0   N/A  N/A      2236    C+G   ...5n1h2txyewy\ShellExperienceHost.exe      N/A      |
|    0   N/A  N/A      8256    C+G   C:\Windows\explorer.exe                     N/A      |
|    0   N/A  N/A      9348    C+G   ...2txyewy\StartMenuExperienceHost.exe      N/A      |
|    0   N/A  N/A      9668    C+G   D:\ToDesk\install\ToDesk\ToDesk.exe         N/A      |
|    0   N/A  N/A      9728    C+G   ...siveControlPanel\SystemSettings.exe      N/A      |
|    0   N/A  N/A      9816    C+G   ....Search_cw5n1h2txyewy\SearchApp.exe      N/A      |
|    0   N/A  N/A      9872    C+G   ...n\pycharm\install\bin\pycharm64.exe      N/A      |
|    0   N/A  N/A     11784    C+G   ...CBS_cw5n1h2txyewy\TextInputHost.exe      N/A      |
|    0   N/A  N/A     14768    C+G   ...IntelliJ IDEA 2024.1\bin\idea64.exe      N/A      |
|    0   N/A  N/A     16912    C+G   D:\Typora\install\Typora.exe                N/A      |
+-----------------------------------------------------------------------------------------+
4.1.2 安装PyTorch

进入PyTorch官网

PyTorch官网

4.1.2.1 torch 版本选择

进入官网后,点击下图 Previous PyTorch Versions 位置

进入 Previous PyTorch Versions 页面后搜索属于自己CUDA的版本号。例如我的CUDA版本为12.6,则查找12.6的版本号相关的依赖安装命令

shell 复制代码
# CUDA 12.6
pip install torch==2.9.0 torchvision==0.24.0 torchaudio==2.9.0 --index-url https://download.pytorch.org/whl/cu126

4.1.2.2 安装结果检测

安装完成后使用命令查看是否成功

shell 复制代码
pip show torch

结果如下说明成功。

shell 复制代码
(yolov11) C:\Users\Administrator>pip show torch
Name: torch
Version: 2.9.0+cu126
Summary: Tensors and Dynamic neural networks in Python with strong GPU acceleration
Home-page: https://pytorch.org
Author:
Author-email: PyTorch Team <packages@pytorch.org>
License: BSD-3-Clause
Location: d:\python\anaconda\install\envs\yolov11\lib\site-packages
Requires: filelock, fsspec, jinja2, networkx, sympy, typing-extensions
Required-by: torchaudio, torchvision

使用以下命令查看当前环境下的所有安装的依赖包

shell 复制代码
pip list

结果如下,可以看到torch、torchaudio、torchvision等关键包:

shell 复制代码
(yolov11) C:\Users\Administrator>pip list
Package           Version
----------------- ------------
filelock          3.19.1
fsspec            2025.9.0
Jinja2            3.1.6
MarkupSafe        2.1.5
mpmath            1.3.0
networkx          3.3
numpy             2.1.2
pillow            11.3.0
pip               25.3
setuptools        80.9.0
sympy             1.14.0
torch             2.9.0+cu126
torchaudio        2.9.0+cu126
torchvision       0.24.0+cu126
typing_extensions 4.15.0
wheel             0.45.1

使用以下脚本进行依赖运行监测:

PyTorch检测.md

4.2 CPU版本

注意: 安装CPU版本前先确认当前环境是否已经安装了GPU版本,若已经安装过GPU版本了就不要安装CPU版本了,防止包冲突导致的程序异常现象

CPU版本的安装和GPU类似。区别如下:

  1. 不需要检查CUDA版本

  2. 安装PyTorch时,选择的pip 安装命令不一样,CPU的版本命令如下:

    shell 复制代码
    # CPU only
    pip install torch==2.9.0 torchvision==0.24.0 torchaudio==2.9.0 --index-url https://download.pytorch.org/whl/cpu

五、ultralytics 安装

yolo官方网站地址:YOLO官网(主页 - Ultralytics YOLO 文档)

yolo官方github源码库地址:yolo官方github(GitHub - ultralytics/ultralytics: Ultralytics YOLO 🚀)

5.1 命令行安装

pip 包安装会默认下载 ultralytics 最新的版本

进入yolov11环境

shel 复制代码
conda activate yolov11

使用命令行安装ultralytics包。此命令也可以用于更新ultralytics包

shell 复制代码
pip install -U ultralytics

验证安装结果

shell 复制代码
pip list ultralytics

输出结果可以看到安装的 ultralytics 包。如下 :

shell 复制代码
(yolov11) C:\Users\Administrator>pip list
Package            Version
------------------ ------------
certifi            2025.11.12
charset-normalizer 3.4.4
contourpy          1.3.2
cycler             0.12.1
filelock           3.19.1
fonttools          4.60.1
fsspec             2025.9.0
idna               3.11
Jinja2             3.1.6
kiwisolver         1.4.9
MarkupSafe         2.1.5
matplotlib         3.10.7
mpmath             1.3.0
networkx           3.3
numpy              2.1.2
opencv-python      4.12.0.88
packaging          25.0
pillow             11.3.0
pip                25.3
polars             1.35.2
polars-runtime-32  1.35.2
psutil             7.1.3
pyparsing          3.2.5
python-dateutil    2.9.0.post0
PyYAML             6.0.3
requests           2.32.5
scipy              1.15.3
setuptools         80.9.0
six                1.17.0
sympy              1.14.0
torch              2.9.0+cu126
torchaudio         2.9.0+cu126
torchvision        0.24.0+cu126
typing_extensions  4.15.0
ultralytics        8.3.229
ultralytics-thop   2.0.18
urllib3            2.5.0
wheel              0.45.1

六、yolo11各个模型对比

模型文件存放在:model文件夹中

6.1 常规检测模型

模型 YOLO11n YOLO11s YOLO11m YOLO11l YOLO11x
模型规模(参数量) 最小(~2.6M) 较小(~9.2M) 中等(~10.2M) 较大(~25.9M) 最大(~43.7M)
计算量(FLOPs) 最低(~8.9G) 较小(~28.6G) 中等(~28.8G) 较高(~80.6G) 最高(~128.0G)
检测精度(COCO val) 约 49.5% mAP50-95 约 56.2% mAP50-95 约 58.4% mAP50-95 约 62.2% mAP50-95 约 63.3% mAP50-95
推理速度(FPS) 最快(~350+) 快(~220+) 较快(~180+) 中等(~90+) 较慢(~50+)
适用场景 边缘设备、实时性优先(如手机、嵌入式) 入门级 GPU / 中端 CPU、平衡轻量与精度(如小型安防监控) 边缘服务器、工控机(平衡速度与精度) 本地 PC、云服务器(精度优先,速度尚可) 高性能 GPU 服务器(极致精度,如工业检测、自动驾驶)
最小CPU要求 CPU:x86_64双核或者ARM四核;内存≥2GB x86_64 四核;内存≥4GB x86_64 四核;内存≥4GB 不推荐 完全不推荐
最小GPU要求 显存≥1GB;驱动NVIDIA Driver ≥450.80.02;CUDA ≥11.8 显存:≥2GB;驱动:NVIDIA Driver ≥450.80.02,CUDA ≥11.8; 显存:≥4GB;驱动:NVIDIA Driver ≥450.80.02,CUDA ≥11.8。 显存:≥6GB;驱动:NVIDIA Driver ≥470.57.02,CUDA ≥11.8。 显存:≥8GB(推荐 12GB,高分辨率推理需更大显存) 驱动:NVIDIA Driver ≥470.57.02,CUDA ≥11.8。

6.2 旋转框检测-obb版本

模型 YOLO11n - 旋转框检测 YOLO11s - 旋转框检测 YOLO11m - 旋转框检测 YOLO11l - 旋转框检测 YOLO11x - 旋转框检测
模型规模(参数量) 2.7M 9.7M 20.9M 26.1M 58.8M
计算量(FLOPs) 16.8B 57.1B 182.8B 231.2B 519.1B
检测精度(COCO val) 78.4% mAP50-95 79.5% mAP50-95 80.9% mAP50-95 81.0% mAP50-95 81.3% mAP50-95
推理速度(FPS) 227.3 196.1 99.0 74.1 35.0
适用场景 用于低帧率倾斜目标抓拍(如小区监控抓拍倾斜车辆、快递柜抓拍倾斜包裹) 非实时但满足批量图片检测,中等帧率倾斜目标检测 仅适合非实时批量检测,不推荐 CPU 主力部署。 高精度实时旋转框检测(如物流分拣线的倾斜包裹体积测算、停车场的倾斜车辆车牌识别); 无人机 1024 分辨率航拍的倾斜建筑物 / 农田地块检测 极不推荐 CPU 部署,仅应急使用。 高稳定性倾斜目标检测 完全不推荐 CPU 部署. 极致精度旋转框检测 (如医疗影像的倾斜细胞检测、工业缺陷检测的倾斜裂纹识别); 卫星 1024 分辨率影像的倾斜地形 / 军事目标检测 (对精度要求极致,帧率要求可降低至 20 FPS 以上); 金融安防的倾斜票据字符检测 、自动驾驶的倾斜路牌 / 交通标识检测(核心业务对检测准确率要求接近 100%)
最小CPU要求 x86_64 双核或 ARM 四核, 内存≥4GB x86_64 四核 内存≥6GB x86_64 六核 内存≥8GB。 x86_64 八核 ;内存≥12GB x86_64 十二核及以上 内存≥16GB。
最小GPU要求 显存≥2GB;NVIDIA Driver ≥450.80.02,CUDA ≥11.8。 显存≥3GB;NVIDIA Driver ≥450.80.02,CUDA ≥11.8。 显存≥6GB;NVIDIA Driver ≥470.57.02,CUDA ≥11.8。 显存≥8GB;NVIDIA Driver ≥470.57.02,CUDA ≥11.8。 显存≥10GB(推荐 12GB,避免 1024 分辨率下显存溢出);NVIDIA Driver ≥510.47.03,CUDA ≥12.0。

七、YOLO 默认可预测的数据集

7.1 yolo 基础版本、Seg版本

索引 英文类别名 中文翻译 类别分组
0 person 人/行人 人物类
1 bicycle 自行车 交通工具类
2 car 小汽车 交通工具类
3 motorcycle 摩托车 交通工具类
4 airplane 飞机 交通工具类
5 bus 公共汽车 交通工具类
6 train 火车 交通工具类
7 truck 卡车 交通工具类
8 boat 交通工具类
9 traffic light 交通信号灯 交通设施类
10 fire hydrant 消防栓 交通设施类
11 stop sign 停车标识 交通设施类
12 parking meter 停车计时器 交通设施类
13 bench 长凳/长椅 交通设施类
14 bird 动物类
15 cat 动物类
16 dog 动物类
17 horse 动物类
18 sheep 绵羊 动物类
19 cow 动物类
20 elephant 大象 动物类
21 bear 动物类
22 zebra 斑马 动物类
23 giraffe 长颈鹿 动物类
24 backpack 双肩包 随身物品类
25 umbrella 雨伞 随身物品类
26 handbag 手提包 随身物品类
27 tie 领带 随身物品类
28 suitcase 行李箱 随身物品类
29 frisbee 飞盘 运动用品类
30 skis 滑雪板(双板) 运动用品类
31 snowboard 滑雪板(单板) 运动用品类
32 sports ball 运动球(如篮球/足球等) 运动用品类
33 kite 风筝 运动用品类
34 baseball bat 棒球棒 运动用品类
35 baseball glove 棒球手套 运动用品类
36 skateboard 滑板 运动用品类
37 surfboard 冲浪板 运动用品类
38 tennis racket 网球拍 运动用品类
39 bottle 瓶子 餐具/厨具类
40 wine glass 高脚杯/红酒杯 餐具/厨具类
41 cup 杯子(普通杯) 餐具/厨具类
42 fork 叉子 餐具/厨具类
43 knife 餐具/厨具类
44 spoon 勺子 餐具/厨具类
45 bowl 餐具/厨具类
46 banana 香蕉 食物类
47 apple 苹果 食物类
48 sandwich 三明治 食物类
49 orange 橙子 食物类
50 broccoli 西兰花 食物类
51 carrot 胡萝卜 食物类
52 hot dog 热狗 食物类
53 pizza 披萨 食物类
54 donut 甜甜圈 食物类
55 cake 蛋糕 食物类
56 chair 椅子 家具类
57 couch 沙发 家具类
58 potted plant 盆栽植物 家具类
59 bed 家具类
60 dining table 餐桌 家具类
61 toilet 马桶 家具类
62 tv 电视机 电子设备类
63 laptop 笔记本电脑 电子设备类
64 mouse 鼠标 电子设备类
65 remote 遥控器 电子设备类
66 keyboard 键盘 电子设备类
67 cell phone 手机 电子设备类
68 microwave 微波炉 电子设备类
69 oven 烤箱 电子设备类
70 toaster 烤面包机 电子设备类
71 sink 水槽 电子设备类
72 refrigerator 冰箱 电子设备类
73 book 日常物品类
74 clock 时钟 日常物品类
75 vase 花瓶 日常物品类
76 scissors 剪刀 日常物品类
77 teddy bear 泰迪熊(毛绒玩具熊) 日常物品类
78 hair drier 吹风机 日常物品类
79 toothbrush 牙刷 日常物品类

7.2 yolo-obb版本

索引 英文类别名 中文翻译 类别分组
0 plane 飞机 航空交通工具
1 ship 船舶 水上交通工具
2 storage tank 储罐 工业设施
3 baseball diamond 棒球场 体育场馆
4 tennis court 网球场 体育场馆
5 basketball court 篮球场 体育场馆
6 ground track field 田径场 体育场馆
7 harbor 港口 交通枢纽 / 基础设施
8 bridge 桥梁 交通枢纽 / 基础设施
9 large vehicle 大型车辆 陆地交通工具
10 small vehicle 小型车辆 陆地交通工具
11 helicopter 直升机 航空交通工具
12 roundabout 环岛 交通枢纽 / 基础设施
13 soccer ball field 足球场 体育场馆
14 swimming pool 游泳池 体育场馆

八、YOLO 功能场景对比表

任务名称 核心定义 Ultralytics 对应模型 通用应用场景 建筑工地 / 航拍监控专属场景
目标检测(Object Detection) 定位目标位置(矩形框 / 旋转框)+ 识别类别,不关注轮廓细节 - YOLOv8/v11(n/s/m/l/x):通用轴对齐框检测- YOLOv8/v11-OBB:倾斜目标旋转框检测- 推荐:YOLO11-OBB(航拍倾斜目标适配) 安防监控、交通违章识别、目标计数 1. 航拍工地:检测围挡缺口、非法出入口、施工人员 / 机械、安全帽;2. 占道施工:检测锥桶、警示灯、违规车辆;3. 安全监控:检测未戴安全帽人员、危险区域闯入目标
实例分割(Instance Segmentation) 定位 + 分类 + 像素级勾勒目标轮廓(掩码),区分同一类别不同实例 - YOLOv8/v11-seg(n/s/m/l/x):通用实例分割- 支持 "OBB + 分割" 自定义配置- 推荐:YOLO11-seg-m(精度 + 速度平衡) 医疗影像分割、自动驾驶、物体轮廓提取 1. 围挡完整性:分割围挡轮廓,统计缺口像素面积→换算实际面积;2. 占道施工:分割占道区域,判断是否超规;3. 材料管理:分割砂石 / 钢筋堆,统计堆放面积;4. 安全区域划分:分割危险区 / 作业区,检测越界
姿势估计(Pose Estimation) 定位人体 17 个核心关键点,通过关键点关系分析姿态(站立 / 攀爬 / 摔倒等) - YOLOv8/v11-pose(n/s/m/l/x):人体姿势估计- 推荐:YOLO11-pose-s(边缘端实时分析) 行为分析、体育动作识别、安防预警 1. 安全行为检测:判断未系安全带、违规攀爬、摔倒;2. 人员密集度:通过关键点数量统计人数,判断聚集;3. 操作规范:检测机械操作人员是否在岗
图像分类(Image Classification) 对图像 / 局部区域做类别判定,仅输出类别概率,不定位目标 - YOLOv8/v11-cls(n/s/m/l/x):通用分类- 封装 EfficientNet/ResNet:细粒度分类- 推荐:YOLO11-cls-n(素材快速筛选) 图像检索、质量筛选、场景定性 1. 素材预处理:分类航拍帧(清晰 / 模糊 / 有雾),过滤低质量素材;2. 场景定性:分类航拍图(正常施工 / 围挡缺失 / 人员聚集);3. 材料分类:识别钢筋 / 水泥 / 建筑垃圾;4. 围挡状态:初筛完整 / 破损 / 被遮挡围挡
多目标跟踪(Multi-Object Tracking) 视频序列中为目标分配唯一 ID,持续跟踪位置与轨迹(帧间匹配) - 核心组合:检测 / 分割模型 + ByteTrack/SORT 算法- 推荐:YOLO11-OBB + ByteTrack(航拍倾斜目标跟踪) 车流统计、行人轨迹分析、动态目标监控 1. 轨迹监控:跟踪施工车辆 / 人员是否违规进入非施工区;2. 占道施工:统计车流量、平均车速,分析拥堵;3. 动态预警:跟踪围挡缺口处人员 / 车辆,触发非法出入预警;4. 进度监控:跟踪机械作业轨迹,评估施工进度

九、YOLO结构配置说明

在源码包中的 /ultralytics-8.3.55/ultralytics/cfg/models/ 目录下存放了各个版本模型的核心配置文件,这些文件主要是对yolo工作的核心配置,一般的检测任务不需要修改此处的配置,除非想要自定义yolo工作机制,例如给YOLO添加其他功能模块时。

例如,yolo11的核心配置如下:

yaml 复制代码
# 参数
nc: 80 # 模型默认检测的类别数为 80 类(对应 COCO 数据集的 80 个目标类别)
scales: # 定义了 YOLO11 的5 种模型规模(n/s/m/l/x,从超小到超大)
  # [depth, width, max_channels]
  # depth:深度系数,控制模型中模块的重复次数(系数越大,网络越深)
  # width:宽度系数,控制模型中卷积层的通道数(系数越大,网络越宽,特征表达能力越强)
  # max_channels: 最大通道数,限制卷积层的通道数上限,避免小模型通道数过大导致的效率下降。不能超过宽度系数*最大通道数
  n: [0.50, 0.25, 1024] # 总结:319 层,2624080 个参数,2624064 个梯度,6.6 GFLOPs (GFLOPs为"十亿次浮点运算"的缩写)
  s: [0.50, 0.50, 1024] # 总结: 319 层, 9458752 个参数, 9458736 个梯度, 21.7 GFLOPs (GFLOPs为"十亿次浮点运算"的缩写)
  m: [0.50, 1.00, 512] # 总结: 409 层, 20114688 个参数, 20114672 个梯度, 68.5 GFLOPs (GFLOPs为"十亿次浮点运算"的缩写)
  l: [1.00, 1.00, 512] # 总结: 631 层, 25372160 个参数, 25372144 个梯度, 87.6 GFLOPs (GFLOPs为"十亿次浮点运算"的缩写)
  x: [1.00, 1.50, 512] # 总结: 631 层, 56966176 个参数, 56966160 个梯度, 196.0 GFLOPs (GFLOPs为"十亿次浮点运算"的缩写)

# YOLO11n 骨干网络。是特征提取模块,负责将输入图像转换为多尺度的高维特征图。
backbone:
  # 格式:[from, repeats, module, args]
  # from:输入特征的来源,-1表示上层的输出为本层的输入.YOLO 模型的默认输入图像尺寸为640×640×3(RGB 三通道)
  # repeats:该模块的重复执行次数
  # module:YOLO 自定义的网络模块名称(如Conv、C3k2、SPPF),
  # args:模块的入参列表,参数顺序由模块的定义决定
  
  # Conv模块:用于特征向下采样提取。是YOLO自定义的组合模块(Conv2d:+ BatchNorm + SiLU 激活),非单纯的卷积层。
  # Conv2d:卷积层。执行二维卷积操作,负责提取图像的空间特征
  # BatchNorm:批量归一化。对数据进行标准化处理,加速训练过程并提升模型稳定性
  # SiLU 激活:激活函数。引入非线性因素,增强模型的表达能力
  
  # 原始输入(640宽×640高×3通道)的图像,执行1次自定义Conv模块,参数为[输出通道64,卷积核3,步长2], 得到(320宽×320高×64通道)的特征图。
  # 得到特征图尺寸的计算方式:
  # 	宽度计算:输入图像的宽 x 选择的模型规模深度系数。例如yolo11n的深度系数为0.5,输入图像的宽为640,则640*0.5=320
  # 	高队计算:输入图像的高 x 选择的模型规模深度系数。例如yolo11n的深度系数为0.5,输入图像的高为640,则640*0.5=320
  # 通过第一层卷积后,提取的特征图大小变为原图的二分之一。
  - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
  
  # 本层的输入图像是上层输出的(320宽×320高×64通道)特征图。经过Conv模块后输出(160宽×160高×128通道)特征图
  - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
  
  # C3k2模块:用于特征融合,避免单纯卷积的信息丢失。参数[输出通道数,是否启用shortcut 残差连接,模块内部的通道缩放系数]
  # 本层的输入图像是上层输出的(160宽×160高×128通道)特征图。C3k2不进行特征提取,本层输出(160宽×160高×256通道)特征图
  - [-1, 2, C3k2, [256, False, 0.25]] # 2
  
  # Conv特征向下采样提取,输入(160宽×160高×256通道)特征图 ,输出(80宽×80高×256通道)特征图
  - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
  
  # C3k2特征融合,输入(80宽×80高×256通道)特征图,输出(80宽×80高×512通道)特征图. False时C3k2=C2F,为True时则为C3k2
  - [-1, 2, C3k2, [512, False, 0.25]] # 4
  
  # Conv特征向下采样提取,输入(80宽×80高×512通道)特征图,输出(40宽×40高×512通道)特征图
  - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
  
   # C3k2特征融合,输入(40宽×40高×512通道)特征图,输出(40宽×40高×512通道)
   # 本层C3k2模块启用了shortcut 残差连接,使用默认的缩放系数0.25,在最深的特征层中避免梯度消失
  - [-1, 2, C3k2, [512, True]] # 6
  
  # Conv特征向下采样提取,输入(40宽×40高×512通道)特征图,输出(20宽×20高×1024通道)
  - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
  
   # C3k2特征融合,输入(40宽×40高×512通道)特征图,输出(20宽×20高×1024通道)
   # 本层C3k2模块启用了shortcut 残差连接,使用默认的缩放系数0.25,在最深的特征层中避免梯度消失;
  - [-1, 2, C3k2, [1024, True]] # 8
  
  # SPPF模块:通过空间金字塔池化提取多尺度的全局特征,解决目标尺度变化的问题,不进行特征向下采样通道数不变。输出(20宽×20高×1024通道)
  - [-1, 1, SPPF, [1024, 5]] # 9
  
  # C2PSA模块:注意力模块,让模型自动聚焦图像中的目标区域(如小目标、遮挡目标),抑制背景噪声;整个骨干网络的特征增强收尾,为检测头输出高质量特征。不进行特征向下采样通道数不变。输出(20宽×20高×1024通道)
  - [-1, 2, C2PSA, [1024]] # 10

# YOLO11n 检测头:模型的特征融合与预测模块,负责将骨干网络输出的多尺度特征(P3/P4/P5)进行融合,并最终输出检测结果(目标框、类别、置信度)
# 核心融合逻辑:
# 	FPN 上采样:从 P5 开始,通过上采样放大特征图,与 P4/P3 拼接融合,将高层语义特征传递到浅层;
#	PAN 下采样:从融合后的 P3 开始,通过卷积下采样缩小特征图,与 P4/P5 拼接融合,将浅层细节特征回传给高层;
#	最终检测:融合后的 P3/P4/P5 特征层送入Detect模块,输出检测结果。
head:
  # 格式:[from, repeats, module, args]
  # from:输入特征的来源,-1表示上层的输出为本层的输入.YOLO 模型的默认输入图像尺寸为640×640×3(RGB 三通道).from的取值新增了多输入融合(如[-1,6]表示融合当前上一层和骨干网络第 6 层)
  # repeats:该模块的重复执行次数
  # module:YOLO 自定义的网络模块名称(如Conv、C3k2、SPPF),
  # args:模块的入参列表,参数顺序由模块的定义决定
  
  # 上采样,本层的输入为上一层的输出,头部网络的第一层输入为骨干网络P3/P4/P5中的最后一层P5层的输出。即将P5输出作为本层的输入。输出(20宽×20高×1024通道)。
  # nn.Upsample:向上采样。参数:"None"=缩放因子由2决定,"nearest"= 最近邻插值(速度快,无模糊)。即将输入图像放大2倍,输出为:(40宽×40高×1024通道)。输出的图像与骨干网络的P4输出的宽高一致。
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]] # 11
  
  # 上层输出(40宽×40高×1024通道)+ 骨干网络6层P4(40宽×40高×512通道)作为本层的输入。
  # Concat:用于特征拼接融合,将上层输出的(40宽×40高×1024通道)+ 骨干网络6层P4(40宽×40高×512通道)进行特征拼接入融合。
  # Concat参数[1]表示沿通道维度拼接。宽高不变,通道数相加 。输出:(40宽×40高×1024+512通道) = (40宽×40高×1536通道)
  - [[-1, 6], 1, Concat, [1]] # 12 cat backbone P4
  
  # C3k2特征融合,输入(40宽×40高×1536通道)特征图,输出(40宽×40高×512通道)特征图
  - [-1, 2, C3k2, [512, False]] # 13

  # 上采样,输入上层的(40宽×40高×512通道)特征图放大2倍输出为(80宽×80高×512通道)
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]] # 14
  
  # 特征拼接融合,上层的(80宽×80高×512通道)与 股骨干网络4层输出(80宽×80高×512通道)拼接融合,
  # 本层输出(80宽×80高×512+512通道)=(80宽×80高×1024通道)
  - [[-1, 4], 1, Concat, [1]] #15 cat backbone P3
  
   # C3k2特征融合,输入(80宽×80高×1024通道)特征图,输出(80宽×80高×256通道)特征图
   # 表示该层对应 8 倍下采样,负责小目标检测。降维到 256 通道,生成检测头的 P3 特征层(小目标检测核心)
  - [-1, 2, C3k2, [256, False]] # 16 (P3/8-small)

  # Conv特征向下采样提取,输入(80宽×80高×256通道)特征图,输出(40宽×40高×256通道)特征图
  - [-1, 1, Conv, [256, 3, 2]] # 17
  
  # 特征拼接融合,上层的(40宽×40高×256通道)与 检测头13层(40宽×40高×512通道)拼接融合, 
  # 输出 (40宽×40高×256+512通道)= (40宽×40高×768通道)
  - [[-1, 13], 1, Concat, [1]] # 18 cat head P4
  
  # C3k2特征融合,输入(40宽×40高×768通道),输出(40宽×40高×512通道)特征图
  # 降维到 512 通道,生成检测头的 P4 特征层(中目标检测核心。 16倍 下采样,负责中目标检测
  - [-1, 2, C3k2, [512, False]] # 19 (P4/16-medium)
	
  # Conv特征向下采样提取,输入(40宽×40高×512通道),输出 (20宽×20高×512通道)。与骨干网络P5的尺寸对齐,为回传P5做准备。
  - [-1, 1, Conv, [512, 3, 2]] # 20
  
  # 特征拼接融合,上层的(20宽×20高×512通道)与 骨干网络10层(20宽×20高×1024通道)拼接融合
  # 输出(20宽×20高×512+1024通道)= (20宽×20高×1536通道)
  - [[-1, 10], 1, Concat, [1]] # 21 cat head P5
  
  # C3k2特征融合,输入(20宽×20高×1536通道),输出(20宽×20高×1024通道)特征图
  # 降维到 1024 通道,生成检测头的 P5 特征层(大目标检测核心);shortcut=True(深层特征启用残差连接,避免梯度消失); 32倍 下采样,负责大目标检测。
  - [-1, 2, C3k2, [1024, True]] # 22 (P5/32-large) 

  # 检测头 16 层(P3)+ 19 层(P4)+ 22 层(P5)的输出作为本层的输出, 即(80宽×80高×256通道)+(40宽×40高×512通道)+ (20宽×20高×1024通道)
  # 融合 P3/P4/P5 三个尺度的特征层,分别检测小 / 中 / 大目标;
  # Detect:检测模块,参数:输入类别数nc,
  # 输出:检测结果(目标框 + 类别 + 置信度)
  # 输出格式:每个特征点预测多个锚框,包含坐标 (x/y/w/h)、目标置信度、类别概率。
  - [[16, 19, 22], 1, Detect, [nc]] # 23  Detect(P3, P4, P5)

十、使用YOLO

  1. 准备数据集
  2. 标注数据集
  3. 训练
  4. 验证

10.1 准备数据集

使用公开数据集或者视频抽帧等方式获取数据集。但注意,数据集应该包括各种状态,例如正常的图片数据、旋转后的图片上数据、背景不一致的图片数据、目标与背景相似度高、缩放比例不一样的、不同天气、白天黑夜的 等类型图片数据等。

10.2 数据集重命名

数据集文件命名应该使用非中文且具有顺序的方式。推荐使用整数的方式命名。数据集重命名可以使用 数据集批量重命名 中的脚本。

10.3 数据集标注

使用数据标注工具将重命名的数据集合进行标注。

标注工具使用参考:图片标注工具

标注数据时尽量将标注框包围住图片中的对象。

10.3.1 标注数据介绍

yolo可以识别的标注结果文件为.txt 。

classes.txt:该文件记录了本次数据集标注的类别。一个类别为一行。

XXXX.txt :该文件名称与所标注的图片名称一致。记录对应图片的标注信息内容,

内容说明:

格式:类别序号 中心点的x坐标 中心点的y坐标 宽度 高度

  1. 每一行表示此图片中标注的一个物体
  2. 类别序号:与classes.txt文件中类别从上到下的排序对应,0表示classes.txt中的第一个类别。
  3. 中心点的x坐标:表示目标框中心点的x坐标,相对于图像宽度的比例值,范围在0到1之间
  4. 中心点的y坐标:表示目标框中心点的y坐标,相对于图像高度的比例值,范围在0到1之间
  5. 宽度:表示目标框宽度,相对于图像宽度的比例值,范围在0到1之间
  6. 高度:表示目标框高度,相对于图像高度的比例值,范围在0到1之间

内容如下:

shell 复制代码
0 0.495052 0.249537 0.030729 0.028704
1 0.363021 0.289352 0.029167 0.025000
2 0.317448 0.383333 0.033854 0.025926
0 0.753906 0.685185 0.039062 0.024074

10.4 数据集划分

标注完成的数据集将用于yolo进行训练、验证、预测等阶段使用。因此标注的数据集通常会按照比例进行划分,比例可以参照以下表格:

数据集规模 单样本数量 训练集比例 验证集比例 测试集比例 适用场景
小型数据集 <1 万张 70% 20% 10% 自定义小场景(如工地电动车、特定工业检测)
中型数据集 1 万~10 万张 80% 10% 10% 通用目标检测(如航拍 OBB、普通道路目标)
大型数据集 >10 万张 90% 5% 5% 大规模工业级任务(如自动驾驶、海量遥感影像)

数据集划分应该遵循随机抽样和分层抽样原则。

可以使用数据集划分脚本自动划分数据集:数据集划分 注意事项如下:

  1. 使用数据集划分工具之前先要将数据集文件进行重命名。
  2. 图片文件和数据集标注文件数量必须一致、数量一致。可以使用脚本进行检测:数据集校验
  3. 检验通过后才可以进行数据集划分。

10.5 yolo训练

10.5.1 项目创建

创建项目名称为:demo1

在项目中创建文件夹:datasets

在datasets文件夹下创建本次项目的名称对应的文件夹demo1,用于存放数据集。

将划分好的数据集文件夹放到datasets文件夹下的项目文件夹同名的文件夹中。即 datasets/demo1/ 下。此时项目结构如下图所示

10.5.2 项目配置

在项目中创建一个yaml文件,yaml 与 datasets目录同级,此文件主要用于管理yolo的配置。文件名为:项目名称.yaml

文件中的配置可以参考官方源码包中:ultralytics-8.3.55/ultralytics/cfg/datasets/目录下的yaml文件。

常见配置如下:

yaml 复制代码
# path	字符串	数据集根目录,后续train、val、test的路径基于此相对路径(也可直接用绝对路径)
# 从datasets开始,demo1为datasets下的demo1文件夹名称
path: D:/python/Project/yolo/yolo/demo1/datasets/demo1/
# train 字符串	训练集图片路径 / 索引 txt 文件(txt 文件中每行是图片的绝对路径)
train: images/train
# val	字符串	验证集图片路径 / 索引 txt 文件,训练中用于评估模型精度
val: images/val
# test	字符串	测试集路径(可选),训练完成后用于最终泛化能力评估
test: train/test
# nc	整数	数据集的类别总数,必须与names的长度一致
nc: 1
# names	列表	类别名称列表,索引对应标注文件中的类别 ID(如 0 对应第一个元素)
# 注意:names的顺序必须和标注文件classes的顺序一致
names:
  0: eBike

# obb	布尔值	OBB 任务专属,设为True时模型按定向框检测训练,默认False(AABB)
# True:标注工具导出的标注文件必须是OBB类型。
# False:标注工具导出的标注文件必须是AABB类型。
obb: True
10.5.3 项目代码

在项目中创建一个main.py 文件,将以下代码放入文件中运行。以下代码主要是训练模型。

python 复制代码
if __name__ == '__main__':
    from ultralytics import YOLO
    import os

    # 配置文件路径和模型参数
    ymlPath = r"D:\python\Project\yolo\yolo\demo1\demo1.yaml"
    # 指定模型名称
    modelName = r"D:\python\Project\yolo\yolo\threeDemo\yolo11s-obb.pt"
    degrees = 180.0  # OBB任务开启大角度旋转(适配遥感旋转目标)

    # 加载预训练的YOLO模型
    model = YOLO(modelName)

    # 3. 开始OBB训练(仅修改degrees和模型,其余参数同AABB)
    # 使用指定参数启动模型训练过程
    results = model.train(
        data=ymlPath,      # 训练数据配置文件路径
        epochs=100,        # 训练轮数
        batch=16,          # 批次大小
        imgsz=640,         # 输入图像尺寸
        device=0,          # 使用的GPU设备编号
        degrees=degrees,   # OBB核心:大角度旋转增强
        mosaic=1.0,        # 保留Mosaic增强(适配遥感数据)
        name="demo1",      # 训练任务名称
    )

10.5.3.1 参数说明

上述代码中model.train()表示的是模型训练方法。还有其他常用参数如下表:

参数类型 参数 数据类型 默认值 描述
基础训练参数 data str 必传参数 数据集配置文件的路径(如dataset.yaml),需包含训练 / 验证集路径、类别数、类别名等核心信息
基础训练参数 epochs int 100 训练的总轮数,小数据集建议 50-100,大数据集可设 200-300
基础训练参数 batch int -1 批次大小,默认 - 1 表示自动根据 GPU 显存计算最优批次;显存不足可手动设 8/16,显存充足设 32/64
基础训练参数 imgsz int 640 输入图片的尺寸(像素),需为 32 的倍数(如 320/480/800),小目标检测建议设 800/960
基础训练参数 patience int 50 早停耐心值,连续 N 轮验证集精度无提升则停止训练,防止过拟合
基础训练参数 seed int 0 随机种子,保证训练结果可复现,设为固定值(如 42)则每次训练数据增强 / 抽样一致
基础训练参数 pretrained bool / str True 是否使用预训练权重:True 加载官方预训练权重;False 从头训练;传路径(如best.pt)加载自定义权重
基础训练参数 single_cls bool False 是否将所有类别合并为单一类别训练,适用于单类别检测任务
基础训练参数 rect bool False 是否使用矩形训练(Rectangular Training),按图片实际比例裁剪,减少无效像素,提升训练效率
基础训练参数 cos_lr bool False 是否使用余弦学习率调度器,替代默认的线性学习率衰减
数据增强参数 degrees float 0.0 图片旋转角度范围(±degrees),OBB 遥感任务建议设 180.0,普通 AABB 检测设 0-90
数据增强参数 hsv_h float 0.015 色调增强的幅度,0 为关闭色彩增强,越大色调变化越明显
数据增强参数 hsv_s float 0.7 饱和度增强的幅度,遥感 / 航拍数据可适当增大(如 0.9)
数据增强参数 hsv_v float 0.4 明度增强的幅度,与饱和度配合调整色彩增强强度
数据增强参数 fliplr float 0.5 左右翻转的概率(0-1),0 为关闭,0.5 表示 50% 概率翻转;若目标无左右对称性(如文字)设 0
数据增强参数 flipud float 0.0 上下翻转的概率(0-1),默认关闭,适用于航拍等无上下方向的场景
数据增强参数 mosaic float 1.0 Mosaic 数据增强的概率(0-1),1.0 为全开,小数据集建议开启;训练后期可通过close_mosaic关闭
数据增强参数 close_mosaic int 10 训练最后 N 轮关闭 Mosaic 增强,避免增强过度导致模型拟合偏差
数据增强参数 mixup float 0.0 Mixup 数据增强的概率(0-1),默认关闭,大数据集可设 0.1,小数据集易过拟合
数据增强参数 copy_paste float 0.0 复制粘贴增强的概率(0-1),将目标从一张图复制到另一张,提升小目标样本量
数据增强参数 shear float 0.0 图片剪切角度(±shear),默认关闭,过度剪切会导致目标变形
数据增强参数 perspective float 0.0 透视变换的幅度(0-1),默认关闭,模拟不同拍摄视角
数据增强参数 scale float 0.5 图片缩放幅度(0-scale),0.5 表示可缩放到原图的 50%-150%
学习率与优化器参数 lr0 float 0.01 初始学习率,SGD 优化器默认 0.01,AdamW 优化器建议设 0.001
学习率与优化器参数 lrf float 0.01 最终学习率衰减因子,最终学习率 = lr0 * lrf,默认 0.01 无需大幅调整
学习率与优化器参数 momentum float 0.937 SGD 优化器的动量,提升梯度下降的稳定性,默认值适配大部分场景
学习率与优化器参数 weight_decay float 0.0005 权重衰减系数,防止模型过拟合,过大可能导致训练不收敛
学习率与优化器参数 warmup_epochs float 3.0 学习率预热轮数,前 N 轮逐步提升学习率,避免初始学习率过高导致震荡
学习率与优化器参数 warmup_momentum float 0.8 预热阶段的动量值,低于正常训练的动量,提升预热稳定性
学习率与优化器参数 warmup_bias_lr float 0.1 预热阶段偏置的学习率,单独设置以加快偏置参数的收敛
学习率与优化器参数 optimizer str "SGD" 优化器类型,可选 "SGD", "Adam", "AdamW", "NAdam",小数据集用 AdamW 收敛快,大数据集用 SGD 泛化好
学习率与优化器参数 nbs int 64 标称批次大小(Nominal Batch Size),用于学习率的自动调整,无需手动修改
验证与评估参数 val bool True 训练过程中是否每轮在验证集上评估精度,关闭则仅训练不验证
验证与评估参数 val_interval int 1 验证间隔轮数,设为 5 表示每 5 轮验证一次,大数据集可增大以节省训练时间
验证与评估参数 iou float 0.65 NMS(非极大值抑制)的 IOU 阈值,目标密集场景(如人群)设 0.45
验证与评估参数 conf float 0.001 检测的置信度阈值,训练时设低值保留更多候选框,推理时再调高
验证与评估参数 max_det int 300 单张图片的最大检测目标数,目标密集场景(如车流)可设 1000
验证与评估参数 save_json bool False 是否将验证结果保存为 JSON 格式,用于 COCO 数据集的官方评估工具
验证与评估参数 save_hybrid bool False 是否保存混合标注(真实标注 + 模型预测标注),用于半监督训练
结果保存与可视化参数 save bool True 是否保存训练权重和结果文件,关闭则不生成runs/train目录
结果保存与可视化参数 save_period int -1 权重保存间隔轮数,-1 表示仅保存best.ptlast.pt;设为 10 表示每 10 轮保存一个检查点
结果保存与可视化参数 project str "runs/train" 训练结果的保存根目录,可自定义为绝对路径(如/home/user/train_results
结果保存与可视化参数 name str "exp" 实验名称,结果会保存在project/name下,可自定义避免目录覆盖
结果保存与可视化参数 exist_ok bool False 是否允许覆盖已存在的实验目录:True 覆盖;False 则自动生成exp2/exp3
结果保存与可视化参数 verbose bool True 是否在终端打印详细的训练日志,关闭则仅输出关键信息
结果保存与可视化参数 plots bool True 是否生成训练可视化图表(如 results.png、PR_curve.png),关闭则仅保存数值结果
硬件与分布式训练参数 device int / str / None None 训练设备:None 自动选择 GPU(有则用 GPU,无则用 CPU);0 表示第 1 块 GPU;"cpu" 强制用 CPU;多 GPU 设 0,1
硬件与分布式训练参数 workers int 8 数据加载的线程数,根据 CPU 核心数调整;Windows 系统若报错设为 0
硬件与分布式训练参数 sync_bn bool False 是否使用同步批归一化(SyncBN),多 GPU 训练时设为 True,提升批量归一化效果
硬件与分布式训练参数 dnn bool False 是否使用 DNN 模块加载模型,适用于 OpenCV-DNN 部署的预训练模型加载
硬件与分布式训练参数 multi_scale bool False 是否使用多尺度训练,随机在imgsz ± 32范围内调整输入尺寸,提升模型鲁棒性
10.5.4 项目运行

启动后训练信息如下:

shell 复制代码
   Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
     85/100      4.59G      1.002     0.7844     0.9879         65        640: 100% ━━━━━━━━━━━━ 2/2 1.0it/s 2.0s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 1/1 8.0it/s 0.1s
                   all          7         44      0.614      0.938      0.832       0.61

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
     86/100      4.37G      1.054     0.9191     0.9528        108        640: 100% ━━━━━━━━━━━━ 2/2 1.1it/s 1.8s
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% ━━━━━━━━━━━━ 1/1 8.2it/s 0.1s
                   all          7         44      0.606      0.908      0.824      0.613

训练信息说明:

日志分为:训练迭代 和 验证评估

训练迭代日志说明:

字段 数值 / 内容 含义说明
Epoch 85/100 当前训练轮数为第 85 轮,总训练轮数为 100 轮。
GPU_mem 4.59G 训练时 GPU 显存占用为 4.59GB(反映硬件资源消耗,若出现 OOM 需减小 batch/imgsz)。
box_loss 1.002 边界框回归损失(目标是让预测框与真实框重合,数值越小框越准)。
cls_loss 0.7844 类别分类损失(目标是让模型正确识别目标类别,数值越小分类越准)。
dfl_loss 0.9879 分布焦点损失(YOLO 系列的特有损失,优化边界框的坐标回归精度,数值越小越好)。
Instances 65 本轮训练迭代中,当前批次的图片里包含65 个目标实例(标注的目标数量)。
Size 640 模型的输入图片尺寸为 640×640(需为 32 的倍数,YOLO 默认值)。
100% ━━━━━━━━━━━━ 进度条 本轮训练的数据集迭代进度(2/2 表示本轮需迭代 2 个批次,已完成 2 个)。
1.0it/s 迭代速度 每秒处理 1 个批次(反映训练效率,受 GPU 性能、batch 大小影响)。
2.0s 耗时 本轮训练的 2 个批次共耗时 2 秒。

验证评估日志说明:

字段 数值 / 内容 含义说明
Class all 评估的类别范围(all表示统计所有类别的平均指标,若有多个类会单独列出每类)。
Images 7 验证集的图片数量为 7 张。
Instances 44 验证集的 7 张图片中,包含44 个目标实例(标注的总目标数)。
Box(P) 0.614(61.4%) 边界框的精确率(Precision):模型预测为正例的结果中,实际是正例的比例。
Box(R) 0.938(93.8%) 边界框的召回率(Recall):实际为正例的目标中,被模型正确检测出的比例。
mAP50 0.832(83.2%) IoU 阈值为 0.5 时的平均精度(mAP):目标检测的核心指标,数值越高模型越准。
mAP50-95 0.61(61%) IoU 阈值从 0.5 到 0.95 的平均 mAP(更严格的精度指标,综合不同 IoU 下的检测效果)。
100% ━━━━━━━━━━━━ 进度条 验证集的迭代进度(1/1 表示验证集仅需迭代 1 个批次)。
8.0it/s/0.1s 验证速度 / 耗时 验证过程每秒处理 8 个批次,总耗时 0.1 秒(验证集样本少,耗时短)。

模型性能趋势分析

从第 85→86 轮的数值变化,可得出以下结论:

  1. 训练损失变化:box_loss 和 cls_loss 小幅上升,dfl_loss 小幅下降,整体损失无明显收敛趋势,说明模型在训练集上的拟合效果略有波动(属于训练后期的正常现象)。

  2. 验证精度变化 :精确率、召回率、mAP50 均小幅下降,mAP50-95 微升,整体验证精度略有下滑但幅度极小,未出现大幅震荡或过拟合的迹象。

  3. 数据规模说明:验证集仅 7 张图片、44 个实例,样本量过小会导致验证指标的随机性较强(小幅波动不代表模型性能下降),若需更客观的评估,建议扩充验证集样本数。

10.5.5 结果查看

训练过程中,项目中会出现 run 文件夹。此文件夹主要存放的是模型训练、测试、验证 、预测结果。

run 下结构大致为:

tree 复制代码
runs/
├── train/                     # 【训练阶段】核心目录,每次训练生成递增实验文件夹
│   ├── exp/                   # 第1次训练实验(默认名,自定义name参数可替换,如electric_car_train)
│   │   ├── weights/           # 训练产出的模型权重(核心)
│   │   │   ├── best.pt        # 验证集性能最优权重(部署首选)
│   │   │   └── last.pt        # 训练最后一轮权重(断点续训/微调用)
│   │   ├── args.yaml          # 训练参数全记录(复现训练的依据)
│   │   ├── results.csv        # 训练/验证数值指标(损失、mAP、学习率等,CSV格式)
│   │   ├── results.png        # results.csv的可视化折线图(损失/精度趋势)
│   │   ├── confusion_matrix.png               # 混淆矩阵(类别检测准确率)
│   │   ├── confusion_matrix_normalized.png    # 归一化混淆矩阵(类别不均衡时参考)
│   │   ├── P_curve.png        # 精确率随置信度变化曲线
│   │   ├── R_curve.png        # 召回率随置信度变化曲线
│   │   ├── PR_curve.png       # 精确率-召回率(PR)曲线
│   │   ├── F1_curve.png       # F1值随置信度变化曲线
│   │   ├── labels_correlogram.jpg             # 类别相关性热力图(分析类别共现)
│   │   ├── train_batch0.jpg   # 训练集第0批次数据增强可视化
│   │   ├── val_batch0_labels.jpg              # 验证集第0批次真实标注可视化
│   │   ├── val_batch0_pred.jpg                # 验证集第0批次模型预测可视化
│   │   ├── events.out.tfevents.*              # TensorBoard日志(实时可视化训练过程)
│   │   └── optuna.yaml        # 超参数调优日志(仅开启Optuna时生成,默认无)
│   ├── exp2/                  # 第2次训练实验(自动递增,避免覆盖)
│   └── exp3/                  # 后续训练实验(按需生成)
│
├── val/                       # 【单独验证阶段】手动执行模型验证时生成(训练内嵌验证结果在train/exp中)
│   ├── exp/                   # 第1次单独验证实验
│   │   ├── args.yaml          # 验证参数配置(数据集路径、IOU/置信度阈值等)
│   │   ├── confusion_matrix.png               # 验证集混淆矩阵
│   │   ├── confusion_matrix_normalized.png    # 归一化混淆矩阵
│   │   ├── P_curve.png        # 精确率曲线
│   │   ├── R_curve.png        # 召回率曲线
│   │   ├── PR_curve.png       # PR曲线
│   │   ├── F1_curve.png       # F1曲线
│   │   ├── val_batch0_labels.jpg              # 验证集标注可视化
│   │   ├── val_batch0_pred.jpg                # 验证集预测可视化
│   │   └── events.out.tfevents.*              # TensorBoard验证日志
│   └── exp2/                  # 第2次单独验证实验(自动递增)
│
├── detect/                    # 【预测阶段-AABB】普通轴对齐框检测的预测结果(默认目录)
│   ├── predict/               # 第1次预测结果(自定义name参数可替换,如car_detect_predict)
│   │   ├── 001.jpg            # 预测后可视化图片(带检测框、类别、置信度)
│   │   ├── 002.jpg            # 按需生成,与输入图片一一对应
│   │   ├── test_video.mp4     # 预测后可视化视频(输入为视频时生成)
│   │   ├── labels/            # 预测标注文件(仅开启save_txt=True时生成)
│   │   │   ├── 001.txt        # YOLO格式标注(类别ID + 轴对齐框坐标 + 置信度)
│   │   │   └── 002.txt
│   │   ├── crops/             # 目标裁剪图(仅开启save_crop=True时生成)
│   │   │   ├── car/           # 按类别分类的裁剪图
│   │   │   │   └── 001_crop1.jpg
│   │   │   └── bike/          # 按需生成,与检测类别一一对应
│   │   └── args.yaml          # 预测参数配置(置信度、IOU、输入尺寸等)
│   ├── predict2/              # 第2次预测结果(自动递增)
│   └── predict3/              # 后续预测结果(按需生成)
│
└── obb/                       # 【预测阶段-OBB】定向旋转框检测的预测结果(替代detect,结构与detect完全一致)
    ├── predict/               # 第1次OBB预测结果
    │   ├── 001.jpg            # 预测后可视化图片(带旋转检测框、类别、置信度)
    │   ├── test_video.mp4     # 预测后可视化视频(输入为视频时生成)
    │   ├── labels/            # OBB预测标注文件(仅开启save_txt=True时生成)
    │   │   ├── 001.txt        # OBB格式标注(类别ID + 旋转框参数 + 置信度)
    │   │   └── 002.txt
    │   ├── crops/             # OBB目标裁剪图(仅开启save_crop=True时生成)
    │   │   ├── plane/         # 按类别分类的裁剪图
    │   │   └── ship/          # 按需生成,与OBB检测类别一一对应
    │   └── args.yaml          # OBB预测参数配置
    ├── predict2/              # 第2次OBB预测结果(自动递增)
    └── predict3/              # 后续OBB预测结果(按需生成)

# 可选扩展目录(YOLO11其他任务专属,按需生成)
├── segment/                   # 分割任务:训练/验证/预测结果(结构同detect/train)
└── pose/                      # 姿态估计任务:训练/验证/预测结果(结构同detect/train)

其中weight文件夹下存放的是训练后的yolo模型。分为best.ptlast.pt 两个模型文件。对比如下:

特性 best.pt last.pt
生成依据 验证集性能最优 训练最后一轮的状态
泛化能力 强(对新数据检测效果好) 弱(易过拟合)
核心用途 部署、测试、实际应用 断点续训、模型微调、实验分析
性能稳定性 高(指标最优且稳定) 低(性能受训练后期状态影响)

10.5.5.1 核心图表results.png

在runs目录下对应的批次文件下存在一个results.png 图片,如下图:

说明

results.png图为训练过程监控图。主要包含损失曲线性能指标曲线

损失曲线用于衡量模型拟合效果。

性能指标曲线用于衡量模型检测效果。

损失曲线

x 轴是训练轮次(0-100 轮),y 轴是损失值(越低越好).

  1. train/box_loss :训练集的边界框回归损失。衡量 "预测的目标框" 与 "真实框" 的位置 / 大小误差,曲线持续下降→模型对目标位置的拟合越来越好。
  2. train/cls_loss :训练集的分类损失。衡量 "预测类别" 与 "真实类别" 的误差,曲线持续下降→模型对目标类别的识别越来越准。
  3. train/df_loss :训练集的分布焦点损失。针对目标框位置的分布特性优化的损失,曲线下降后小幅波动→模型对框位置的精细分布学习效果提升。
  4. val/box_loss:验证集边界框回归损失。预测的目标框与真实目标框 的位置 / 大小误差,损失越低→模型在新样本上对目标预测越精准。
  5. val/cls_loss:验证集分类损失。衡量 "预测类别" 与 "真实类别" 的误差。损失越低→模型在新样本上 "识别目标类别" 的准确率越高
  6. val/df_loss:验证集分布焦点损失。损失越低→模型在新样本上对 "边界框分布规律" 的拟合越准确,能进一步提升目标框的回归精度;若该损失波动大,说明模型对边界框分布的学习不够稳定。

性能指标曲线

y 轴是指标值(越高越好).

IoU:计算机视觉中衡量「预测目标区域」与「真实目标区域」重叠程度的核心指标,取值范围为 0~1。IoU 越高,说明预测结果越精准。

IoU = (预测区域 ∩ 真实区域)的面积 / (预测区域 ∪ 真实区域)的面积

即「交集面积 ÷ 并集面积」。

  1. metrics/precision(B):精确率(查准率)。"预测为目标的结果中,实际是目标的比例",曲线上升→模型预测的 "目标" 错误率越来越低。

  2. metrics/recall(B):召回率(查全率)。"实际是目标的样本中,被预测为目标的比例",曲线上升→模型漏检的目标越来越少。

  3. metrics/mAP50(B):IoU=50% 时的平均精度均值。综合 "精确率 + 召回率",衡量模型在 "宽松 IoU 阈值" 下的检测精度,曲线持续上升→模型整体检测效果提升。

  4. metrics/mAP50-95(B):IoU 从 50% 到 95% 的平均精度均值

    更严格的综合指标(覆盖不同 IoU 阈值),曲线上升→模型在 "精准定位" 场景下的效果也在变好。

10.5.5.2 归一化混淆矩阵confusion_matrix_normalized.png

说明

用于展示模型在各类别的分类结果(行 = 预测类别,列 = 真实类别,数值是归一化后的比例)。混淆矩阵的核心是 "预测结果" 与 "真实情况" 的匹配关系。

下面将举例一个异常和一个正常的归一化混淆矩阵

异常归一化混淆矩阵

如下图:

  1. 预测 eBike + 真实 eBike(左上):0.73

    表示真正例(TP)比例。真实是 eBike 的样本中,有 73% 被正确预测为 eBike。

  2. 预测 eBike + 真实 background(右上):1.00

    表示假正例(FP)比例。 真实是背景的样本中,100% 被错误预测为 eBike。

    → 真实是背景的样本中,100% 被错误预测为 eBike。

  3. 预测 background + 真实 eBike(左下):0.27

    表示假负例(FN)比例

    → 真实是 eBike 的样本中,有 27% 被错误预测为背景。

  4. 预测 background + 真实 background(右下):隐含为 0

    表示因为真实 background 的样本已 100% 被预测为 eBike,所以这部分比例是 0(无真正例)。

这个混淆矩阵反映出模型的分类效果很差,核心问题是 "无法区分 eBike 和背景":

  • 对 "background(背景)":所有真实背景都被误判成 eBike(1.00)→ 模型把 "背景" 全当成了目标,完全无法识别背景。
  • 对 "eBike":仅 73% 的真实 eBike 被正确识别,还有 27% 被误判成背景→ 模型对 eBike 的识别也不精准。

出现这种情况的常见原因:

  • 样本问题:比如背景样本数量太少、eBike 与背景的特征(如颜色、轮廓)高度相似;
  • 训练问题:训练轮次不足、类别不平衡(eBike 样本远多于背景)等。

正常归一化混淆矩阵

如下图

对角线上的格子(从左上到右下)代表预测正确的部分,颜色越深、数值越高,说明模型表现越好

无论类别多少,正常的归一化混淆矩阵应该满足以下条件

  1. 主对角线(预测 = 真实)数值高:代表模型对各类别的正确分类率高;
  2. 非对角线(预测≠真实)数值低:代表模型的 "误判(把 A 类当成 B 类)" 很少;
  3. 颜色上:主对角线区域颜色深(接近色条的 1.0),非对角线区域颜色浅(接近色条的 0.0)。

10.6 yolo导出格式说明

YOLO11 的导出基于 Ultralytics 统一的export接口,格式可分为「原生研发格式」「通用中间格式」「硬件 / 框架专属格式」三大类,覆盖从研发到部署的全流程。

格式类型 后缀 / 标识 核心作用 典型使用场景
原生研发格式 .pt (PyTorch) 保存模型完整信息(权重、结构、优化器、超参数),支持训练 / 微调 / 验证 模型研发阶段(训练、微调、实验迭代)、PyTorch 环境下的推理测试、权重备份
通用中间格式 .onnx 跨框架标准化格式,是绝大多数部署格式的 "桥梁",支持静态 / 动态批处理 作为中间转换格式(转 TensorRT/OpenVINO/TF Lite)、ONNX Runtime 通用推理(云端 / 边缘)
PyTorch 轻量化 TorchScript (.jit/.pt) 剥离 Python 依赖,生成 C++ 可直接调用的序列化模型,提升 PyTorch 推理效率 PyTorch C++ 部署(高性能服务器、嵌入式 Linux 设备)、脱离 Python 环境的推理
英伟达专属 TensorRT (.engine) 层融合 + 精度校准(FP16/INT8)+ 张量并行,最大化 NVIDIA GPU 推理速度 云端 GPU 服务器、自动驾驶车载 GPU、安防监控视频流实时检测(高吞吐 / 低延迟)
英特尔专属 OpenVINO (.xml/.bin) 适配 Intel CPU/iGPU/ 神经计算棒(NCS),低延迟 / 高吞吐量优化 英特尔硬件边缘部署(工业摄像头、智能门禁、嵌入式工控机)、低功耗桌面推理
苹果生态 CoreML (.mlmodel/.mlpackage) 适配 iOS/macOS/watchOS,调用苹果 Neural Engine 硬件加速 iOS App 实时检测(手机摄像头识别)、macOS 本地推理、苹果手表 / 平板轻量化部署
移动端 / 嵌入式 TF Lite (.tflite) 轻量化量化(INT8/FP16),减小体积、降低算力消耗 Android 设备(手机 / 车载)、树莓派 / ESP32、IoT 智能摄像头(低功耗场景)
国产轻量化框架 NCNN/MNN 适配安卓端高性能推理,支持自定义算子,灵活性优于 TF Lite 安卓端工业级检测(如扫码枪、智能终端)、嵌入式设备低延迟推理
跨平台推理 ONNX Runtime 基于 ONNX 格式的通用推理引擎,适配 CPU/GPU/ 移动端 无硬件专属优化的通用场景(如中小规模云端服务、桌面应用)
10.6.1 导出java项目使用

导出给java+spring boot项目使用方案:YOLO11.pt → 导出ONNX → Spring Boot集成ONNX Runtime Java → 封装推理工具类 → 提供HTTP接口

xml 复制代码
<dependencies>
    <!-- Spring Boot Web核心依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- ONNX Runtime Java SDK(核心) -->
    <dependency>
        <groupId>com.microsoft.onnxruntime</groupId>
        <artifactId>onnxruntime</artifactId>
        <!-- 版本建议选1.15+,兼容YOLO11的ONNX算子 -->
        <version>1.16.3</version>
        <!-- 按需选择系统包:windows-x86_64/linux-x86_64/macosx-x86_64 -->
        <classifier>linux-x86_64</classifier>
        <!-- 若需GPU支持,替换为:linux-x86_64-gpu -->
        <!-- 
			classifier可选值:见下表
 		-->
    </dependency>

    <!-- 图片处理依赖(预处理/后处理) -->
    <dependency>
        <groupId>net.coobird</groupId>
        <artifactId>thumbnailator</artifactId>
        <version>0.4.19</version>
    </dependency>
    <dependency>
        <groupId>org.bytedeco</groupId>
        <artifactId>opencv-platform</artifactId>
        <version>4.8.0-1.5.9</version>
    </dependency>
</dependencies>

10.6.1.1 classifier可选值表

Classifier 值 适用场景 备注
windows-x86_64 Windows 64 位(Intel/AMD CPU) 最常用的 Windows 纯 CPU 版本
windows-x86_64-gpu Windows 64 位 + NVIDIA GPU 需安装 CUDA 11.8+ + cuDNN 8.9+
linux-x86_64 Linux 64 位(Intel/AMD CPU,如 CentOS/Ubuntu) 云服务器 / 工控机首选纯 CPU 版本
linux-x86_64-gpu Linux 64 位 + NVIDIA GPU 云端 GPU 服务器(如阿里云 / 腾讯云 GPU 实例)
linux-aarch64 Linux ARM64 位(如华为鲲鹏、ARM 服务器) 纯 CPU 版本,适配 ARM 架构服务器
linux-aarch64-gpu Linux ARM64 + NVIDIA Jetson(AGX Orin) 边缘 GPU 设备(如自动驾驶车载终端)
macosx-x86_64 macOS Intel 芯片(64 位) 旧款 Mac 电脑(Intel 处理器)
macosx-aarch64 macOS ARM64 位(M1/M2/M3 芯片) 新款 Mac 电脑(苹果自研芯片),仅支持 CPU
android-arm64 安卓 ARM64 设备(如手机 / 平板) 移动端部署(需搭配 Android 工程)
ios-arm64 iOS ARM64 设备(iPhone/iPad) iOS 端部署(需搭配 Xcode 工程)

10.7 yolo预测

使用训练好的模型bast.pt进行预测。

依赖

shell 复制代码
pip install opencv-python numpy

使用以下脚本进行检测,创建predict.py将以下代码写入文件,在main 中修改参数,并运行即可。

python 复制代码
# -*- coding: utf-8 -*-
from ultralytics import YOLO
import os
import cv2
import numpy as np

"""
模型预测
"""
def is_img_video(file_path):
    """
    判断文件是图片还是视频
    :param file_path:
    :return:
    """
    image_exts = {'.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.tif', '.webp'}
    video_exts = {'.mp4', '.avi', '.flv', '.mkv', '.mov', '.wmv'}
    _, ext = os.path.splitext(file_path)
    ext = ext.lower()
    if ext in image_exts:
        return 'image'
    elif ext in video_exts:
        return 'video'
    else:
        return 'other'


def predict_img(source, modelName, conf, show):
    """
    模型预测-图片
    """
    # 加载模型
    model = YOLO(modelName)
    results = model.predict(source, save=True, save_txt=True, conf=conf)
    for result in results:
        # 显示预测结果
        if show:
            result.show()
        if result.boxes is not None and len(result.boxes.cls) > 0:
            print(
                f"常规边界框检测结果: 检测到的目标类别:{result.boxes.cls},各目标的置信度:{result.boxes.conf},目标的数量:{len(result.boxes.cls)}")
        elif result.obb is not None and len(result.obb.cls) > 0:
            print(
                f"OBB检测结果: 检测到的目标类别:{result.obb.cls},各目标的置信度:{result.obb.conf},目标的数量:{len(result.obb.cls)}")
        else:
            print("该图像中未检测到任何目标")


def predict_video(source, modelName, conf, show):
    """
    模型预测-视频
    :param source: 视频路径
    :param modelName: 模型路径
    :param conf: 置信度
    :param show: 是否显示预测过程
    :return:
    """
    # 加载模型
    model = YOLO(modelName)
    results = model.predict(source, save=True, save_txt=True, conf=conf, stream=True)
    for frame_count, result in enumerate(results):

        if result.boxes is not None and len(result.boxes.cls) > 0:
            print(
                f"常规边界框检测结果: 检测到的目标类别:{result.boxes.cls},各目标的置信度:{result.boxes.conf},目标的数量:{len(result.boxes.cls)}")
        elif result.obb is not None and len(result.obb.cls) > 0:
            print(
                f"OBB检测结果: 检测到的目标类别:{result.obb.cls},各目标的置信度:{result.obb.conf},目标的数量:{len(result.obb.cls)}")
        else:
            print("该图像中未检测到任何目标")

        if show:
            plotted_result = result.plot()  # 绘制检测框
            cv2.imshow('video predict view', plotted_result)

    # 按'q'键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        cv2.destroyAllWindows()
        print("退出视频预测!")
        exit()

    # 释放资源
    cv2.destroyAllWindows()
    print("视频检测完成!")


if __name__ == '__main__':
    # 目标资源路径,修改为实际的资源路径
    source = "video.mp4"
    # 模型路径,修改为实际的模型路径
    modelName = r"D:\python\Project\yolo\yolo\demo1\runs\obb\demo13\weights\best.pt"
    # 是否显示预测过程
    show = True
    # 设置置信度,取值[0-1],默认0.5
    conf = 0.5

    # 判断是否是图片还是视频
    file_type = is_img_video(source)
    if file_type == 'other':
        print("请输入正确的图片或者视频路径")
        exit()
    if file_type == 'image':
        predict_img(source, modelName, conf, show)
    elif file_type == 'video':
        predict_video(source, modelName, conf, show)

上面代码运行结果如下:

shell 复制代码
video 1/1 (frame 5457/5459) D:\python\Project\yolo\yolo\demo1\video.mp4: 640x320 8 eBikes, 13.1ms
OBB检测结果: 检测到的目标类别:tensor([0., 0., 0., 0., 0., 0., 0., 0.], device='cuda:0'),各目标的置信度:tensor([0.8101, 0.7884, 0.7800, 0.7570, 0.7442, 0.7366, 0.7122, 0.6200], device='cuda:0'),目标的数量:8

video 1/1 (frame 5458/5459) D:\python\Project\yolo\yolo\demo1\video.mp4: 640x320 6 eBikes, 12.9ms
OBB检测结果: 检测到的目标类别:tensor([0., 0., 0., 0., 0., 0.], device='cuda:0'),各目标的置信度:tensor([0.8141, 0.7760, 0.7568, 0.6947, 0.6112, 0.5883], device='cuda:0'),目标的数量:6

video 1/1 (frame 5459/5459) D:\python\Project\yolo\yolo\demo1\video.mp4: 640x320 6 eBikes, 13.1ms
OBB检测结果: 检测到的目标类别:tensor([0., 0., 0., 0., 0., 0.], device='cuda:0'),各目标的置信度:tensor([0.8238, 0.8084, 0.7378, 0.7003, 0.6968, 0.6726], device='cuda:0'),目标的数量:6

Speed: 1.6ms preprocess, 14.8ms inference, 2.7ms postprocess per image at shape (1, 3, 640, 320)
Results saved to D:\python\Project\yolo\yolo\demo1\runs\obb\predict
3904 labels saved to D:\python\Project\yolo\yolo\demo1\runs\obb\predict\labels
视频检测完成!

预测结果保存在run下的predict文件夹中,predict命名方式:predict+预测批次递增序号

10.7.1 预测结果属性介绍

下面表格将介绍:results = model.predict() 的返回值中的属性

主属性名称 子属性 / 值 数据类型 具体说明 适用任务
boxes(目标检测框) xyxy torch.Tensor 形状为 (N, 4),N 为检测目标数;每行对应 (x1, y1, x2, y2),即目标框像素级左上角 / 右下角坐标 (如 [100, 50, 200, 150] 目标检测
xywh torch.Tensor 形状为 (N, 4);每行对应 (x_center, y_center, width, height),即目标框像素级中心坐标 + 宽高 目标检测
xyn torch.Tensor 形状为 (N, 4);归一化(0-1)的 xyxy 坐标,基于原始图像尺寸(如 x1=0.2 代表原图宽度的 20%) 目标检测
whn torch.Tensor 形状为 (N, 4);归一化(0-1)的 xywh 坐标,宽高均相对于原图尺寸 目标检测
conf torch.Tensor 形状为 (N,);每个目标框的置信度(0-1),代表模型对 "该框是目标" 的置信程度 目标检测
cls torch.Tensor 形状为 (N,);每个目标框的类别 ID(整数),可通过 names[cls] 映射为类别名称 目标检测
id torch.Tensor/None 形状为 (N,);仅跟踪任务(track=True)返回,代表目标的唯一跟踪 ID;非跟踪任务为 None 目标跟踪
is_tracked bool/None 标记是否开启目标跟踪,跟踪模式为 True,否则为 None 目标跟踪
cpu() 方法 返回所有框数据到 CPU 内存的张量(默认可能在 GPU) 目标检测
numpy() 方法 将框数据转换为 numpy.ndarray 格式,便于后续处理 目标检测
json() 方法 将框信息转换为 JSON 字符串(包含坐标、置信度、类别),便于存储 / 传输 目标检测
masks(实例分割掩码) data torch.Tensor 形状为 (N, H, W),H/W 为预处理后图像尺寸;二进制掩码矩阵(1 = 目标区域,0 = 背景),N 为目标数 实例分割
xy list[numpy.ndarray] 列表长度 = N,每个元素为 (M, 2) 的数组;M 为掩码轮廓的像素级坐标点(x,y) 实例分割
segments list[numpy.ndarray] 列表长度 = N,每个元素为 (M, 2) 的数组;掩码的多边形分割点(简化版轮廓) 实例分割
xyn list[numpy.ndarray] 归一化(0-1)的 xy 轮廓坐标,基于原始图像尺寸 实例分割
segments_n list[numpy.ndarray] 归一化的 segments 分割点 实例分割
probs(分类概率) data torch.Tensor 形状为 (num_classes,);所有类别的概率分布(0-1),总和≈1 图像分类
top1 int 最高置信度对应的类别 ID(整数) 图像分类
top1conf torch.Tensor 形状为 (1,)top1 类别的置信度值(0-1) 图像分类
top5 list[int] 前 5 高置信度的类别 ID 列表,按置信度降序排列 图像分类
top5conf torch.Tensor 形状为 (5,)top5 类别对应的置信度值(0-1) 图像分类
numpy() 方法 data 转换为 numpy.ndarray 格式的概率数组 图像分类
keypoints(姿态关键点) xy torch.Tensor 形状为 (N, K, 2),K 为关键点数量(如 COCO-Pose 为 17);每个元素为 (x,y) 像素级关键点坐标 姿态估计
conf torch.Tensor 形状为 (N, K);每个关键点的置信度(0-1),代表 "该关键点有效" 的置信程度 姿态估计
data torch.Tensor 形状为 (N, K, 3);合并 xyconf,即 (x, y, conf) 张量 姿态估计
xyn torch.Tensor 归一化(0-1)的 xy 关键点坐标,基于原始图像尺寸 姿态估计
confn torch.Tensor 归一化(0-1)的 conf 关键点置信度(可选) 姿态估计
obb(旋转边界框) xywhr torch.Tensor 形状为 (N, 5);每行对应 (x_center, y_center, width, height, angle),即像素级中心坐标、宽高、旋转角度(弧度,范围 [-π/2, π/2] 旋转目标检测
xyxyxyxy torch.Tensor 形状为 (N, 8);旋转框 4 个角点的像素级坐标,展平为 (x1,y1,x2,y2,x3,y3,x4,y4) 旋转目标检测
conf torch.Tensor 形状为 (N,);每个旋转框的置信度(0-1) 旋转目标检测
cls torch.Tensor 形状为 (N,);每个旋转框的类别 ID(整数) 旋转目标检测
xynwhr torch.Tensor 归一化(0-1)的 xywhr 坐标,基于原始图像尺寸 旋转目标检测
orig_img(原始图像) -(无自属性) numpy.ndarray 形状为 (H, W, C),通道顺序为 BGR(OpenCV 默认);与输入的原始图像完全一致(未缩放 / 预处理) 所有任务
orig_shape(原始尺寸) -(无自属性) tuple 格式为 (height, width);原始图像的分辨率(如 (720, 1280) 所有任务
img(预处理图像) -(无自属性) torch.Tensor 形状为 (3, H, W);模型推理的输入张量,已完成归一化、缩放、通道转换(RGB)、批处理等预处理 所有任务
img_shape(预处理尺寸) -(无自属性) tuple 格式为 (height, width)img 张量的分辨率(预处理后的尺寸) 所有任务
names(类别映射) -(无自属性) dict 键为类别 ID(int),值为类别名称(str);如 {0: 'person', 1: 'car'},用于将 cls 转换为易读名称 所有任务
path(文件路径) -(无自属性) str 输入图像 / 视频的本地文件路径;若输入为张量 / 字节流,该值为 None 所有任务(文件输入)
speed(推理速度) preprocess float 预处理阶段耗时,单位为毫秒(ms);包含图像缩放、归一化等操作耗时 所有任务
inference float 模型推理阶段耗时,单位为毫秒(ms);即网络前向传播的耗时 所有任务
postprocess float 后处理阶段耗时,单位为毫秒(ms);包含 NMS、坐标转换、掩码生成等操作耗时 所有任务
preds(原始预测) -(无自属性) torch.Tensor 模型未经过后处理的原始输出张量;形状随任务变化(如检测任务为 (N, num_classes+5, H/8, W/8)),可用于自定义后处理 所有任务
verbose(打印控制) -(无自属性) bool 控制推理结果的打印详细程度:True 打印完整检测信息,False 仅输出核心结果 所有任务

10.8 yolo 区域统计

YOLO 区域统计是指在自定义的感兴趣区域(Region of Interest, ROI)内,利用 YOLO 模型的目标检测结果,对区域内的目标进行数量计数、类别分布、密度分析、动态轨迹统计等操作的技术。

目标匹配判定常用规则有两种:

  • 中心判定:目标边界框的中心点落在 ROI 内,即视为区域内目标(最常用,抗遮挡性好)。
  • 整体判定:目标边界框完全落在 ROI 内,才视为区域内目标(适用于高精度要求的场景)。

YOLO 区域统计的常见统计维度:

  • 数量统计 :区域内目标总数量、各类别目标数量,动态视频中目标进出次数(结合目标追踪算法,如 ByteTrack,避免重复计数)
  • 密度统计:区域内目标密度 = 目标数量 / ROI 面积(单位:个 / 像素 ²),适用于拥堵分析(如交通拥堵、客流密集度)。
  • 占比统计:某类别在区域内的占比 = 该类别数量 / 区域内总目标数,适用于工业质检(缺陷产品占比)、交通分析(非机动车占比)。
  • 动态轨迹统计:目标在区域内的停留时间、移动速度(结合帧差和目标追踪),适用于安防(可疑目标滞留检测)。
  • 多区域联合统计:对多个 ROI 分别统计后,计算区域间的目标流动量(如路口不同车道的车流量对比)。

YOLO 区域统计的关键注意事项:

  1. ROI 精准划定
    • 根据业务场景调整 ROI 形状(矩形 / 多边形),避免 ROI 包含无关背景
    • 视频流中若摄像头固定,ROI 只需一次划定;若摄像头移动,需结合图像配准动态更新 ROI。
  2. 目标匹配规则选择
    • 优先使用中心判定(抗遮挡,适合大部分场景)
    • 高精度场景(如工业质检)使用整体判定,但需注意目标遮挡导致的漏统计
  3. 遮挡处理
    • 结合目标追踪算法(如 ByteTrack、DeepSORT)对遮挡目标进行 ID 关联,避免漏统计 / 重复统计
    • 提高 YOLO 模型的检测精度(如使用更大的模型 yolo11l.pt),减少遮挡导致的检测失败。
相关推荐
zttbee13 分钟前
vue学习(白话功能版)
前端·vue.js·学习·前端框架
北风toto19 分钟前
UML(统一建模语言)详细笔记
笔记·uml·软件设计师
ouynagda32 分钟前
Linux 进程与线程学习笔记
linux·笔记·学习
手握风云-1 小时前
一条消息的旅程:RabbitMQ 学习与实践(四)
学习
GlueNa2SiO39 小时前
03-Flask模板引擎Jinja2详解
笔记·python·flask
Capricorn198810 小时前
解决全网抄 Karpathy 导致的 LLM Wiki 污染?基于知芽 Notebook Skill 的 raw/ 笔记法排障指南
大数据·论文阅读·人工智能·笔记·论文笔记
壹玖玖肆11 小时前
openGauss使用笔记
笔记
宵时待雨11 小时前
linux笔记归纳17:传输层协议UDP
linux·笔记·udp