下面展示100ASK_V853-PRO開發板部署YOLOV5模型的效果圖:
百問網100ASK_V853-PRO開發板購買,請使用淘寶掃一掃下面二維碼:
下面展示100ASK-V853-PRO開發板端側部署YOLOV5模型的全流程教程
1.配置yolov5環境
yolov5搭建環境指南:https://forums.100ask.net/t/topic/3670
yolov5官方網址為:https://github.com/ultralytics/yolov5
使用Git工具在任意目錄下獲取源碼V6.0版本,輸入
git clone -b v6.0 https://github.com/ultralytics/yolov5
如果您使用Git下載出現問題,也可以直接點擊下面網址直接下載源碼壓縮包,下載完成解壓即可正常使用。
https://github.com/ultralytics/yolov5/archive/refs/tags/v6.0.zip
等待下載完成,下載完成后會在當前目錄下,查看到yolov5項目文件夾
100askTeam@DESKTOP-F46NFJT MINGW64 /d/Programmers/ModelDeployment/2.yolov5 $ ls yolov5/ 100askTeam@DESKTOP-F46NFJT MINGW64 /d/Programmers/ModelDeployment/2.yolov5 $ cd yolov5/ 100askTeam@DESKTOP-F46NFJT MINGW64 /d/Programmers/ModelDeployment/2.yolov5/yolov5 (master) $ ls CITATION.cff README.zh-CN.md detect.py requirements.txt tutorial.ipynb CONTRIBUTING.md benchmarks.py export.py segment/ utils/ LICENSE classify/ hubconf.py setup.cfg val.py README.md data/ models/ train.py
打開Anaconda Prompt (Anaconda3)軟件,進入yolov5項目目錄中,輸入以下命令
(base) C:Users100askTeam>D: (base) D:>cd D:ProgrammersModelDeployment2.yolov5yolov5 (base) D:ProgrammersModelDeployment2.yolov5yolov5>
使用conda創建yolov項目環境,輸入
conda create -n my-yolov5-env python=3.7
激活yolov5環境
conda activate my-yolov5-env
安裝依賴
pip install -U -r requirements.txt -i https://pypi.doubanio.com/simple/
FAQ:
搭建環境時由于版本的不同會遇各種問題,下面我會提供我配置好的環境所需的包文件版本,文件位于壓縮包的requirements文件夾中的conda-yolov5_6-env.yaml。在Conda終端中創建新環境,執行
conda env create -f conda-yolov5_6-env.yaml
執行python detect.py
,測試環境是否搭建成功,執行后會自動下載模型權重文件
這里下載速度可能會很慢,建議直接訪問官網下載https://github.com/ultralytics/yolov5/tree/v6.0,點擊下圖紅框處的YOLOV5s。這里我下載 v6.0 版本的 yolov5s.onnx 模型作為示例。
下載地址:https://github.com/ultralytics/yolov5/releases/download/v6.0/yolov5s.pt
點進入后會進去yolov5資源中心,往下找到V6.0版本的資源下載界面,找到您所需的資源即可。
將該模型文件放在yolov5項目文件夾下,如下圖所示:
在conda終端中輸入python detect.py
,可得到如下執行結果
(my-yolov5-env) D:ProgrammersModelDeployment2.yolov5yolov5-6.0>python detect.py detect: weights=yolov5s.pt, source=dataimages, imgsz=[640, 640], conf_thres=0.25, iou_thres=0.45, max_det=1000, device=, view_img=False, save_txt=False, save_conf=False, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False, visualize=False, update=False, project=runsdetect, name=exp, exist_ok=False, line_thickness=3, hide_labels=False, hide_conf=False, half=False, dnn=False YOLOv5 2021-10-12 torch 2.0.1+cpu CPU Fusing layers... D:Anaconda3envsmy-yolov5-envlibsite-packages orchfunctional.py UserWarning: torch.meshgrid: in an upcoming release, it will be required to pass the indexing argument. (Triggered internally at C:actions-runner\_workpytorchpytorchuilderwindowspytorchatensrcATen ativeTensorShape.cpp:3484.) return _VF.meshgrid(tensors, **kwargs) # type: ignore[attr-defined] Model Summary: 213 layers, 7225885 parameters, 0 gradients image 1/2 D:ProgrammersModelDeployment2.yolov5yolov5-6.0dataimagesus.jpg: 640x480 4 persons, 1 bus, Done. (0.274s) image 2/2 D:ProgrammersModelDeployment2.yolov5yolov5-6.0dataimageszidane.jpg: 384x640 2 persons, 1 tie, Done. (0.189s) Speed: 4.5ms pre-process, 231.3ms inference, 2.8ms NMS per image at shape (1, 3, 640, 640) Results saved to runsdetectexp1
FAQ:
如果您執行此命令時,遇到如下報錯:
原因:torch版本過高,可以通過修改代碼或者降低版本。
下面我使用修改代碼的方式解決:
修改
D:Anaconda3envsmy-yolov5-envlibsite-packages orch nmodulesupsampling.p
文件中的Upsample類中forward函數的返回值。
原本:
def forward(self, input: Tensor) -> Tensor: return F.interpolate(input, self.size, self.scale_factor, self.mode, self.align_corners, recompute_scale_factor=self.recompute_scale_factor)
修改后:
def forward(self, input: Tensor) -> Tensor: return F.interpolate(input, self.size, self.scale_factor, self.mode, self.align_corners)
修改結果如下圖所示:
執行python detect.py
完成后,可以在yolov5項目文件夾下的runsdetectexp1目錄下找到執行后的輸出結果,如下所示。
2.導出yolov5 ONNX模型
2.1 export程序導出模型
在export.py程序找到parse_opt函數,查看默認輸出的模型格式。如果默認支持有onnx格式,就無需修改,如果默認沒有填寫onnx,修改默認格式為onnx格式。
執行export.py函數前需要需要確保已經安裝了onnx包,可手動安裝,如下所示
pip install onnx==1.12.0 -i https://pypi.doubanio.com/simple/
執行export.py函數導出yolov5的onnx格式動態模型,在conda終端輸入
python export.py --weights yolov5s.pt --include onnx --dynamic
執行完成后會在yolov5項目目錄中生成一個名稱為yolov5s.onnx
的文件,如下圖所示:
2.2 簡化模型
由于轉換的模型是動態 Shape 的,不限制輸入圖片的大小,對于 NPU 來說會增加處理工序,所以這里我們需要轉換為靜態 Shape 的模型。
需要安裝 onnxsim
工具,在conda終端輸入
pip install onnxsim -i https://pypi.doubanio.com/simple/
然后使用這條命令轉換:
python -m onnxsim yolov5s.onnx yolov5s-sim.onnx --input-shape 1,3,640,640
執行完成后會導出名為yolov5s-sim.onnx
文件,文件位于yolov5項目文件夾下,如下圖所示:
2.3 查看模型
使用開源網站Netron網站
https://netron.app/
訪問上面網址查看模型結構。
選擇yolov5s-sim.onnx
文件,點擊打開。
查看如下圖所示輸出節點
可看到模型有 4 個輸出節點,其中 ouput 節點為后處理解析后的節點;在實際測試的過程中,發現 NPU 量化操作后對后處理的運算非常不友好,輸出數據偏差較大,所以我們可以將后處理部分放在 CPU 運行;因此保留 350
,498
,646
三個后處理解析前的輸出節點即可,后文在導入模型時修改輸出節點。
3.轉換NPU模型
3.1 創建轉換目錄
打開NPU工具包的虛擬機Ubuntu20.04,創建yolov5-6.0文件夾,存放模型和量化圖像等。
ubuntu@ubuntu2004:~$ mkdir yolov5-6.0
進入yolov5模型轉換目錄。
ubuntu@ubuntu2004:~$ cd yolov5-6.0/
創建data目錄存放量化圖像
mkdir data
將量化圖像傳入data文件夾下,例如,傳入test01.jpg
圖像到data
ubuntu@ubuntu2004:~/yolov5-test$ ls data test01.jpg
在yolov5模型轉換目錄中創建dataset.txt
ubuntu@ubuntu2004:~/yolov5-6.0$ touch dataset.txt
修改dataset.txt
文件
ubuntu@ubuntu2004:~/yolov5-6.0$ vi dataset.txt
在dataset.txt
文件中增加量化圖片的路徑.
./data/test01.jpg
將yolov5s-sim.onnx
模型傳入yolov5模型轉換文件夾下。例如:
ubuntu@ubuntu2004:~/yolov5-6.0$ ls data dataset.txt yolov5s-sim.onnx
工作目錄的文件如下所示:
ubuntu@ubuntu2004:~/yolov5-6.0$ tree . ├── data │ └── test01.jpg ├── dataset.txt └── yolov5s-sim.onnx 1 directory, 3 files
3.2 導入模型
導入模型前需要知道我們要保留的輸出節點,由之前查看到我們輸出的三個后處理節點為:350
,498
,646
。
pegasus import onnx --model yolov5s-sim.onnx --output-data yolov5s-sim.data --output-model yolov5s-sim.json --outputs 350 498 646
導入生成兩個文件,分別是是 yolov5s-sim.data
和 yolov5s-sim.json
文件,兩個文件是 YOLO V5 網絡對應的芯原內部格式表示文件,data
文件儲存權重,cfg
文件儲存模型。
3.3生成 YML 文件
YML 文件對網絡的輸入和輸出的超參數進行描述以及配置,這些參數包括,輸入輸出 tensor 的形狀,歸一化系數 (均值,零點),圖像格式,tensor 的輸出格式,后處理方式等等
pegasus generate inputmeta --model yolov5s-sim.json --input-meta-output yolov5s-sim_inputmeta.yml
pegasus generate postprocess-file --model yolov5s-sim.json --postprocess-file-output yolov5s-sim_postprocess_file.yml
修改 yolov5s-sim_inputmeta.yml
文件中的的 scale
參數為 0.0039216(1/255)
,目的是對輸入 tensor
進行歸一化,和網絡進行訓練的時候是對應的。
vi yolov5s-sim_inputmeta.yml
3.4 量化
生成量化表文件,使用非對稱量化,uint8,修改 --batch-size
參數為你的 dataset.txt
里提供的圖片數量。
pegasus quantize --model yolov5s-sim.json --model-data yolov5s-sim.data --batch-size 1 --device CPU --with-input-meta yolov5s-sim_inputmeta.yml --rebuild --model-quantize yolov5s-sim.quantize --quantizer asymmetric_affine --qtype uint8
3.5 預推理
利用前文的量化表執行預推理,得到推理 tensor
pegasus inference --model yolov5s-sim.json --model-data yolov5s-sim.data --batch-size 1 --dtype quantized --model-quantize yolov5s-sim.quantize --device CPU --with-input-meta yolov5s-sim_inputmeta.yml --postprocess-file yolov5s-sim_postprocess_file.yml
3.6 導出模板代碼與模型
輸出的模型可以在 ovxilb/yolov5s-sim_nbg_unify
文件夾中找到network_binary.nb
文件。
pegasus export ovxlib --model yolov5s-sim.json --model-data yolov5s-sim.data --dtype quantized --model-quantize yolov5s-sim.quantize --batch-size 1 --save-fused-graph --target-ide-project 'linux64' --with-input-meta yolov5s-sim_inputmeta.yml --output-path ovxilb/yolov5s-sim/yolov5s-simprj --pack-nbg-unify --postprocess-file yolov5s-sim_postprocessmeta.yml --optimize "VIP9000PICO_PID0XEE" --viv-sdk ${VIV_SDK}
將生成的network_binary.nb
文件拷貝出來備用。
4.YOLOV5端側部署
4.1 配置yolov5端側部署環境
在進行端側部署前,由于后處理需要使用OpenCV庫,所以請先按照如下步驟
-
配置NPU拓展包:https://forums.100ask.net/t/topic/3224
-
配置OpenCV庫:https://forums.100ask.net/t/topic/3349
配置完成后才能編譯端側部署程序。
下載source
壓縮包中的yolov5.tar.gz
,將該壓縮包拷貝到虛擬機中,解壓壓縮包
tar -xzvf yolov5.tar.gz
將解壓出來的文件夾拷貝到tina-v853-open/openwrt/package/npu/
目錄下
cp yolov5/ ~/workspaces/tina-v853-open/openwrt/package/npu/ -rf
注意:上面的~/workspaces/tina-v853-open/openwrt/package/npu/
目錄需要更換為您自己的SDK實際的目錄。
拷貝完成后,如下所示:
book@100ask:~/workspaces/tina-v853-open/openwrt/package/npu$ ls lenet viplite-driver vpm_run yolov3 yolov5
4.2 編譯端側部署代碼
配置編譯環境
book@100ask:~/workspaces/tina-v853-open$ source build/envsetup.sh ... book@100ask:~/workspaces/tina-v853-open$ lunch You're building on Linux Lunch menu... pick a combo: 1 v853-100ask-tina 2 v853-vision-tina Which would you like? [Default v853-100ask]: 1 ...
進入Tina配置界面
book@100ask:~/workspaces/tina-v853-open$ make menuconfig
進入如下目錄,選中yolov5后即可編譯端側部署程序
> 100ask > NPU <*> yolov5....................................................... yolov5 demo <*> yolov5-model...................................... yolov5 test demo model
注意:yolov5-model該選擇后會將yolov5_model.nb打包進鏡像中,該模型文件會在/etc/models/目錄下。
保存并退出Tina配置界面。
編譯Tina SDK鏡像,編譯完成后打包生成鏡像
book@100ask:~/workspaces/tina-v853-open$ make ... book@100ask:~/workspaces/tina-v853-open$ pack
注意:如果您將模型打包進鏡像中,可能會出現文件系統大小設置值太小的問題們可以參考https://forums.100ask.net/t/topic/3158解決。
打包完成后,使用全志燒寫工具進行燒寫新鏡像,如果您還不會燒寫系統,請參考:https://forums.100ask.net/t/topic/3403
4.3 測試yolov5端側部署
測試圖像文件要求:
-
圖片
-
尺寸:640*640
開發板端:
使用ADB將測試圖片傳輸到開發板上,將USB0的模式切換到 Device 模式
cat /sys/devices/platform/soc/usbc0/usb_device
主機端:
將ADB設備連接上虛擬機,并將虛擬機中的測試圖片傳輸到開發板中,查看ADB設備
book@100ask:~/workspaces/testImg$ adb devices List of devices attached 20080411device
查看需要傳輸的文件
book@100ask:~/workspaces/testImg$ ls bus_640-640.jpg bus_640-640.jpg
傳輸文件到開發板中
book@100ask:~/workspaces/testImg$ adb push bus_640-640.jpg /mnt/UDISK bus_640-640.jpg: 1 file pushed. 0.7 MB/s (97293 bytes in 0.128s)
開發板端:
進入測試圖像目錄
root@TinaLinux:/# cd /mnt/UDISK/ root@TinaLinux:/mnt/UDISK# ls bus_640-640.jpg lost+found overlay
yolov5程序參數要求:yolov5 <模型文件路徑> <測試圖像路徑>
如果您打包了默認的yolov5模型文件,可以輸入
yolov5 /etc/models/yolov5_model.nb ./bus_640-640.jpg
如果您需要選擇自己的模型文件進行測試,可以將上面的/etc/models/yolov5_model.nb
更換為自己的模型路徑,下面我以默認的模型文件進行測試。
查看輸出圖像文件yolov5_out.jpg
root@TinaLinux:/mnt/UDISK# ls bus_640-640.jpg lost+found overlay yolov5_out.jpg
主機端:
拉取輸出文件yolov5_out.jpg
到當前文件夾下
book@100ask:~/workspaces/testImg$ adb pull /mnt/UDISK/yolov5_out.jpg ./ /mnt/UDISK/yolov5_out.jpg: 1 file pulled. 0.9 MB/s (184894 bytes in 0.202s)
-
開發板
+關注
關注
25文章
5032瀏覽量
97372 -
模型
+關注
關注
1文章
3226瀏覽量
48807
原文標題:百問網V853開發板端側部署YOLOV5 全流程教程
文章出處:【微信號:baiwenkeji,微信公眾號:百問科技】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論