如何在移动端跑自己训练的数据 Tiny-YOLO-V4 和YOLO-V4进行目标检测 ncnn平台 Linux系统
- tiny-yolov4刚出没几天,想在移动端跑一下tiny-yolo,但是opencv不给力啊,还不支持yolo-v4
- 结果昨天腾讯发布了支持tiny-yolo-v4的
darknet2ncnn
…………emmmmmmmmmmmmmmmm - 于是果断换ncnn
一、ncnn下载
mkdir ncnn-TinyYoloV4
cd ncnn-TinyYoloV4
git clone https://github.com/Tencent/ncnn.git
git submodule init
git submodule update
二、选一个系统
由于我想在树莓派上跑,先在电脑(电脑是ubuntu18.04)上试试,选的系统是(Linux x86)
- 在外边新建个文件夹
mkdir Linux86-TinyYOLOV4
cd Linux86-TinyYOLOV4
wget https://sdk.lunarg.com/sdk/download/1.1.114.0/linux/vulkansdk-linux-x86_64-1.1.114.0.tar.gz?Human=true -O vulkansdk-linux-x86_64-1.1.114.0.tar.gz
下载 (速度太慢就翻墙吧)翻墙还慢就下这个吧tar -xf vulkansdk-linux-x86_64-1.1.114.0.tar.gz
下载好了就解压cd <解压后的文件夹>
export VULKAN_SDK=pwd/1.1.114.0/x86_64
这里就是给系统添加个环境变量VULKAN_SDK=解压后文件夹中的x86_64路径
三、编译
cd ncnn-TinyYoloV4
进入之前创建的ncnn-TinyYoloV4文件夹中cd nccv
进入clone的文件夹中mkdir -p build
创建build文件夹cd build
cmake ..
cmake出来的东西在build文件夹中make -j4
nvcc编译的结果都在build 文件夹中了
四、运行YOLO-V4的检测
1、检测前要了解的知识
- make完成之后,在build文件夹中有个examples的文件夹,进去看到有各种编译好的网络,其中就有yolov4
图-1
- 这里解释一下这些文件是从哪里编译来的:在git clone下来的ncnn文件夹中的examples文件夹中
图-2
- 里面应该是这样
图-3
- 所以各种网络都是通过编译图3中的
.cpp
文件才有了图1中的各种可直接运行的模型注意:
- 其中方框圈起来的.cpp都是ncnn官方提供所支持的网络
- 圆圈圈起来的两个文件是
squeexenet
权重和参数文件,其中.bin
文件是权重相当于yolo的.weights
.param
是网络的参数文件,相当于yolo中的.cfg
文件
- 主要是告诉大家ncnn的训练文件是哪种格式,这个在下面训练自己数据集时要进行格式转换
2、进行检测
官方提供了训练好的样板.bin
和.param
,点击这里下载,也何以下载我上传的(内含yolov4的.bin
+.param
和yolov4-Tiny的.bin
+.param
)
解压后是这4个文件
图-4
yolov4-Tiny的运行
- 把图4中的
yolov4-tiny-opt.param
和yolov4-tiny-opt.bin
复制到图1文件夹中,进入图1文件夹中(也就是ncnn-TinyYoloV4->ncnn->build->examples) - 在加入一张图片,假设名字是
test.jpg
- 执行命令
./yolov4 test.jpg
即可得到运行结果,如下所示
yolov4-的运行
- 跑yolov4也是这个方法,把对应的的
yolov4-opt.param
和yolov4-opt.bin
复制到图1文件夹中 - 把上一步复制过去的两个文件的名字改了,改成对应的
yolov4-tiny-opt.param
和yolov4-tiny-opt.bin
(为啥下面会说) - 执行命令
./yolov4 test.jpg
即可得到运行结果,如下所示
果然满配的yolov4相比tiny版就是准确度高不少
如何运行自己的模型
-
首先自己得有模型啊,不会用darknet train模型的看这篇博客
-
自己有模型之后,也就是有了自己的
.weights
和.cfg
文件之后,OK记得要把.cfg
文件的batch=1
,subdivisions=1
设置好 -
进入图二的文件夹中的tools文件夹,如下
-
进入darknet文件夹:目前位置是(ncnn-TinyYoloV4->ncnn->tools->darknet)
-
在里面你会看到这个文件
darknet2ncnn.cpp
这个文件就是可以将darknet的.weights
和.cfg
文件转换为.bin
和.param
的函数,此函数没有任何依赖,且支持yolov4和yolov4-tiny -
进行转换:
假设已有的两个文件是
yolov4-tiny.cfg
yolov4-tiny.weights
,要转换为yolov4-tiny.param
,yolov4-tiny.bin
这两个文件样例命令:
./darknet2ncnn yolov4-tiny.cfg yolov4-tiny.weights yolov4-tiny.param yolov4-tiny.bin 1darknet2ncnn各个参数的意义
Usage: darknet2ncnn [darknetcfg] [darknetweights] [ncnnparam] [ncnnbin] [merge_output]
[darknetcfg] .cfg file of input darknet model.
[darknetweights] .weights file of input darknet model.
[cnnparam] .param file of output ncnn model.
[ncnnbin] .bin file of output ncnn model.
[merge_output] merge all output yolo layers into one, enabled by default.如果成功了会输出这个:
Loading cfg…
WARNING: The ignore_thresh=0.700000 of yolo0 is too high. An alternative value 0.25 is written instead.
WARNING: The ignore_thresh=0.700000 of yolo1 is too high. An alternative value 0.25 is written instead.
Loading weights…
Converting model…
83 layers, 91 blobs generated.
NOTE: The input of darknet uses: mean_vals=0 and norm_vals=1/255.f.
NOTE: Remeber to use ncnnoptimize for better performance.
- 把新生成的
yolov4-tiny.param
yolov4-tiny.bin
文件移动到上一层目录,也就是
cp yolov4-tiny.param ..
cp yolov4-tiny.bin ..
cd ..
./ncnnoptimize yolov4-tiny.param yolov4-tiny.bin yolov4-tiny-opt.param yolov4-tiny-opt.bin 0
- 生成的
yolov4-tiny-opt.param
和yolov4-tiny-opt.bin
两个文件即为ncnn可以使用的权重和参数, - 把
yolov4-tiny-opt.param
和yolov4-tiny-opt.bin
移动到(ncnn-TinyYoloV4->ncnn->build->examples)下,运行./yolov4 test.jpg就实现用自己的模型检测目标了
补充:
有几个小伙伴问我自己的label没有改掉啊,这怎么改,其实看这里