yolov2-Tiny在darknet下训练模型转caffe再到ncnn实现

最近一直和师兄在调试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。

我们用的120000的权重,先看一下在darknet下测试效果:

在这里插入图片描述yolov2-Tiny在darknet下训练模型转caffe再到ncnn实现_第1张图片
下面要用到两个文件,一个是网络结构的.cfg,另一个是训练出来的权重文件的.weights
我这里就是:
yolov2-tiny_tarmac.cfg
yolov2-tiny_tarmac_120000.weights

先转到caffe下:

先要安装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下再进行训练。

DarkNet下训练的yolo的.cfg文件和.weights文件转换为Caffe的.prototxt文件和.caffemodel文件

转换脚本: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自己定就好。

再转到ncnn下:

参考: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 

yolov2-Tiny在darknet下训练模型转caffe再到ncnn实现_第2张图片看着效果和darknet下效果一样哦,到此我们模型及权重的转化就完成了啊。
这是在pc端的测试,下一篇将分享我们移植到android端的过程哦。

你可能感兴趣的:(深度学习,yolo,ncnn)