衡阳派盒市场营销有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

V853端側部署YOLOV5訓練自定義模型全流程教程

百問科技 ? 來源:百問科技 ? 2023-06-30 16:07 ? 次閱讀

這里以百問網開發板為檢測目標,下面展示端側檢測效果

68639c56-1712-11ee-962d-dac502259ad0.png

68d29dd6-1712-11ee-962d-dac502259ad0.png

69164b76-1712-11ee-962d-dac502259ad0.png

下面操作僅演示如何去訓練自定義模型、導出模型、轉換模型、模型部署。注意:訓練模型對于電腦需要有一定的要求,如果電腦性能較弱可能會導致訓練效果較差,從而導致模型精度較低。

參考鏈接:

https://docs.ultralytics.com/yolov5/tutorials/train_custom_data/

1.下載數據標注工具

數據標注工具:https://github.com/heartexlabs/labelImg/releases

69696888-1712-11ee-962d-dac502259ad0.png

點擊上述紅框下載,下載完成后解壓壓縮包,雙擊打開labelImg.exe文件。

6991c01c-1712-11ee-962d-dac502259ad0.png

打開后等待運行,運行完成后會進入如下標注工作界面。

69a31cd6-1712-11ee-962d-dac502259ad0.png

關于LabelImg更多的使用方法,請訪問:https://github.com/heartexlabs/labelImg

由于LabelImg會預先提供一些類供您使用,需要手動刪除這些類,使得您可以標注自己的數據集。步驟如下所示:

69b9bdb0-1712-11ee-962d-dac502259ad0.gif

進入LabelImg程序目錄中的data目錄中,打開predefined_classes.txt文件,刪除文件中所有預定義的類后保存并退出即可。

2.創建數據集目錄

在任意工作目錄中創建images文件夾和labels文件夾分別存放圖像數據集和標注信息。這里我演示僅使用少量圖像樣本進行標注,在實際項目中需要采集足夠的圖像進行標注才拿滿足模型的準確率和精度。

例如我在100ask-yolov5-image目錄中創建有images文件夾和labels文件夾,如下所示,創建images文件,存放圖像數據集,創建labels文件夾,該文件夾用于后續存放標注數據。

6a45eed4-1712-11ee-962d-dac502259ad0.gif

3.標注圖像

打開LabelImg軟件后,使用軟件打開數據集圖像文件夾,如下所示:

6a9fe65a-1712-11ee-962d-dac502259ad0.gif

打開后,修改輸出label的文件夾為我們創建的數據集目錄下的labels文件夾

6ae1c6c4-1712-11ee-962d-dac502259ad0.gif

下面我演示標注過程,以百問網的開發板為例,標注三塊開發板


標注過程見原文鏈接

當你點擊Save后即表示標注完成,標注完成后后會在labels目錄下生成classes.txt(類別)和圖像中標注的類別即位置信息。

下面為LabelImg快捷鍵目錄

Ctrl + u Load all of the images from a directory
Ctrl + r Change the default annotation target dir
Ctrl + s Save
Ctrl + d Copy the current label and rect box
Ctrl + Shift + d Delete the current image
Space Flag the current image as verified
w Create a rect box
d Next image
a Previous image
del Delete the selected rect box
Ctrl++ Zoom in

經過標注大量的圖像后,labels文件夾如下圖所示

6b36f342-1712-11ee-962d-dac502259ad0.gif

4.劃分訓練集和驗證集

在模型訓練中,需要有訓練集和驗證集。可以簡單理解為網絡使用訓練集去訓練,訓練出來的網絡使用驗證集驗證。在總數據集中訓練集通常應占80%,驗證集應占20%。所以將我們標注的數據集按比例進行分配。

在yolov5-6.0項目目錄下創建100ask文件夾(該文件夾名可自定義),在100ask文件夾中創建train文件夾(存放訓練集)和創建val文件夾(存放驗證集)

6bbd3baa-1712-11ee-962d-dac502259ad0.gif

在train文件夾中創建images文件夾和labels文件夾。其中images文件夾存放總數據集的80%的圖像文件,labels文件夾存放與images中的文件對應的標注文件。

6bdbfca2-1712-11ee-962d-dac502259ad0.gif

在val文件夾中創建images文件夾和labels文件夾。其中images文件夾存放總數據集的20%的圖像文件,labels文件夾存放與images中的文件對應的標注文件。

6bbd3baa-1712-11ee-962d-dac502259ad0.gif

5.創建數據集配置文件

進入yolov5-6.0data目錄下,創建data.yaml,文件內容如下所示:

train: 100ask	rainimages  # train images 
val: 100askvalimages  # val images

nc: 3  # number of classes
names: ['T113', 'K510', 'V853']  # class names

6cb46358-1712-11ee-962d-dac502259ad0.gif

6.創建模型配置文件

進入models目錄下,拷貝yolov5s.yaml文件,粘貼并models目錄下重命名為100ask_my-model.yaml,例如:

6cdfa6e4-1712-11ee-962d-dac502259ad0.gif

修改100ask_my-model.yaml中類的數目為自己訓練模型的類數目。

6.修改訓練函數

打開yolov5-6.0項目文件夾中的train.py,修改數據配置文件路徑,如下圖紅框所示:

parser.add_argument('--cfg', type=str, default='models/100ask_my-model.yaml', help='model.yaml path')
parser.add_argument('--data', type=str, default=ROOT / 'data/data.yaml', help='dataset.yaml path')

7.訓練模型

在conda終端的激活yolov5環境,激活后進入yolov5-6.0項目文件夾。執行python train.py,如下圖所示:

6d0d9536-1712-11ee-962d-dac502259ad0.png

程序默認迭代300次,等待訓練完成...

6d4145fc-1712-11ee-962d-dac502259ad0.png

訓練完成后結果會保存在runs rain目錄下最新一次的訓練結果,如上圖所示,此次訓練的最好模型和最后訓練的模型保存在以下目錄中

runs	rainexp7weights

8.驗證模型

修改val.py函數,修改如下

   parser.add_argument('--data', type=str, default=ROOT / 'data/data.yaml', help='dataset.yaml path')
   parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'runs/train/exp7/weights/best.pt', help='model.pt path(s)')

6d5e4fda-1712-11ee-962d-dac502259ad0.png

修改models文件夾下的yolo.py

class Model(nn.Module):
   def __init__(self, cfg='100ask_my-model.yaml', ch=3, nc=None, anchors=None):  # model, input channels, number of classes

6db76bc4-1712-11ee-962d-dac502259ad0.png

打開conda終端輸入python val.py

6dd4d470-1712-11ee-962d-dac502259ad0.png

執行完成后的結果保存在runsvalexp文件下。

6df3fa30-1712-11ee-962d-dac502259ad0.gif

9.預測圖像

在data目錄中新建100ask-images文件夾存放待檢測的圖像和視頻文件。

修改detect.py函數中,模型的路徑與檢測圖像路徑。

parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'runs/train/exp7/weights/best.pt', help='model path(s)')
parser.add_argument('--source', type=str, default=ROOT / 'data/100ask-images', help='file/dir/URL/glob, 0 for webcam')

6f9c3014-1712-11ee-962d-dac502259ad0.png

檢測效果如下圖所示:

6fbf3e56-1712-11ee-962d-dac502259ad0.jpg

10.導出ONNX模型

修改export.py函數

parser.add_argument('--data', type=str, default=ROOT / 'data/data.yaml', help='dataset.yaml path')
parser.add_argument('--weights', type=str, default=ROOT / 'runs/train/exp7/weights/best.pt', help='weights path')

6fe7c75e-1712-11ee-962d-dac502259ad0.png

在conda終端輸入:

python export.py --include onnx --dynamic

7009ef82-1712-11ee-962d-dac502259ad0.png

導出的模型會與輸入的模型位于同一路徑下,假設我輸入的模型位于:runs rainexp7weights

70423dc4-1712-11ee-962d-dac502259ad0.png

11.簡化模型

簡化模型前需要用到onnxruntime依賴包,輸入以下命令安裝:

pip install onnxruntime==1.13.1 -i https://pypi.doubanio.com/simple/

簡化命令如下:

python -m onnxsim <輸入模型> <輸出模型> --input-shape <輸入圖像尺寸>

例如:

輸入模型路徑為runs/train/exp7/weights/best.onnx,輸出模型路徑為runs/train/exp7/weights/best-sim.onnx

輸入圖像尺寸固定為640x640。

python -m onnxsim runs/train/exp7/weights/best.onnx runs/train/exp7/weights/best-sim.onnx --input-shape 1,3,640,640

706219be-1712-11ee-962d-dac502259ad0.png

13.查看模型

訪問:https://netron.app/

7096218c-1712-11ee-962d-dac502259ad0.png

可以看到輸入已經固定為640x640,可看到模型有 4 個輸出節點,其中 ouput 節點為后處理解析后的節點;在實際測試的過程中,發現 NPU 量化操作后對后處理的運算非常不友好,輸出數據偏差較大,所以我們可以將后處理部分放在 CPU 運行;因此在導入模型時保留 350498646 三個后處理解析前的輸出節點即可。

14.驗證模型

模型需要修改為簡化后的模型路徑。

新建文件夾存放固定的輸入圖像尺寸。假設上述中我設置輸入圖像尺寸為640x640,那么此時我在data目錄下新建100ask-images-640文件夾存放640x640的圖像作為待測數據。

修改detect.py函數

   parser.add_argument('--weights', nargs='+', type=str, default=ROOT / 'runs/train/exp7/weights/best-sim.onnx', help='model path(s)')
   parser.add_argument('--source', type=str, default=ROOT / 'data/100ask-images-640', help='file/dir/URL/glob, 0 for webcam')

70c439e6-1712-11ee-962d-dac502259ad0.png

在conda終端輸入:

python detect.py

70efce44-1712-11ee-962d-dac502259ad0.png

通過輸出信息可知:檢測結果存儲在runsdetectexp6

檢測結果如下:

711b4aba-1712-11ee-962d-dac502259ad0.png

15.轉換模型

15.1 創建工作目錄

將簡化后的best-sim.onnx模型傳入配置到NPU模型轉換工具的虛擬機中,創建模型工具目錄,包含模型文件,量化文件夾data(存放量化圖片),dataset.txt文件(存放量化圖片的路徑)。

buntu@ubuntu2004:~/100ask-yolov5-test$ tree
.
├── best-sim.onnx
├── data
│ └── test01.jpg
└── dataset.txt

1 directory, 5 files

工作目錄如下所示:

716a45b6-1712-11ee-962d-dac502259ad0.gif

15.2 導入模型

導入模型前需要知道我們要保留的輸出節點,由之前查看到我們輸出的三個后處理節點為:350498646

pegasus import onnx --model best-sim.onnx --output-data best-sim.data --output-model best-sim.json --outputs "350 498 646"

導入生成兩個文件,分別是是 yolov5s-sim.datayolov5s-sim.json 文件,兩個文件是 YOLO V5 網絡對應的芯原內部格式表示文件,data 文件儲存權重,cfg 文件儲存模型。

7197d17a-1712-11ee-962d-dac502259ad0.gif

15.3 生成 YML 文件

YML 文件對網絡的輸入和輸出的超參數進行描述以及配置,這些參數包括,輸入輸出 tensor 的形狀,歸一化系數 (均值,零點),圖像格式,tensor 的輸出格式,后處理方式等等

pegasus generate inputmeta --model best-sim.json --input-meta-output best-sim_inputmeta.yml

72d80d48-1712-11ee-962d-dac502259ad0.gif

pegasus generate postprocess-file --model best-sim.json --postprocess-file-output best-sim_postprocess_file.yml

73064c3a-1712-11ee-962d-dac502259ad0.gif

修改 best-sim_inputmeta.yml 文件中的的 scale 參數為 0.0039216(1/255),目的是對輸入 tensor 進行歸一化,和網絡進行訓練的時候是對應的。

vi best-sim_inputmeta.yml

修改過程如下圖所示:

733edeec-1712-11ee-962d-dac502259ad0.gif

15.4 量化

生成量化表文件,使用非對稱量化,uint8,修改 --batch-size 參數為你的 dataset.txt 里提供的圖片數量。如果原始網絡使用固定的batch_size,請使用固定的batch_size,如果原始網絡使用可變batch_size,請將此參數設置為1。

pegasus quantize --model best-sim.json --model-data best-sim.data --batch-size 1 --device CPU --with-input-meta best-sim_inputmeta.yml --rebuild --model-quantize best-sim.quantize --quantizer asymmetric_affine --qtype uint8

73af32d2-1712-11ee-962d-dac502259ad0.gif

15.5 預推理

利用前文的量化表執行預推理,得到推理 tensor

pegasus inference --model best-sim.json --model-data best-sim.data --batch-size 1 --dtype quantized --model-quantize best-sim.quantize --device CPU --with-input-meta best-sim_inputmeta.yml --postprocess-file best-sim_postprocess_file.yml

74108e42-1712-11ee-962d-dac502259ad0.gif

15.6 導出模板代碼與模型

輸出的模型可以在 ovxilb/100ask-best-sim_nbg_unify 文件夾中找到network_binary.nb模型文件。

pegasus export ovxlib --model best-sim.json --model-data best-sim.data --dtype quantized --model-quantize best-sim.quantize --batch-size 1 --save-fused-graph --target-ide-project 'linux64' --with-input-meta best-sim_inputmeta.yml --output-path ovxilb/100ask-best-sim/100ask-simprj --pack-nbg-unify --postprocess-file best-sim_postprocessmeta.yml --optimize "VIP9000PICO_PID0XEE" --viv-sdk ${VIV_SDK}

752adcba-1712-11ee-962d-dac502259ad0.gif

可以進入下圖所示目錄中將network_binary.nb模型文件拷貝出來備用。

76474a5c-1712-11ee-962d-dac502259ad0.gif

16.端側部署

這里引用上一篇《100ASK-V853-PRO開發板支持yolov5模型部署》我們編寫的yolov5端側部署程序,這里進入端側部署程序文件夾中拷貝一份新程序進行修改。主要修改vnn_post_process.cpp程序。

16.1 修改draw_objects函數

修改draw_objects函數中的類名,這里我訓練的模型的類別分別是T113、K510、V853

76b6058c-1712-11ee-962d-dac502259ad0.png

類別名稱需要yolov5-6.0項目data目錄下data.yaml對應

76d7774e-1712-11ee-962d-dac502259ad0.png

16.2 修改generate_proposals函數

修改generate_proposals函數中的類類別數量為您類別數量。假設我訓練的類別總共有T113、K510、V853,這3個類別,修改為3即可。

76efd8c0-1712-11ee-962d-dac502259ad0.png

修改后的文件如下所示:

771b7a7a-1712-11ee-962d-dac502259ad0.gif

16.3 編譯

 book@100ask:~/workspaces/tina-v853-open$ source build/envsetup.sh
 ...
 book@100ask:~/workspaces/tina-v853-open$ lunch
 ...1
 ...

進入menuconfig,輸入

make menuconfig

進入如下目錄中,選中yolov5-100ask配置,

> 100ask 
    > NPU
        <*> yolov5-100ask......................................... yolov5-100ask demo

778acf56-1712-11ee-962d-dac502259ad0.png

編譯并生成鏡像

 book@100ask:~/workspaces/tina-v853-open$ make
 ...
 book@100ask:~/workspaces/tina-v853-open$ pack

編譯完成后使用全志燒寫工具燒錄鏡像。

16.4 測試

主機端:

傳入640*640的圖像文件和network_binary.nb模型文件

book@100ask:~/workspaces/testImg$ adb push test-100ask.jpg /mnt/UDISK
test-100ask.jpg: 1 file pushed. 0.6 MB/s (51039 bytes in 0.078s)
book@100ask:~/workspaces/testImg$ adb push network_binary.nb /mnt/UDISK
network_binary.nb: 1 file pushed. 0.7 MB/s (7409024 bytes in 10.043s)

開發板端:

進入/mnt/UDISK/目錄下

root@TinaLinux:/# cd /mnt/UDISK/
root@TinaLinux:/mnt/UDISK# ls
lost+found     network_binary.nb  overlay       test-100ask.jpg

運行yolov5檢測程序

yolov5-100ask network_binary.nb test-100ask.jpg

77b54114-1712-11ee-962d-dac502259ad0.png

執行完成后會在當前目錄下生成輸出文件yolov5_out.jpg

root@TinaLinux:/mnt/UDISK# ls
lost+found     overlay       yolov5_out.jpg
network_binary.nb  test-100ask.jpg

主機端:

拉取開發板端的輸出圖像yolov5_out.jpg

book@100ask:~/workspaces/testImg$ adb pull /mnt/UDISK/yolov5_out.jpg ./
/mnt/UDISK/yolov5_out.jpg: 1 file pulled. 0.8 MB/s (98685 bytes in 0.116s)

17.檢測效果圖

77e00be2-1712-11ee-962d-dac502259ad0.png


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 圖像
    +關注

    關注

    2

    文章

    1089

    瀏覽量

    40571
  • 模型
    +關注

    關注

    1

    文章

    3305

    瀏覽量

    49217
  • 數據集
    +關注

    關注

    4

    文章

    1209

    瀏覽量

    24829

原文標題:V853端側部署YOLOV5訓練自定義模型 全流程教程

文章出處:【微信號:baiwenkeji,微信公眾號:百問科技】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    基于YOLOv8實現自定義姿態評估模型訓練

    Hello大家好,今天給大家分享一下如何基于YOLOv8姿態評估模型,實現在自定義數據集上,完成自定義姿態評估模型
    的頭像 發表于 12-25 11:29 ?2932次閱讀
    基于<b class='flag-5'>YOLOv</b>8實現<b class='flag-5'>自定義</b>姿態評估<b class='flag-5'>模型</b><b class='flag-5'>訓練</b>

    maixcam部署yolov5s 自定義模型

    maixcam部署yolov5s 自定義模型 本博客將向你展示零基礎一步步的部署好自己的yolov5
    發表于 04-23 15:43

    龍哥手把手教你學視覺-深度學習YOLOV5

    利用labview部署yolov5導出的模型,能利用攝像頭動態檢測輸出目標檢測結果。根據工業視覺外觀檢測的速度和準確性要求,龍哥視覺結合labview編程平臺推出了labview+yolov5
    發表于 09-03 09:39

    怎樣使用PyTorch Hub去加載YOLOv5模型

    autoshape=False. 要加載具有隨機初始化權重的模型(從頭開始訓練),請使用pretrained=False. 在這種情況下,您必須提供自己的訓練腳本。或者,請參閱我們的 YOLO
    發表于 07-22 16:02

    V853 NPU 轉換部署 YOLO V5 模型

    模型V853 平臺的轉換與部署流程模型的準備YOLO v5 目前開源于 Github,
    發表于 11-29 09:26

    V853 在 NPU 轉換 YOLO V3 模型

    V853開發板購買鏈接:KFB-V853_Allwinner的KFB-V853_KFB-V853[參數 價格 pdf 中文資料]_華秋商城NPU 轉換 YOLO
    發表于 12-19 10:36

    V853常用模型跑分數據

    V853常用模型跑分數據序號算法模型FPSBW(MB/s)1inception_v1(224x224)57.371443.312inception_
    發表于 12-23 09:28

    yolov5訓練部署鏈路教程

    本教程針對目標檢測算法yolov5訓練部署到EASY-EAI-Nano(RV1126)進行說明。
    的頭像 發表于 01-05 18:00 ?3302次閱讀
    <b class='flag-5'>yolov5</b><b class='flag-5'>訓練</b><b class='flag-5'>部署</b><b class='flag-5'>全</b>鏈路教程

    在C++中使用OpenVINO工具包部署YOLOv5模型

    下載并轉換YOLOv5訓練模型的詳細步驟,請參考:《基于OpenVINO?2022.2和蝰蛇峽谷優化并部署YOLOv5
    的頭像 發表于 02-15 16:53 ?5248次閱讀

    使用旭日X3派的BPU部署Yolov5

    本次主要介紹在旭日x3的BPU中部署yolov5。首先在ubuntu20.04安裝yolov5,并運行yolov5并使用pytoch的pt模型
    的頭像 發表于 04-26 14:20 ?967次閱讀
    使用旭日X3派的BPU<b class='flag-5'>部署</b><b class='flag-5'>Yolov5</b>

    【教程】yolov5訓練部署鏈路教程

    本教程針對目標檢測算法yolov5訓練部署到EASY-EAI-Nano(RV1126)進行說明,而數據標注方法可以參考我們往期的文章《Labelimg的安裝與使用》。
    的頭像 發表于 01-29 15:25 ?3543次閱讀
    【教程】<b class='flag-5'>yolov5</b><b class='flag-5'>訓練</b><b class='flag-5'>部署</b><b class='flag-5'>全</b>鏈路教程

    v853參數 v853v853s的差別 v853是什么封裝的

    v853參數 v853v853s的差別 v853是什么封裝的?
    的頭像 發表于 08-21 17:33 ?4320次閱讀

    YOLOv5網絡結構訓練策略詳解

    前面已經講過了Yolov5模型目標檢測和分類模型訓練流程,這一篇講解一下yolov5
    的頭像 發表于 09-11 11:15 ?2385次閱讀
    <b class='flag-5'>YOLOv5</b>網絡結構<b class='flag-5'>訓練</b>策略詳解

    基于YOLOv8的自定義醫學圖像分割

    YOLOv8是一種令人驚嘆的分割模型;它易于訓練、測試和部署。在本教程中,我們將學習如何在自定義數據集上使用
    的頭像 發表于 12-20 10:51 ?847次閱讀
    基于<b class='flag-5'>YOLOv</b>8的<b class='flag-5'>自定義</b>醫學圖像分割

    在樹莓派上部署YOLOv5進行動物目標檢測的完整流程

    卓越的性能。本文將詳細介紹如何在性能更強的計算機上訓練YOLOv5模型,并將訓練好的模型部署到樹
    的頭像 發表于 11-11 10:38 ?1455次閱讀
    在樹莓派上<b class='flag-5'>部署</b><b class='flag-5'>YOLOv5</b>進行動物目標檢測的完整<b class='flag-5'>流程</b>
    博彩百家乐带连线走势图| 实战百家乐十大取胜原因百分百战胜百家乐不买币不吹牛只你能做到按我说的.百家乐基本规则 | 吴忠市| 百家乐官网高手论坛| 网上百家乐真实吗| 威尼斯人娱乐场 新世纪| 恒和国际| 百家乐官网赌场占多大概率| 网上玩百家乐好吗| 大发888注册bet| 百家乐官网娱乐城会员| 黄金城百家乐官网苹果版| 月亮城百家乐的玩法技巧和规则| 东方夏威夷网站| 三亚百家乐官网的玩法技巧和规则 | 大发888熊之舞怎么玩| 百家乐官网开户博彩论坛| 百家乐斗视频游戏| 顶级赌场官方下载| 百家乐官网金海岸| 太阳城百家乐公司| 在线棋牌游戏| 金牌百家乐官网的玩法技巧和规则| 百家乐送钱平台| 澳门百家乐官网有限公司| 皇冠百家乐客户端皇冠| 云鼎娱乐城信誉度| 无锡市| 百家乐游戏程序下载| 大发888 大发888官网| 视频百家乐官网是真是假| 一筒百家乐的玩法技巧和规则| 始兴县| 澳门百家乐现场真人版| 333娱乐| 百家乐路子分析| 利博亚洲| 百家乐平玩法lm0| 大发888真钱娱乐游戏| 百家乐官网国际娱乐网| 威尼斯人娱乐场首页|