如何在移動端跑自己訓練的資料 Tiny-YOLO-V4 和YOLO-V4進行目标檢測 ncnn平台 Linux系統
- tiny-yolov4剛出沒幾天,想在移動端跑一下tiny-yolo,但是opencv不給力啊,還不支援yolo-v4
- 結果昨天騰訊釋出了支援tiny-yolo-v4的
…………emmmmmmmmmmmmmmmmdarknet2ncnn
- 于是果斷換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 <解壓後的檔案夾>
-
這裡就是給系統添加個環境變量VULKAN_SDK=解壓後檔案夾中的x86_64路徑export VULKAN_SDK=pwd/1.1.114.0/x86_64
三、編譯
-
進入之前建立的ncnn-TinyYoloV4檔案夾中cd ncnn-TinyYoloV4
-
進入clone的檔案夾中cd nccv
-
建立build檔案夾mkdir -p build
-
cd build
-
cmake出來的東西在build檔案夾中cmake ..
-
nvcc編譯的結果都在build 檔案夾中了make -j4
四、運作YOLO-V4的檢測
1、檢測前要了解的知識
- make完成之後,在build檔案夾中有個examples的檔案夾,進去看到有各種編譯好的網絡,其中就有yolov4
圖-1
- 這裡解釋一下這些檔案是從哪裡編譯來的:在git clone下來的ncnn檔案夾中的examples檔案夾中
圖-2
- 裡面應該是這樣
圖-3
- 是以各種網絡都是通過編譯圖3中的
檔案才有了圖1中的各種可直接運作的模型.cpp
注意:
- 其中方框圈起來的.cpp都是ncnn官方提供所支援的網絡
- 圓圈圈起來的兩個檔案是
權重和參數檔案,其中squeexenet
-
檔案是權重相當于yolo的.bin
.weights
-
是網絡的參數檔案,相當于yolo中的.param
檔案.cfg
-
- 主要是告訴大家ncnn的訓練檔案是哪種格式,這個在下面訓練自己資料集時要進行格式轉換
2、進行檢測
官方提供了訓練好的樣闆
.bin
和
.param
,點選這裡下載下傳,也何以下載下傳我上傳的(内含yolov4的
.bin
+
.param
和yolov4-Tiny的
.bin
+
.param
)
解壓後是這4個檔案
圖-4
yolov4-Tiny的運作
- 把圖4中的
和yolov4-tiny-opt.param
複制到圖1檔案夾中,進入圖1檔案夾中(也就是ncnn-TinyYoloV4->ncnn->build->examples)yolov4-tiny-opt.bin
- 在加入一張圖檔,假設名字是
test.jpg
- 執行指令
即可得到運作結果,如下所示./yolov4 test.jpg
yolov4-的運作
- 跑yolov4也是這個方法,把對應的的
和yolov4-opt.param
複制到圖1檔案夾中yolov4-opt.bin
- 把上一步複制過去的兩個檔案的名字改了,改成對應的
和yolov4-tiny-opt.param
(為啥下面會說)yolov4-tiny-opt.bin
- 執行指令
即可得到運作結果,如下所示 果然滿配的yolov4相比tiny版就是準确度高不少./yolov4 test.jpg
如何運作自己的模型
- 首先自己得有模型啊,不會用darknet train模型的看這篇部落格
- 自己有模型之後,也就是有了自己的
和.weights
檔案之後,OK記得要把.cfg
檔案的.cfg
,batch=1
設定好subdivisions=1
- 進入圖二的檔案夾中的tools檔案夾,如下
- 進入darknet檔案夾:目前位置是(ncnn-TinyYoloV4->ncnn->tools->darknet)
- 在裡面你會看到這個檔案
這個檔案就是可以将darknet的darknet2ncnn.cpp
和.weights
檔案轉換為.cfg
和.bin
的函數,此函數沒有任何依賴,且支援yolov4和yolov4-tiny.param
-
進行轉換:
假設已有的兩個檔案是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
兩個檔案即為ncnn可以使用的權重和參數,yolov4-tiny-opt.bin
- 把
和yolov4-tiny-opt.param
移動到(ncnn-TinyYoloV4->ncnn->build->examples)下,運作./yolov4 test.jpg就實作用自己的模型檢測目标了yolov4-tiny-opt.bin
補充:
有幾個小夥伴問我自己的label沒有改掉啊,這怎麼改,其實看這裡