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

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

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

一、ncnn下载

  1. mkdir ncnn-TinyYoloV4
  2. cd ncnn-TinyYoloV4
  3. git clone https://github.com/Tencent/ncnn.git
  4. git submodule init
  5. git submodule update

二、选一个系统

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

  1. 在外边新建个文件夹mkdir Linux86-TinyYOLOV4
  2. cd Linux86-TinyYOLOV4
  3. 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下载 (速度太慢就吧)还慢就下这个吧
  4. tar -xf vulkansdk-linux-x86_64-1.1.114.0.tar.gz 下载好了就解压
  5. cd <解压后的文件夹>
  6. export VULKAN_SDK=`pwd`/1.1.114.0/x86_64 这里就是给系统添加个环境变量VULKAN_SDK=解压后文件夹中的x86_64路径

三、编译

  1. cd ncnn-TinyYoloV4进入之前创建的ncnn-TinyYoloV4文件夹中
  2. cd nccv进入clone的文件夹中
  3. mkdir -p build创建build文件夹
  4. cd build
  5. cmake ..cmake出来的东西在build文件夹中
  6. make -j4
    nvcc编译的结果都在build 文件夹中了

四、运行YOLO-V4的检测

1、检测前要了解的知识

  1. make完成之后,在build文件夹中有个examples的文件夹,进去看到有各种编译好的网络,其中就有yolov4

图-1

用Tiny-YOLO-V4 和YOLO-V4 在移动端跑自己训练的模型_第1张图片

  1. 这里解释一下这些文件是从哪里编译来的:在git clone下来的ncnn文件夹中的examples文件夹中

图-2用Tiny-YOLO-V4 和YOLO-V4 在移动端跑自己训练的模型_第2张图片

  1. 里面应该是这样

图-3用Tiny-YOLO-V4 和YOLO-V4 在移动端跑自己训练的模型_第3张图片

  1. 所以各种网络都是通过编译图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的运行

  1. 图4中的yolov4-tiny-opt.paramyolov4-tiny-opt.bin复制到图1文件夹中,进入图1文件夹中(也就是ncnn-TinyYoloV4->ncnn->build->examples)
  2. 在加入一张图片,假设名字是test.jpg
  3. 执行命令./yolov4 test.jpg即可得到运行结果,如下所示用Tiny-YOLO-V4 和YOLO-V4 在移动端跑自己训练的模型_第4张图片

yolov4-的运行

  1. 跑yolov4也是这个方法,把对应的的yolov4-opt.paramyolov4-opt.bin复制到图1文件夹中
  2. 把上一步复制过去的两个文件的名字改了,改成对应的yolov4-tiny-opt.paramyolov4-tiny-opt.bin(为啥下面会说)
  3. 执行命令./yolov4 test.jpg即可得到运行结果,如下所示用Tiny-YOLO-V4 和YOLO-V4 在移动端跑自己训练的模型_第5张图片
    果然满配的yolov4相比tiny版就是准确度高不少

如何运行自己的模型

  1. 首先自己得有模型啊,不会用darknet train模型的看这篇博客

  2. 自己有模型之后,也就是有了自己的.weights.cfg文件之后,OK记得要把.cfg文件的batch=1,subdivisions=1设置好

  3. 进入图二的文件夹中的tools文件夹,如下在这里插入图片描述

  4. 进入darknet文件夹:目前位置是(ncnn-TinyYoloV4->ncnn->tools->darknet)

  5. 在里面你会看到这个文件darknet2ncnn.cpp这个文件就是可以将darknet的.weights.cfg文件转换为.bin.param的函数,此函数没有任何依赖,且支持yolov4和yolov4-tiny

  6. 进行转换:

    假设已有的两个文件是yolov4-tiny.cfg yolov4-tiny.weights,要转换为yolov4-tiny.paramyolov4-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.paramyolov4-tiny-opt.bin两个文件即为ncnn可以使用的权重和参数,
  • yolov4-tiny-opt.paramyolov4-tiny-opt.bin移动到(ncnn-TinyYoloV4->ncnn->build->examples)下,运行./yolov4 test.jpg就实现用自己的模型检测目标了用Tiny-YOLO-V4 和YOLO-V4 在移动端跑自己训练的模型_第6张图片

你可能感兴趣的:(目标检测)