您的位置:首页 > Web前端

深度学习实战(1)--手机上跑目标检测网络(YOLO,从DarkNet到Caffe再到NCNN完整打通)

2018-10-11 17:44 1786 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lwplwf/article/details/83016219

https://github.com/lwplw

这篇算是关键技术贴,YOLO是什么、DarkNet是什么、Caffe是什么、NCNN又是什么…等等这一系列科普这里就完全不说了,牵扯实在太多,通过其他帖子有一定的积累后,看这篇就相对容易了。

本文核心:把一个目标检测模型跑到手机上

整个工作分以下几个阶段:

1、训练得到一个目标检测模型

目前可以做目标检测的模型有很多,比如R-CNN、Fast R-CNN、Faster R-CNN、SSD、MobileNet-SSD、Mask R-CNN、YOLOv1、YOLOv2、YOLOv3等等。

本文选择的是YOLOv2_tiny,原因有YOLO快,简单比较好用,而且DarkNet的源码去看看还是比较有意思的,这里使用的是YOLOv2的tiny版本,网络更小一些,毕竟我们最终是要跑在手机上,嵌入式终端设别就那么点硬件资源。

具体怎么做,看我这篇帖子:Caffe–实现YOLOv2目标检测 https://blog.csdn.net/lwplwf/article/details/83011667
一些实现细节,源码,脚本等我都准备好了,按帖子里直接下载用就行,我自己也重新下载试了一遍,没问题,有问题的话评论区喊我。

2、模型在NCNN下跑起来

在1阶段中,训练得到了DarkNet下的

.cfg模型结构文件
.weights模型权重文件
,然后转换为Caffe下的
.prototxt模型结构文件
.caffemodel模型权重文件

(1)安装编译ncnn(Ubuntu16.04)

下载ncnn:

git clone https://github.com/Tencent/ncnn

进入ncnn根目录,执行命令:

mkdir -p build
cd build
cmake ..

make -j8

(2)将caffemodel和prototxt转换为param和bin

NCNN框架中网络定义文件为

.param文件
,权值文件为
.bin文件
,可以通过NCNN中自带的工具进行转换。

1)将1阶段得到的

yolov2_tiny_3.prototxt
yolov2_tiny_3.caffemodel
两个文件放到
ncnn-master/build/tools/caffe
目录下。
2)需要修改一下
yolov2_tiny_3.prototxt
文件
将最后一层

layer {
name: "region1"
type: "Region"
bottom: "layer15-conv"
top: "region1"
region_param {
classes: 3
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: 3
coords: 4
confidence_threshold: 0.3
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
}
}

终端进入该目录执行命令:

./caffe2ncnn yolov2_tiny_3.prototxt yolov2_tiny_3.caffemodel yolov2_tiny_3.param yolov2_tiny_3.bin


(3)NCNN进行检测

修改NCNN根目录下

CMakeLists.txt
文件
取消注释
add_subdirectory(examples)


NCNN根目录下执行命令重新编译:
(以后修改NCNN源码后,都需要重新编译)

 cd build
cmake ..
make -j8

将之前生成的

yolov2_tiny_3.param
yolov2_tiny_3.bin
放到
build/examples
目录下。
终端进入该目录执行命令:

./yolov2 111.jpg


3、将NCNN跑到手机上

其实也可以选择在手机上跑OpenCV,然后使用OpenCV的dnn模块调用DarkNet,这样连Caffe都不需要经过,可是…太慢了…

后面的我休息下再写!!!

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: