WSL/Linux 测试数据集训练 - TorchScript 导出 - pnnx 转换 ncnn - example/yolo_ncnn_app 部署测试当前使用 WSL2可通过 NVIDIA WSL 驱动访问宿主机 GPU。目标检测训练、TorchScript 导出和 pnnx 转换统一在 WSL/Linux 中完成。回到顶部一、项目结构与环境准备1.1 目录职责当前仓库根目录/opt/2k0300/loongson_2k300_lib与本流程相关的目录tb_yolo/configs/demo/target_board.names # 类别名一行一个类别configs/demo/target_board.yaml # YOLOv5 数据集配置dataset/demo/images/train/ # 测试训练集图片dataset/demo/images/val/ # 测试验证集图片dataset/demo/labels/train/ # 测试训练集标签dataset/demo/labels/val/ # 测试验证集标签models/pretrained/yolov5n.pt # 默认迁移学习权重models/demo/best.pt # 演示 PyTorch 权重models/demo/best.torchscript # 演示 TorchScriptmodels/demo/best.param # 演示 ncnn 结构文件转换后生成models/demo/best.bin # 演示 ncnn 权重文件转换后生成scripts/train_yolov5_host.sh # WSL/Linux 训练入口scripts/export_torchscript_host.sh # WSL/Linux TorchScript 导出入口scripts/export_ncnn_host.sh # WSL/Linux TorchScript 转 ncnn 入口vendor/yolov5/ # YOLOv5 源码example/yolo_ncnn_app/ # 久久派 ncnn 离线推理示例scripts/build_ncnn_loongarch.sh # 下载并交叉编译 ncnncross_lib/ncnn/ # ncnn 安装目录脚本生成1.2 日常操作目录tb_yolo 相关命令默认在cd /opt/2k0300/loongson_2k300_lib/tb_yoloexample 部署命令默认在仓库根目录或 example 目录执行文档会分别写清楚。1.3 初始化 WSL/Linux 训练环境必须使用 Python 3.10 或 Python 3.11不要使用系统自带 Python 3.14。如果系统还没有 conda先安装 Miniforge。如果 wget 不存在先安装sudo apt updatesudo apt install -y wget安装并初始化 Miniforgecd /tmpwget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.shbash Miniforge3-Linux-x86_64.sh -b -p “HOME/miniforge3evalHOME/miniforge3 eval HOME/miniforge3eval(”$HOME/miniforge3/bin/conda shell.bash hook)conda init bash执行 conda init bash 后重新打开一个终端或者执行source ~/.bashrc如果安装后当前终端仍提示 Command ‘conda’ not found说明当前 shell 还没有加载 conda先执行eval “(((HOME/miniforge3/bin/conda” shell.bash hook)conda --version确认能看到 conda 版本号后创建并进入 loong 环境conda create -n loong python3.10conda activate loong安装 YOLOv5 依赖cd /opt/2k0300/loongson_2k300_lib/tb_yolopython -m pip install -r requirements-host.txtrequirements-host.txt 已固定使用 CUDA 12.8 版 PyTorchtorch2.11.0cu128torchvision0.26.0cu128vendor/yolov5/requirements.txt 不直接写 --extra-index-url因为 YOLOv5 训练启动时会检查该文件运行期检查逻辑会把 pip 参数误当成包名。训练脚本会提前复用系统字体生成 ~/.config/Ultralytics/Arial.ttf避免训练时联网下载字体。确认 WSL 能访问 GPUnvidia-smipython -c “import torch; print(torch.version); print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else ‘cpu’)”成功后应看到torch: 2.11.0cu128CUDA available: TrueCUDA device: NVIDIA GeForce RTX 5060 Laptop GPUCUDA tensor test: 1.0只看 torch.cuda.is_available() 不够必须确认 CUDA 张量能实际创建和同步。1.4 检查类别配置测试数据集当前类别文件configs/demo/target_board.names内容MousePrinterdrillWrenchScrewdriver类别顺序必须同时匹配YOLO 标签 class_idconfigs/demo/target_board.yaml开发板运行目录中的 names.txt回到顶部二、使用测试数据集训练和转换2.1 测试数据集位置测试数据集已经放在tb_yolo/dataset/demo/images/traintb_yolo/dataset/demo/images/valtb_yolo/dataset/demo/labels/traintb_yolo/dataset/demo/labels/val本场景只用于验证流程不代表最终上车效果。注意当前已经按数据集名隔离目录不再使用拆分前的平铺目录。demo 场景统一使用outputs/train/demo/exp_demo_gpu/weights/best.ptdataset/demo/images/valconfigs/demo/target_board.yaml2.2 启动训练执行./scripts/train_yolov5_host.sh --name exp_demo_gpu默认核心参数参数 默认值 说明–name 命令指定必填 本次实验目录名输出在 outputs/train/demo//–weights models/pretrained/yolov5n.pt 迁移学习预训练权重轻量模型适合开发板部署–data configs/demo/target_board.yaml 数据集配置文件–epochs 150 训练轮数–batch-size 32 批量大小显存不足时降低例如 --batch-size 16–imgsz 96 输入尺寸后续 TorchScript 导出和 ncnn 推理必须与此一致–device 0 使用第 0 块 GPUCPU 训练用 --device cpu–project outputs/train/demo 训练输出根目录–optimizer SGD 优化器可选 Adam、AdamW–hyp vendor/yolov5/data/hyps/hyp.scratch-low.yaml 超参数配置文件小型数据集推荐 hyp.scratch-low.yaml–patience 100 早停耐心值验证集指标连续不提升的轮数–cache -不使用 缓存图片到内存/磁盘加速训练可选 ram 或 disk–resume - 从断点恢复训练传入中断的权重路径–noval switch默认不启用 跳过每轮验证加快训练但无法观察过拟合–nosave switch默认不启用 不保存中间权重只保留 last.pt 和 best.pt–exist-ok switch默认不启用 允许覆盖已存在同名输出目录–freeze -默认不冻结 冻结前 N 层例如 --freeze 10 只微调检测头训练完成后优先使用outputs/train/demo/exp_demo_gpu/weights/best.pt2.3 查看训练结果重点查看outputs/train/demo/exp_demo_gpu/results.pngoutputs/train/demo/exp_demo_gpu/confusion_matrix.pngoutputs/train/demo/exp_demo_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 IoU0.5 下的检测精度 判断是否大体能检出metrics/mAP_0.5:0.95 更严格的综合精度 判断框是否贴合2.4 本机检测验证执行python vendor/yolov5/detect.py --weights outputs/train/demo/exp_demo_gpu/weights/best.pt --source dataset/demo/images/val --data configs/demo/target_board.yaml --imgsz 96 --conf-thres 0.25 --project outputs/detect/demo --name exp_demo_val输出图片在outputs/detect/demo/exp_demo_val图片框上的数字是置信度例如 0.91 表示模型认为该框属于对应类别的综合置信度约为 91%。2.5 导出 TorchScript执行zhengyangubuntu:/opt/2k0300/loongson_2k300_lib/tb_yolo$ ./scripts/export_torchscript_host.sh --weights models/demo/best.pt --imgsz 96 --copy-model demoTorchScript 导出不强制需要 GPU脚本默认使用 --device cpu。导出时不要加 --optimizepnnx 需要标准 TorchScript 文件不使用移动端 lite interpreter 格式。参数说明参数 默认值 说明–weights 必填 训练好的 .pt 权重路径例如 outputs/train/demo/exp_demo_gpu/weights/best.pt–imgsz 96 导出输入尺寸必须与训练时的 --imgsz 一致–copy-model - 导出后拷贝 best.torchscript 和 best.pt 到 models// 目录–batch 1 导出时的 batch 大小部署推理通常为 1–device cpu 导出设备Linux 虚拟机没有 GPU 时保持 cpu–install-deps false 导出前安装 YOLOv5 requirements.txt 依赖生成models/demo/best.torchscriptmodels/demo/best.pt–imgsz 必须与训练时一致。2.6 检查 TorchScriptNetron 是神经网络模型结构查看工具用来确认输入输出不负责训练或推理。网页版https://netron.app本地安装zhengyangubuntu:/opt/2k0300/loongson_2k300_lib/tb_yolo$ pip install netronzhengyangubuntu:/opt/2k0300/loongson_2k300_lib/tb_yolo$ netron ./models/demo/best.torchscript重点确认输入尺寸1x3x96x96模型类型TorchScript导出尺寸与训练imgsz一致注意pnnx 转换后ncnn 输入输出名固定按 in0、out0、out1、out2 使用。2.7 生成 ncnn 部署模型前面导出的 best.torchscript 是中间格式久久派上的 yolo_ncnn_app 使用 ncnn 推理实际加载的是best.parambest.bin其中best.param 网络结构best.bin 网络权重因此流程是best.pt - best.torchscript - best.param best.binpnnx 是 ncnn 官方提供的模型转换工具。本流程中它负责读取 TorchScript根据 inputshape 推断输入输出形状完成算子转换和必要图优化最终直接生成 ncnn 加载用的 best.param 和 best.bin。开发板端只加载转换产物不再解析 .pt 或 TorchScript。本项目使用 TorchScript - pnnx - ncnn 链路。部署端读取 out0 候选框矩阵再在 C 中完成置信度过滤和 NMS。先安装官方 pnnx 命令行工具python3 -m pip install pnnx然后在 tb_yolo 下转换cd /opt/2k0300/loongson_2k300_lib/tb_yolo./scripts/export_ncnn_host.sh --torchscript models/demo/best.torchscript --imgsz 96 --copy-model demo该脚本会调用 pnnx使用 inputshape[1,3,96,96]生成 best.param / best.bin复制 best.param / best.bin 到 models/demo/参数说明参数 默认值 说明–torchscript models/demo/best.torchscript TorchScript 模型路径–imgsz 96 pnnx 输入尺寸必须与训练和 TorchScript 导出尺寸一致–copy-model - 转换后拷贝 best.param 和 best.bin 到 models// 目录–pnnx 自动查找 指定其他 pnnx 可执行文件–fp16 1 pnnx 权重存储选项默认启用 FP16 存储以减小模型体积–optlevel 2 pnnx 优化等级–device cpu pnnx 转换设备–moduleop 空 可选 pnnx 高级参数本项目默认不使用生成models/demo/best.parammodels/demo/best.bin后续部署到久久派时example/build_deploy_run.sh 会默认上传这两个文件到开发板运行目录。转换后的 ncnn 模型使用以下 blob 名输入尺寸float32[1,3,96,96]输入in0输出out0这里 out0 是 YOLOv5 已解码的候选框矩阵每行格式为x_center, y_center, width, height, objectness, class0, class1, …yolo_ncnn_app 会在 C 里完成置信度过滤、坐标还原和 NMS。回到顶部三、编译 ncnn 和部署到久久派3.1 编译 ncnn 到 cross_lib在能运行 bash、git、cmake 和仓库交叉工具链的环境中执行./scripts/build_ncnn_loongarch.sh环境变量说明环境变量 默认值 说明NCNN_GIT_REF master 要编译的 ncnn git 版本标签例如 20250503NCNN_INSTALL_PREFIX cross_lib/ncnn 安装目标目录NCNN_GIT_URL https://github.com/Tencent/ncnn.git ncnn 源码仓库地址NCNN_JOBS $(nproc) 编译并行任务数默认使用全部 CPU 核心脚本会从 NCNN_GIT_URL 下载 Tencent/ncnn 源码使用cross_lib/loongarch64-linux-gnu-gcc13.3安装到cross_lib/ncnncross_lib/src/ 和 cross_lib/build/ 是源码和中间构建目录已加入 .gitignore。需要固定源码版本时可在运行前设置 NCNN_GIT_REF例如NCNN_GIT_REF20250916 ./scripts/build_ncnn_loongarch.sh3.2 编译 yolo_ncnn_app在仓库根目录执行cd example/yolo_ncnn_appmake cleanmake默认依赖cross_lib/ncnncross_lib/opencv-4.10.0cross_lib/loongarch64-linux-gnu-gcc13.3yolo_ncnn_app 使用 ncnn 推理使用 OpenCV 读取图片、缩放和保存结果。3.3 一键部署运行在仓库根目录执行cd example./build_deploy_run.sh --app yolo_ncnn_app – --param best.param --bin best.bin --names names.txt --image test.jpg --output result.jpg脚本会自动编译 example/yolo_ncnn_app/main上传可执行文件到 /opt/yolo_ncnn_app/yolo_ncnn_app上传 OpenCV core/imgproc/imgcodecs 运行库到 /usr/local/opencv/lib上传 libncnn.so 到 /usr/local/ncnn/lib上传 models/demo/best.param 到 /opt/yolo_ncnn_app/best.param上传 models/demo/best.bin 到 /opt/yolo_ncnn_app/best.bin上传 configs/demo/target_board.names 到 /opt/yolo_ncnn_app/names.txt上传一张验证集图片到 /opt/yolo_ncnn_app/test.jpg在开发板运行 /opt/yolo_ncnn_app/yolo_ncnn_app3.4 部署参数说明3.4.1 脚本参数-- 之前控制编译和上传行为参数 类型 默认值 说明–app string 必填 要部署的应用名对应 example// 目录–deploy string scripts/board_env.sh 开发板 SSH 地址例如 root172.23.15.40–remote-dir string /opt 开发板上的部署基础目录实际使用 /opt//–remote-name string APP_NAME 远端可执行文件名–target string main 本地构建产物文件名–model string demo 本地模型/数据集名对应 tb_yolo/models// 和 tb_yolo/dataset//–yolo-param string tb_yolo/models//best.param 本地 .param 文件路径通常不用手动写–yolo-bin string tb_yolo/models//best.bin 本地 .bin 文件路径通常不用手动写–yolo-names string 自动推导 本地类别名文件默认使用 tb_yolo/configs//target_board.names–yolo-image string 自动推导 本地测试图片路径默认从 tb_yolo/dataset//images/val/ 取第一张–ncnn-lib-dir string cross_lib/ncnn/lib 本机 libncnn.so 所在目录–remote-ncnn-lib-dir string /usr/local/ncnn/lib 开发板 libncnn.so 部署目录–opencv-lib-dir string cross_lib/opencv-4.10.0/lib 本机 OpenCV 运行库目录–remote-lib-dir string /usr/local/opencv/lib 开发板 OpenCV 运行库目录–no-run switch false 只编译和上传不执行推理–skip-build switch false 跳过本地构建只上传已有可执行文件–no-clean switch false 构建前不执行 make clean–stop-old switch false 部署运行前先停止远端同名旧进程–stop-only switch false 只停止远端同名旧进程不构建、不上传3.4.2 应用参数-- 之后传给 yolo_ncnn_app 的 argv重要–param、–bin、–names、–image 的值是开发板上的文件名不是本地路径。脚本上传时会自动做文件名映射本地 .param → 远端 best.param固定命名本地 .bin → 远端 best.bin固定命名本地类别名文件来自 --yolo-names 或默认配置→ 远端 names.txt固定命名本地图片来自 --yolo-image 或默认验证集第一张→ 远端 test.jpg固定命名所以 --image test.jpg 中的 test.jpg 是脚本上传图片时强制重命名的结果无需用户关心本地图片叫什么。参数 说明–param 开发板上 .param 文件名与脚本上传时固定使用的名称一致例如 best.param–bin 开发板上 .bin 文件名与脚本上传时固定使用的名称一致例如 best.bin–names 开发板上类别名文件名与脚本上传时固定使用的名称一致例如 names.txt–image 开发板上测试图片的文件名脚本 scp 上传时固定重命名为 test.jpg–output 开发板上输出结果图片的名称例如 result.jpg–conf 置信度阈值默认 0.25检测不到目标时可临时降低到 0.1 排查–nms NMS 交并比阈值默认 0.453.5 常用部署示例指定模型和测试图片./build_deploy_run.sh --app yolo_ncnn_app --model demo --yolo-image …/tb_yolo/dataset/demo/images/val/resized-171.jpg – --param best.param --bin best.bin --names names.txt --image test.jpg --output result.jpg指定本机 ncnn 库目录./build_deploy_run.sh --app yolo_ncnn_app --ncnn-lib-dir …/cross_lib/ncnn/lib – --param best.param --bin best.bin --names names.txt --image test.jpg --output result.jpg只构建和上传不立即运行./build_deploy_run.sh --app yolo_ncnn_app --no-run跳过本地构建只重新上传已有可执行文件./build_deploy_run.sh --app yolo_ncnn_app --skip-build – --param best.param --bin best.bin --names names.txt --image test.jpg --output result.jpg部署运行前先停止远端旧进程./build_deploy_run.sh --app yolo_ncnn_app --stop-old – --param best.param --bin best.bin --names names.txt --image test.jpg --output result.jpg回到顶部四、常见问题与排查4.1 缺少 pnnx报错类似Missing pnnx说明当前机器找不到 pnnx 转换工具。安装官方 pnnxpython3 -m pip install pnnx4.2 缺少 libncnn.so如果部署时报ncnn library directory not foundMissing ncnn library先执行./scripts/build_ncnn_loongarch.sh确认存在cross_lib/ncnn/lib/libncnn.so4.3 输出维度不匹配优先检查names.txt 行数是否等于类别数量–input-name 是否等于 best.param 中输入 blob 名pnnx 默认 in0–output-name 是否等于 best.param 中输出 blob 名pnnx 默认 out0训练、TorchScript 导出、ncnn 推理的输入尺寸是否一致4.4 框位置不对优先检查是否使用 letterbox 预处理是否按 letterbox 的 scale/pad 还原坐标输入 BGR/RGB 是否处理一致imgsz 是否一致4.5 类别整体错位优先检查configs/demo/target_board.namesLabelImg classes.txt开发板运行目录中的 names.txt