用Tiny-YOLO-V4 和YOLO-V4 在移动端跑自己训练的模型

    技术2022-07-11  101

    如何在移动端跑自己训练的数据 Tiny-YOLO-V4 和YOLO-V4进行目标检测 ncnn平台 Linux系统

    tiny-yolov4刚出没几天,想在移动端跑一下tiny-yolo,但是opencv不给力啊,还不支持yolo-v4结果昨天腾讯发布了支持tiny-yolo-v4的darknet2ncnn…………emmmmmmmmmmmmmmmm于是果断换ncnn

    一、ncnn下载

    mkdir ncnn-TinyYoloV4cd ncnn-TinyYoloV4git clone https://github.com/Tencent/ncnn.gitgit submodule initgit submodule update

    二、选一个系统

    由于我想在树莓派上跑,先在电脑(电脑是ubuntu18.04)上试试,选的系统是(Linux x86)

    在外边新建个文件夹mkdir Linux86-TinyYOLOV4cd Linux86-TinyYOLOV4wget 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 buildcmake ..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 1

    darknet2ncnn各个参数的意义 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没有改掉啊,这怎么改,其实看这里

    Processed: 0.013, SQL: 9