tb_yolo 上篇用于跑通测试数据集链路:在 Windows 上训练 YOLOv5,导出 ONNX,转换为 ncnn 的 param/bin,再通过 example/yolo_ncnn_app 部署到久久派测试。
测试数据集训练 -> 导出 ONNX -> 转换 ncnn -> example/yolo_ncnn_app 部署测试
之前不在 Linux 虚拟机中训练,是因为 VMware 虚拟机无法直接使用宿主机 NVIDIA GPU,目标检测训练又强依赖 GPU。因此训练和转换在 Windows 宿主机完成,开发板只做推理。
一、项目结构与环境准备
1.1 目录职责
当前仓库根目录:
E:\SmartCar\loongson_2k300_lib
与本流程相关的目录:
tb_yolo/
configs/target_board.names # 类别名,一行一个类别
configs/target_board.yaml # YOLOv5 数据集配置
dataset/images/train/ # 测试训练集图片
dataset/images/val/ # 测试验证集图片
dataset/labels/train/ # 测试训练集标签
dataset/labels/val/ # 测试验证集标签
models/pretrained/yolov5n.pt # 默认迁移学习权重
models/demo/best.pt # 演示 PyTorch 权重
models/demo/best.onnx # 演示 ONNX
models/demo/best.param # 演示 ncnn 结构文件,转换后生成
models/demo/best.bin # 演示 ncnn 权重文件,转换后生成
scripts/setup_env_windows.ps1 # Windows 依赖初始化
scripts/train_yolov5_windows.ps1 # Windows 训练入口
scripts/export_onnx_windows.ps1 # ONNX 导出入口
scripts/export_ncnn_windows.ps1 # ONNX 转 ncnn 入口
vendor/yolov5/ # YOLOv5 源码
example/yolo_ncnn_app/ # 久久派 ncnn 离线推理示例
scripts/build_ncnn_loongarch.sh # 下载并交叉编译 ncnn
cross_lib/ncnn/ # ncnn 安装目录,脚本生成
1.2 日常操作目录
tb_yolo 相关命令默认在:
PS E:\SmartCar\loongson_2k300_lib> cd .\tb_yolo
example 部署命令默认在仓库根目录或 example 目录执行,文档会分别写清楚。
1.3 初始化 Windows 训练环境
必须使用 Python 3.10 或 Python 3.11,不要使用 Python 3.14。
执行:
PS E:\SmartCar\loongson_2k300_lib\tb_yolo> powershell -ExecutionPolicy Bypass -File .\scripts\setup_env_windows.ps1 -InstallCudaTorch
成功后确认:
torch: 2.11.0+cu128
CUDA available: True
CUDA device: NVIDIA GeForce RTX 5060 Laptop GPU
CUDA tensor test: 1.0
只看 torch.cuda.is_available() 不够,必须确认 CUDA 张量能实际创建和同步。
1.4 检查类别配置
测试数据集当前类别文件:
configs/target_board.names
内容:
Mouse
Printer
drill
Wrench
Screwdriver
类别顺序必须同时匹配:
YOLO 标签 class_id
configs/target_board.yaml
example/yolo_ncnn_app/main.cpp 中的 kClassNames
二、使用测试数据集训练和转换
2.1 测试数据集位置
测试数据集已经放在:
tb_yolo/dataset/images/train
tb_yolo/dataset/images/val
tb_yolo/dataset/labels/train
tb_yolo/dataset/labels/val
本场景只用于验证流程,不代表最终上车效果。
2.2 启动训练
执行:
PS E:\SmartCar\loongson_2k300_lib\tb_yolo> powershell -ExecutionPolicy Bypass -File .\scripts\train_yolov5_windows.ps1 --name exp_test_gpu
默认核心参数:
| 参数 | 默认值 | 说明 |
|---|---|---|
--weights |
models/pretrained/yolov5n.pt |
轻量模型,适合开发板部署 |
--data |
configs/target_board.yaml |
数据集配置 |
--epochs |
150 |
训练轮数 |
--batch-size |
32 |
显存不足时降低 |
--imgsz |
96 |
输入尺寸,后续导出和推理必须一致 |
--device |
0 |
使用第 0 块 GPU |
--project |
outputs/train |
输出根目录 |
--name |
命令指定 | 本次实验目录名 |
训练完成后优先使用:
outputs/train/exp_test_gpu/weights/best.pt
2.3 查看训练结果
重点查看:
outputs/train/exp_test_gpu/results.png
outputs/train/exp_test_gpu/confusion_matrix.png
outputs/train/exp_test_gpu/weights/best.pt
曲线含义:
| 曲线 | 含义 | 判断方法 |
|---|---|---|
train/box_loss |
训练集框回归损失 | 越低越好,应逐步下降 |
train/obj_loss |
训练集目标置信度损失 | 越低越好,反映是否能找到目标 |
train/cls_loss |
训练集分类损失 | 越低越好,类别少时通常下降较快 |
val/box_loss |
验证集框回归损失 | 如果训练下降但验证上升,可能过拟合 |
val/obj_loss |
验证集目标置信度损失 | 验证集稳定下降更可信 |
val/cls_loss |
验证集分类损失 | 类别混淆时会偏高 |
metrics/precision |
预测为目标的结果有多少是真的 | 误检多时偏低 |
metrics/recall |
真实目标有多少被检出 | 漏检多时偏低 |
metrics/mAP_0.5 |
IoU=0.5 下的检测精度 |
判断是否大体能检出 |
metrics/mAP_0.5:0.95 |
更严格的综合精度 | 判断框是否贴合 |
2.4 本机检测验证
执行:
PS E:\SmartCar\loongson_2k300_lib\tb_yolo> python .\vendor\yolov5\detect.py --weights .\outputs\train\exp_test_gpu\weights\best.pt --source .\dataset\images\val --data .\configs\target_board.yaml --imgsz 96 --conf-thres 0.25 --project .\outputs\detect --name exp_test_val
输出图片在:
outputs/detect/exp_test_val
图片框上的数字是置信度,例如 0.91 表示模型认为该框属于对应类别的综合置信度约为 91%。
2.5 导出 ONNX
执行:
PS E:\SmartCar\loongson_2k300_lib\tb_yolo> powershell -ExecutionPolicy Bypass -File .\scripts\export_onnx_windows.ps1 --weights .\outputs\train\exp_test_gpu\weights\best.pt --imgsz 96 --copy-demo
生成:
outputs/train/exp_test_gpu/weights/best.onnx
models/demo/best.onnx
models/demo/best.pt
--imgsz 必须与训练时一致。
2.6 使用 Netron 检查 ONNX
Netron 是神经网络模型结构查看工具,用来确认输入输出,不负责训练或推理。
网页版:
https://netron.app
本地安装:
PS E:\SmartCar\loongson_2k300_lib\tb_yolo> pip install netron
PS E:\SmartCar\loongson_2k300_lib\tb_yolo> netron .\models\demo\best.onnx
重点确认:
输入节点:images
输入尺寸:float32[1,3,96,96]
输出节点:output0
输出维度:float32[1,N,10]
这里 10 = 5 个类别 + 5。
2.7 转换为 ncnn 模型
先准备 ncnn 的转换工具:
tb_yolo/tools/ncnn/onnx2ncnn.exe
tb_yolo/tools/ncnn/ncnnoptimize.exe
也可以把这两个工具加入 PATH。
执行:
PS E:\SmartCar\loongson_2k300_lib\tb_yolo> powershell -ExecutionPolicy Bypass -File .\scripts\export_ncnn_windows.ps1 --onnx .\models\demo\best.onnx --copy-demo
生成:
models/demo/best.param
models/demo/best.bin
best.param 是网络结构,best.bin 是权重。久久派上使用这两个文件,不再直接加载 best.onnx。
三、编译 ncnn 和部署到久久派
3.1 编译 ncnn 到 cross_lib
在能运行 bash、git、cmake 和仓库交叉工具链的环境中执行:
./scripts/build_ncnn_loongarch.sh
脚本会从 https://github.com/Tencent/ncnn.git 下载 Tencent/ncnn 源码,使用:
cross_lib/loongarch64-linux-gnu-gcc13.3
安装到:
cross_lib/ncnn
cross_lib/src/ 和 cross_lib/build/ 是源码和中间构建目录,已加入 .gitignore。需要固定源码版本时,可在运行前设置 NCNN_GIT_REF,例如 NCNN_GIT_REF=20250503 ./scripts/build_ncnn_loongarch.sh。
3.2 编译 yolo_ncnn_app
在仓库根目录执行:
cd example/yolo_ncnn_app
make clean
make
默认依赖:
cross_lib/ncnn
cross_lib/opencv-4.10.0
cross_lib/loongarch64-linux-gnu-gcc13.3
yolo_ncnn_app 使用 ncnn 推理,使用 OpenCV 读取图片、缩放和保存结果,不链接 libopencv_dnn。
3.3 一键部署运行
在仓库根目录执行:
cd example
./build_deploy_run.sh --app yolo_ncnn_app --deploy root@172.23.17.235 -- --param best.param --bin best.bin --image test.jpg --output result.jpg
脚本会自动:
编译 example/yolo_ncnn_app/main
上传可执行文件到 /opt/yolo_ncnn_app
上传 OpenCV core/imgproc/imgcodecs 运行库到 /usr/local/opencv/lib
上传 libncnn.so 到 /usr/local/ncnn/lib
上传 models/demo/best.param 到 /opt/best.param
上传 models/demo/best.bin 到 /opt/best.bin
上传一张验证集图片到 /opt/test.jpg
在开发板运行 /opt/yolo_ncnn_app
如果开发板地址已经写入 scripts/board_env.sh,可以省略 --deploy。
3.4 常用部署参数
指定模型和测试图片:
./build_deploy_run.sh --app yolo_ncnn_app --deploy root@172.23.17.235 --yolo-param ../tb_yolo/models/demo/best.param --yolo-bin ../tb_yolo/models/demo/best.bin --yolo-image ../tb_yolo/dataset/images/val/resized-171.jpg -- --param best.param --bin best.bin --image test.jpg --output result.jpg
指定本机 ncnn 库目录:
./build_deploy_run.sh --app yolo_ncnn_app --ncnn-lib-dir ../cross_lib/ncnn/lib --deploy root@172.23.17.235 -- --param best.param --bin best.bin --image test.jpg --output result.jpg
只构建和上传,不立即运行:
./build_deploy_run.sh --app yolo_ncnn_app --deploy root@172.23.17.235 --no-run
四、常见问题与排查
4.1 缺少 onnx2ncnn
报错类似:
Missing onnx2ncnn
说明当前机器找不到 ncnn 转换工具。把工具放到:
tb_yolo/tools/ncnn/
或者加入 PATH。
4.2 缺少 libncnn.so
如果部署时报:
ncnn library directory not found
Missing ncnn library
先执行:
./scripts/build_ncnn_loongarch.sh
确认存在:
cross_lib/ncnn/lib/libncnn.so
4.3 输出维度不匹配
优先检查:
Category_NUM 是否等于类别数量
DATA_LEN 是否等于 Category_NUM + 5
input_name 是否等于 best.param 中输入 blob 名
out_name 是否等于 best.param 中输出 blob 名
训练、ONNX 导出、ncnn 推理的输入尺寸是否一致
4.4 框位置不对
优先检查:
是否使用 letterbox 预处理
是否按 letterbox 的 scale/pad 还原坐标
输入 BGR/RGB 是否处理一致
imgsz 是否一致
4.5 类别整体错位
优先检查:
configs/target_board.names
LabelImg classes.txt
example/yolo_ncnn_app/main.cpp 中的 kClassNames
三处顺序必须完全一致。


所有评论(0)