环境配置
一、安装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官网
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
使用以下脚本进行依赖运行监测:
4.2 CPU版本
注意: 安装CPU版本前先确认当前环境是否已经安装了GPU版本,若已经安装过GPU版本了就不要安装CPU版本了,防止包冲突导致的程序异常现象
CPU版本的安装和GPU类似。区别如下:
-
不需要检查CUDA版本
-
安装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
- 准备数据集
- 标注数据集
- 训练
- 验证
10.1 准备数据集
使用公开数据集或者视频抽帧等方式获取数据集。但注意,数据集应该包括各种状态,例如正常的图片数据、旋转后的图片上数据、背景不一致的图片数据、目标与背景相似度高、缩放比例不一样的、不同天气、白天黑夜的 等类型图片数据等。
10.2 数据集重命名
数据集文件命名应该使用非中文且具有顺序的方式。推荐使用整数的方式命名。数据集重命名可以使用 数据集批量重命名 中的脚本。
10.3 数据集标注
使用数据标注工具将重命名的数据集合进行标注。
标注工具使用参考:图片标注工具
标注数据时尽量将标注框包围住图片中的对象。
10.3.1 标注数据介绍
yolo可以识别的标注结果文件为.txt 。
classes.txt:该文件记录了本次数据集标注的类别。一个类别为一行。
XXXX.txt :该文件名称与所标注的图片名称一致。记录对应图片的标注信息内容,
内容说明:
格式:类别序号 中心点的x坐标 中心点的y坐标 宽度 高度
- 每一行表示此图片中标注的一个物体
- 类别序号:与classes.txt文件中类别从上到下的排序对应,0表示classes.txt中的第一个类别。
- 中心点的x坐标:表示目标框中心点的x坐标,相对于图像宽度的比例值,范围在0到1之间
- 中心点的y坐标:表示目标框中心点的y坐标,相对于图像高度的比例值,范围在0到1之间
- 宽度:表示目标框宽度,相对于图像宽度的比例值,范围在0到1之间
- 高度:表示目标框高度,相对于图像高度的比例值,范围在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% | 大规模工业级任务(如自动驾驶、海量遥感影像) |
数据集划分应该遵循随机抽样和分层抽样原则。
可以使用数据集划分脚本自动划分数据集:数据集划分 注意事项如下:
- 使用数据集划分工具之前先要将数据集文件进行重命名。
- 图片文件和数据集标注文件数量必须一致、数量一致。可以使用脚本进行检测:数据集校验
- 检验通过后才可以进行数据集划分。
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.pt和last.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 轮的数值变化,可得出以下结论:
-
训练损失变化:box_loss 和 cls_loss 小幅上升,dfl_loss 小幅下降,整体损失无明显收敛趋势,说明模型在训练集上的拟合效果略有波动(属于训练后期的正常现象)。
-
验证精度变化 :精确率、召回率、mAP50 均小幅下降,mAP50-95 微升,整体验证精度略有下滑但幅度极小,未出现大幅震荡或过拟合的迹象。
-
数据规模说明:验证集仅 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.pt 和 last.pt 两个模型文件。对比如下:
| 特性 | best.pt |
last.pt |
|---|---|---|
| 生成依据 | 验证集性能最优 | 训练最后一轮的状态 |
| 泛化能力 | 强(对新数据检测效果好) | 弱(易过拟合) |
| 核心用途 | 部署、测试、实际应用 | 断点续训、模型微调、实验分析 |
| 性能稳定性 | 高(指标最优且稳定) | 低(性能受训练后期状态影响) |
10.5.5.1 核心图表results.png
在runs目录下对应的批次文件下存在一个results.png 图片,如下图:

说明
results.png图为训练过程监控图。主要包含损失曲线 和性能指标曲线
损失曲线用于衡量模型拟合效果。
性能指标曲线用于衡量模型检测效果。
损失曲线
x 轴是训练轮次(0-100 轮),y 轴是损失值(越低越好).
- train/box_loss :训练集的边界框回归损失。衡量 "预测的目标框" 与 "真实框" 的位置 / 大小误差,曲线持续下降→模型对目标位置的拟合越来越好。
- train/cls_loss :训练集的分类损失。衡量 "预测类别" 与 "真实类别" 的误差,曲线持续下降→模型对目标类别的识别越来越准。
- train/df_loss :训练集的分布焦点损失。针对目标框位置的分布特性优化的损失,曲线下降后小幅波动→模型对框位置的精细分布学习效果提升。
- val/box_loss:验证集边界框回归损失。预测的目标框与真实目标框 的位置 / 大小误差,损失越低→模型在新样本上对目标预测越精准。
- val/cls_loss:验证集分类损失。衡量 "预测类别" 与 "真实类别" 的误差。损失越低→模型在新样本上 "识别目标类别" 的准确率越高
- val/df_loss:验证集分布焦点损失。损失越低→模型在新样本上对 "边界框分布规律" 的拟合越准确,能进一步提升目标框的回归精度;若该损失波动大,说明模型对边界框分布的学习不够稳定。
性能指标曲线
y 轴是指标值(越高越好).
IoU:计算机视觉中衡量「预测目标区域」与「真实目标区域」重叠程度的核心指标,取值范围为 0~1。IoU 越高,说明预测结果越精准。
IoU = (预测区域 ∩ 真实区域)的面积 / (预测区域 ∪ 真实区域)的面积
即「交集面积 ÷ 并集面积」。
-
metrics/precision(B):精确率(查准率)。"预测为目标的结果中,实际是目标的比例",曲线上升→模型预测的 "目标" 错误率越来越低。
-
metrics/recall(B):召回率(查全率)。"实际是目标的样本中,被预测为目标的比例",曲线上升→模型漏检的目标越来越少。
-
metrics/mAP50(B):IoU=50% 时的平均精度均值。综合 "精确率 + 召回率",衡量模型在 "宽松 IoU 阈值" 下的检测精度,曲线持续上升→模型整体检测效果提升。
-
metrics/mAP50-95(B):IoU 从 50% 到 95% 的平均精度均值
更严格的综合指标(覆盖不同 IoU 阈值),曲线上升→模型在 "精准定位" 场景下的效果也在变好。
10.5.5.2 归一化混淆矩阵confusion_matrix_normalized.png
说明
用于展示模型在各类别的分类结果(行 = 预测类别,列 = 真实类别,数值是归一化后的比例)。混淆矩阵的核心是 "预测结果" 与 "真实情况" 的匹配关系。
下面将举例一个异常和一个正常的归一化混淆矩阵
异常归一化混淆矩阵
如下图:

-
预测 eBike + 真实 eBike(左上):0.73
表示真正例(TP)比例。真实是 eBike 的样本中,有 73% 被正确预测为 eBike。
-
预测 eBike + 真实 background(右上):1.00
表示假正例(FP)比例。 真实是背景的样本中,100% 被错误预测为 eBike。
→ 真实是背景的样本中,100% 被错误预测为 eBike。
-
预测 background + 真实 eBike(左下):0.27
表示假负例(FN)比例
→ 真实是 eBike 的样本中,有 27% 被错误预测为背景。
-
预测 background + 真实 background(右下):隐含为 0
表示因为真实 background 的样本已 100% 被预测为 eBike,所以这部分比例是 0(无真正例)。
这个混淆矩阵反映出模型的分类效果很差,核心问题是 "无法区分 eBike 和背景":
- 对 "background(背景)":所有真实背景都被误判成 eBike(1.00)→ 模型把 "背景" 全当成了目标,完全无法识别背景。
- 对 "eBike":仅 73% 的真实 eBike 被正确识别,还有 27% 被误判成背景→ 模型对 eBike 的识别也不精准。
出现这种情况的常见原因:
- 样本问题:比如背景样本数量太少、eBike 与背景的特征(如颜色、轮廓)高度相似;
- 训练问题:训练轮次不足、类别不平衡(eBike 样本远多于背景)等。
正常归一化混淆矩阵
如下图

对角线上的格子(从左上到右下)代表预测正确的部分,颜色越深、数值越高,说明模型表现越好
无论类别多少,正常的归一化混淆矩阵应该满足以下条件
- 主对角线(预测 = 真实)数值高:代表模型对各类别的正确分类率高;
- 非对角线(预测≠真实)数值低:代表模型的 "误判(把 A 类当成 B 类)" 很少;
- 颜色上:主对角线区域颜色深(接近色条的 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);合并 xy 和 conf,即 (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 区域统计的关键注意事项:
- ROI 精准划定
- 根据业务场景调整 ROI 形状(矩形 / 多边形),避免 ROI 包含无关背景
- 视频流中若摄像头固定,ROI 只需一次划定;若摄像头移动,需结合图像配准动态更新 ROI。
- 目标匹配规则选择
- 优先使用中心判定(抗遮挡,适合大部分场景)
- 高精度场景(如工业质检)使用整体判定,但需注意目标遮挡导致的漏统计
- 遮挡处理
- 结合目标追踪算法(如 ByteTrack、DeepSORT)对遮挡目标进行 ID 关联,避免漏统计 / 重复统计
- 提高 YOLO 模型的检测精度(如使用更大的模型 yolo11l.pt),减少遮挡导致的检测失败。