最近一直和师兄在调试ncnn下使用yolov2-Tiny,感觉资料很少,踩了很多坑,就记录一下过程吧。
yolov2-Tiny在darknet下训练过程可以参考我之前的博客:
https://blog.csdn.net/qq_29377279/article/details/83141239
过程都类似,只是聚类的anchor有点不太一样,yolov3是9个,yolov2-Tiny是5个。
这是我聚类的脚本:https://github.com/yuace/yolo_python/blob/master/kmeans.py
注意:(我这里是给yolov3使用的,在yolov2-Tiny使用时,注意classes改为5,结果要除以32(下采样率))。
我们做的是一个目标检测的demo。
下面要用到两个文件,一个是网络结构的.cfg,另一个是训练出来的权重文件的.weights
我这里就是:
yolov2-tiny_tarmac.cfg
yolov2-tiny_tarmac_120000.weights
先要安装caffe,转换时使用,转换模型之后也可以用来测试测试。
参考:https://blog.csdn.net/lwplwf/article/details/83011667
看他提出了一个需要注意的问题:
对于YOLOv2_tiny,416×416的输入,经过最后一个max pool(size=2,stride=1),可以看到特征图13×13处理后还是13×13。
这就有点问题了,测试发现,Caffe中经过这一层特征图由13*13变成了12×12,会导致在Caffe下检测结果的box有偏差。
我们经过测试果然是这样,根据他的建议进行修改:
DarkNet中max pool层加上padding=2
Caffe中max pool层加上pad=1
这里要注意保持两个框架一致,darknet下再进行训练。
转换脚本:https://github.com/lwplw/darknet2caffe
这里使用他的darknet2caffe.py脚本时,只需修改caffe_root的路径即可。
使用命令:
python darknet2caffe.py yolov2-tiny_tarmac.cfg yolov2-tiny_tarmac_120000.weights yolov2-tiny_tarmac.prototxt yolov2-tiny_tarmac.caffemodel
完成之后会生成两个文件:
yolov2_tiny_tarmac.prototxt ---- 待生成的Caffe框架下的模型结构文件
yolov2_tiny_tarmac.caffemodel – 待生成的Caffe框架下的模型权重文件
注意:
修改.prototxt文件:
将第一层:
input: "data"
input_dim: 1
input_dim: 3
input_dim: 416
input_dim: 416
改为:
layer {
name: "data"
type: "Input"
top: "data"
input_param { shape: { dim: 1 dim: 3 dim: 416 dim: 416 } }
}
还有最后一层:
layer {
name: "region1"
type: "Region"
bottom: "layer15-conv"
top: "region1"
region_param {
classes: 1
coords: 4
boxes_of_each_grid: 5
softmax: true
}
}
修改为:
layer {
name: "detection_out"
type: "YoloDetectionOutput"
bottom: "layer15-conv"
top: "detection_out"
include {
phase: TEST
}
yolo_detection_output_param {
num_classes: 1
coords: 4
confidence_threshold: 0.4
nms_threshold: 0.45
biases: 1.08
biases: 1.19
biases: 3.42
biases: 4.41
biases: 6.63
biases: 11.38
biases: 9.42
biases: 5.11
biases: 16.62
biases: 10.52
}
}
这里为自己的classes和anchor,threshold自己定就好。
参考:https://blog.csdn.net/lwplwf/article/details/83016219 安装ncnn
安装完成后进入ncnn/build/tools/caffe下执行
转换命令:
./caffe2ncnn yolov2_tiny_tarmac.prototxt yolov2_tiny_tarmac.caffemodel yolov2_tiny_tarmac.param yolov2_tiny_tarmac.bin
转换完成即可得到ncnn下的权重和网络文件:
yolov2_tiny_tarmac.param
yolov2_tiny_tarmac.bin
修改NCNN根目录下CMakeLists.txt 文件取消注释add_subdirectory(examples)
add_subdirectory(examples)
修改官方examples里的yolov2.cpp
(因为官方有了yolov2.cpp,所以我们只要编译使用就ok了,后面转到手机端也会照着这个cpp写哦)
https://github.com/Tencent/ncnn/blob/master/examples/yolov2.cpp
我们只需修改param和bin,以及classes_names。(注意这里classe_names第一个为background,第二个开始才为我们的目标名称。)
完成后全部重新编译。
使用ncnn来测试一下我们的转换效果吧:
测试命令:
./yolov2 ncnn.jpg
看着效果和darknet下效果一样哦,到此我们模型及权重的转化就完成了啊。
这是在pc端的测试,下一篇将分享我们移植到android端的过程哦。