当前位置: 代码迷 >> 综合 >> yolo-fastestv2 训练部署流程
  详细解决方案

yolo-fastestv2 训练部署流程

热度:129   发布时间:2023-10-28 11:33:55.0

训练

1. 数据集准备

yolo fastest,darknet yolo3 相同,需要设置 .name, .data
train.txt 格式: /home/qiuqiu/Desktop/dataset/train/000001.jpg
label.txt 格式: 11 0.344192634561 0.611 0.416430594901 0.262

2. anchor聚类

结果保存在 anchors6.txt
python genanchors.py --traintxt /media/ubuntu/数据/ccl/datasets/NWPU_VHR_10/2007_train.txt

3. 训练

直接 运行 python train.py --data data/nv10.data 即可

4. map 计算

python evaluation.py --data data/nv10.data --weights weights/coco-290-epoch-0.456773ap-model.pth

5. 测试

python test.py --data data/coco.data --weights modelzoo/coco2017-0.241078ap-model.pth --img img/000139.jpg
python test.py --data data/nv10.data --weights weights/coco-290-epoch-0.456773ap-model.pth --img img/017.jpg

6. batchsize, step(iteration), epoch 参数设置

=> iteration = (exampleNums * epoch) / batchsize
=> epoch: 一个epoch表示所有训练样本运算学习一遍
=> iteration/step: 表示每运行一个iteration/step,更新一次参数权重,即进行一次学习,每一次更新参数需要batch size个样本进行运算学习,根据运算结果调整更新一次参数。1个 iteration 等于 使用batchsize个样本训练一次, 样本step 也被称为 iteration 迭代;完成一次epoch 需要的batch 个数, batch numbers 就是 iterations .
=> batch size:1次迭代所使用的样本量

nv10训练集合 585,测试集 65; batch_size=128;因此训练集合 需要 585300/128=1364
假设有20000个样本,batch size 为200,epoch为1, 则iteration = 20000
1/200=100
iteration=20000 , epoch = 20000*64 / 585 = 2200;

相关报错

  • 报错1: 训练使用多卡,而测试使用单卡,因此出现一下错误;权重前面 多了一个module

Missing key(s) in state_dict: “backbone.first_conv.0.weight”, “backbone.first_conv.1.weight”, “backbone.first_conv.1.bias”,
Unexpected key(s) in state_dict: “module.backbone.first_conv.0.weight”,“module.backbone.first_conv.1.weight”, “module.backbone.first_conv.1.bias”,

解决方案:
if torch.cuda.device_count() > 1:
model = torch.nn.DataParallel(model)
但是 不推荐,因为之前的代码 我改成dp训练模式了,发现训练效果 还不如 cpu上,最终再github 的issue 上看到一个解答,说是 他改进的这个代码版本,对cpu更友好。

  • 报错2: RuntimeError: Pin memory thread exited unexpectedly
    解决方案: torch.utils.data.DataLoader 中,将 pin_memory=False,

7. NCNN部署

(1) Convert onnx

python pytorch2onnx.py --data data/coco.data --weights modelzoo/coco2017-0.241078ap-model.pth --output yolo-fastestv2.onnx

(2) onnx-sim

python3 -m onnxsim yolo-fastestv2.onnx yolo-fastestv2-opt.onnx
cp yolo-fastestv2-opt.onnx ../ncnn/build/tools/onnx

(3) Build NCNN

git clone https://github.com/Tencent/ncnn.git
cd ncnn
mkdir build
cd build
cmake ..
make
make install
cp -rf ./ncnn/build/install/* ./Yolo-FastestV2-main/sample/ncnn

其中 cp参数 含义:
-R/r:递归处理,将指定目录下的所有文件与子目录一并处理;
-f:强行复制文件或目录,不论目标文件或目录是否已存在;

(4) Covert ncnn param and bin
#1 将 onnx 转换成param 和 bin

cd ncnn/build/tools/onnx
./onnx2ncnn yolo-fastestv2-opt.onnx yolo-fastestv2.param yolo-fastestv2.bin

#2 ncnnoptimize 工具会自动将无用的 MemoryData 删除,并且自动将最终的 blob count 设置为合适的数量,顺便转为 fp16 存储减小模型体积

cp yolo-fastestv2* ../   # ncnnoptimize 在当前目录的上一层目录
cd ../
./ncnnoptimize yolo-fastestv2.param yolo-fastestv2.bin yolo-fastestv2-opt.param yolo-fastestv2-opt.bin 

#3 将在ncnn生成的 param and bin 复制到 yolo-fastestV2 中的 sample/ncnn/model 文件下

cp yolo-fastestv2-opt* ../../../Yolo-FastestV2-main/sample/ncnn/model

(5) run sample

cd ../../../Yolo-FastestV2/sample/ncnn
sh build.sh
./demo
注意,这里一定要去 demo.cpp 里面修改

(1) api.loadModel中 模型路径
(2)测试图片路径 cv::Mat cvImg = cv::imread(“058.jpg”);
(3) class_names,类别名

去src/yolo-fastestv2.cpp 修改类别 numCategory = 10; 你的数据集类别数

必须修改,否则报错 段错误.

8. 最后放一个 sh 脚本

这里的 ncnnYolo-FastestV2-main 在同一级目录

#1 生成 onnx
python pytorch2onnx.py --data data/nv10.data --weights weights/nv10-750-epoch-0.432743ap-model.pth --output yolo-fastestv2_nv10.onnx
python -m onnxsim yolo-fastestv2_nv10.onnx yolo-fastestv2_nv10-opt.onnx
cp yolo-fastestv2_nv10-opt.onnx ../ncnn/build/tools/onnx# cp 这个 只需要 执行一次
#cp -rf ./ncnn/build/install/* ./Yolo-FastestV2-main/sample/ncnn#2 转 ncnn 为 param 和 bin
cd ../ncnn/build/tools/onnx
./onnx2ncnn yolo-fastestv2_nv10-opt.onnx yolo-fastestv2_nv10.param yolo-fastestv2_nv10.bin
cp yolo-fastestv2_nv10* ../   # ncnnoptimize 在当前目录的上一层目录
cd ../
./ncnnoptimize yolo-fastestv2_nv10.param yolo-fastestv2_nv10.bin yolo-fastestv2_nv10-opt.param yolo-fastestv2_nv10-opt.bin 1
cp yolo-fastestv2_nv10-opt* ../../../Yolo-FastestV2-main/sample/ncnn/model#3 编译运行
cd ../../../Yolo-FastestV2-main/sample/ncnn
# 注意,这里一定要去 demo.cpp 里面修改# api.loadModel中 模型路径# 测试图片路径 cv::Mat cvImg = cv::imread("058.jpg");# class_names,类别名
# src/yolo-fastestv2.cpp 修改类别 numCategory = 10; 必须修改,否则报错 段错误.
sh build.sh
./demo

8. 部署到 开发板RK3399pro

注意点:

  • 在 linux端,跑通上面流程后,只需要将 Yolo-FastestV2-main\sample\ncnn 这个文件夹 复制到 rk3399 板子上;
  • ncnn 的下载编译 和 linux端相同
  • 编译运行 同上 linux 端