训练
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 = 200001/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 脚本
这里的 ncnn 和 Yolo-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 端