天天看點

用Tiny-YOLO-V4 和YOLO-V4 在移動端跑自己訓練的模型如何在移動端跑自己訓練的資料 Tiny-YOLO-V4 和YOLO-V4進行目标檢測 ncnn平台 Linux系統

如何在移動端跑自己訓練的資料 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 在移動端跑自己訓練的模型如何在移動端跑自己訓練的資料 Tiny-YOLO-V4 和YOLO-V4進行目标檢測 ncnn平台 Linux系統
  1. 這裡解釋一下這些檔案是從哪裡編譯來的:在git clone下來的ncnn檔案夾中的examples檔案夾中

圖-2
用Tiny-YOLO-V4 和YOLO-V4 在移動端跑自己訓練的模型如何在移動端跑自己訓練的資料 Tiny-YOLO-V4 和YOLO-V4進行目标檢測 ncnn平台 Linux系統

  1. 裡面應該是這樣

圖-3
用Tiny-YOLO-V4 和YOLO-V4 在移動端跑自己訓練的模型如何在移動端跑自己訓練的資料 Tiny-YOLO-V4 和YOLO-V4進行目标檢測 ncnn平台 Linux系統

  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
用Tiny-YOLO-V4 和YOLO-V4 在移動端跑自己訓練的模型如何在移動端跑自己訓練的資料 Tiny-YOLO-V4 和YOLO-V4進行目标檢測 ncnn平台 Linux系統

yolov4-Tiny的運作

  1. 把圖4中的

    yolov4-tiny-opt.param

    yolov4-tiny-opt.bin

    複制到圖1檔案夾中,進入圖1檔案夾中(也就是ncnn-TinyYoloV4->ncnn->build->examples)
  2. 在加入一張圖檔,假設名字是

    test.jpg

  3. 執行指令

    ./yolov4 test.jpg

    即可得到運作結果,如下所示
    用Tiny-YOLO-V4 和YOLO-V4 在移動端跑自己訓練的模型如何在移動端跑自己訓練的資料 Tiny-YOLO-V4 和YOLO-V4進行目标檢測 ncnn平台 Linux系統

yolov4-的運作

  1. 跑yolov4也是這個方法,把對應的的

    yolov4-opt.param

    yolov4-opt.bin

    複制到圖1檔案夾中
  2. 把上一步複制過去的兩個檔案的名字改了,改成對應的

    yolov4-tiny-opt.param

    yolov4-tiny-opt.bin

    (為啥下面會說)
  3. 執行指令

    ./yolov4 test.jpg

    即可得到運作結果,如下所示
    用Tiny-YOLO-V4 和YOLO-V4 在移動端跑自己訓練的模型如何在移動端跑自己訓練的資料 Tiny-YOLO-V4 和YOLO-V4進行目标檢測 ncnn平台 Linux系統
    果然滿配的yolov4相比tiny版就是準确度高不少

如何運作自己的模型

  1. 首先自己得有模型啊,不會用darknet train模型的看這篇部落格
  2. 自己有模型之後,也就是有了自己的

    .weights

    .cfg

    檔案之後,OK記得要把

    .cfg

    檔案的

    batch=1

    ,

    subdivisions=1

    設定好
  3. 進入圖二的檔案夾中的tools檔案夾,如下
    用Tiny-YOLO-V4 和YOLO-V4 在移動端跑自己訓練的模型如何在移動端跑自己訓練的資料 Tiny-YOLO-V4 和YOLO-V4進行目标檢測 ncnn平台 Linux系統
  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.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就實作用自己的模型檢測目标了
    用Tiny-YOLO-V4 和YOLO-V4 在移動端跑自己訓練的模型如何在移動端跑自己訓練的資料 Tiny-YOLO-V4 和YOLO-V4進行目标檢測 ncnn平台 Linux系統

補充:

有幾個小夥伴問我自己的label沒有改掉啊,這怎麼改,其實看這裡

用Tiny-YOLO-V4 和YOLO-V4 在移動端跑自己訓練的模型如何在移動端跑自己訓練的資料 Tiny-YOLO-V4 和YOLO-V4進行目标檢測 ncnn平台 Linux系統

繼續閱讀