圖文講解Atlas 500適配yolov5進行物體檢測丨【我的華為云體驗之旅】

      網友投稿 2891 2022-05-30

      1 yolov5模型概述

      yolov5是 YOLO算法 (You Only Look Once)的第5個版本,YOLO可以說是當前實時對象檢測算法中的佼佼者,它由Redmon等人在2016年的一篇論文中命名的,目前廣泛應用于多種AI 目標對象檢測場景中,可以非常方便的檢測出圖像中的對象類別,比如人、車、動物等。雖然在某些場景下, yolov4的算法推理精度優于目前的yolov5,但是yolov5的某些新特征卻更加具有吸引力。比如,yolov5在檢測平均精度降低不多的基礎上,具有推理模型文件更小,訓練時間和推理速度更短的特點,這樣在對精度要求不高的情況下,采用yolov5在模型構建、模型部署等方面將更加方便,而且推理速度更快。

      官網源碼地址路徑為:? ?https://github.com/ultralytics/yolov5? ?,在官網上也給出了yolov5 (6.0 releases)不同模型(YOLOv5s、YOLOv5m和 YOLOv5n 等)的速度分析對比圖,具體如下所示:

      官網也給出了不同的releases版本文件,可以訪問網址? https://github.com/ultralytics/yolov5/releases 來查看。目前最新的為6.0,但考慮到需要和Atlas 500智能小站適配,這里選擇 4.0 及以下版本。下面給出 4.0 releases的各權重文件的分析對比圖,如下所示:

      從上圖可以看出,YOLOv5s的權重文件(params)只有7.3M,而且推理速度最快為2.2ms 。但是精度是最差的,YOLOv5m的權重文件為21.4M,而且推理速度為2.9ms 。推理精度最好的為YOLOv5x ,但權重文件為87.7M 。因此,YOLOv5s更適合在移動設備上進行部署。關于選擇什么權重文件,需要根據自己的部署環境和精度要求來具體分析。

      2 Atlas 500 智能小站概述

      基于華為Ascend處理器開發AI應用程序,一般需要搭建開發環境和運行環境。開發環境可以在非昇騰設備和昇騰設備上進行搭建。而運行環境則需要在昇騰AI設備上進行搭建。其中的 Atlas 500 是華為面向廣泛邊緣應用場景的輕量邊緣設備,具有超強計算性能、大容量存儲、配置靈活、體積小、支持溫度范圍寬、環境適應性強、易于維護管理等特點。它主要應用在智能視頻監控、分析、數據存儲等應用場景,可以廣泛部署在各類邊緣、中心機房,滿足在社區、園區、商場、超市等復雜環境區域的應用。關于各類硬件設備,可以參考官網:https://www.hiascend.com/document?tag=hardware 。

      其中的華為Atlas 500小站硬件的官網地址如下:https://support-it.huawei.com/server-3d/res/server/atlas500/index.html 華為Atlas 500小站示意圖如下:

      官網給出的產品特定如下:

      邊緣場景易用性

      實時性:它可以在本地處理數據,提供實時的響應。

      低帶寬:只將必要的信息傳送到云上。

      隱私保護:客戶可以決定要傳送到云上和保留在本地的信息。所有傳送到云上的信息都是可以加密的。

      16路視頻分析和存儲能力

      支持16路視頻分析能力(最大16路1080p解碼,22TOPS INT8算力)。

      支持12TB存儲容量,16路1080p@4Mb碼流視頻緩存7天,8路1080p@4Mb碼流視頻緩存30天。

      極強環境適應能力,邊緣環境部署

      工業防護等級:IP40。

      無風扇設計,支持-40℃~+70℃寬溫度工作環境。

      靈活選配,無線回傳

      支持選配3G或4G模塊(無線回傳)。

      可靠性高

      系統內所有固件均有雙鏡像備份,故障時可自動進行主備區切換。

      支持軟件、硬件故障檢測與告警。

      提供雙機解決方案,內置雙機備份軟件,支持兩臺Atlas 500 智能小站組成雙機備份系統,單臺Atlas 500 智能小站故障時自動發起倒換。

      3 Atlas 500 yolov5 適配過程

      Atlas 500 智能小站自帶的歐拉操作系統,在模型遷移和安裝相關庫方面相對來說,較為繁瑣。因此,我們可以通過制作Docker鏡像來部署。關于如何在Atlas 500 上構建Docker鏡像,可以參考之前的博文《華為Atlas 500小站Docker鏡像制作》,這里不再贅述。首先我們需要用SSH 來登錄Atlas 500 ,成功登錄后,首先查看一下制作的鏡像文件,可以輸入 docker images 來查看,示例如下所示:

      Euler:/opt/mount/docker05 # docker images REPOSITORY TAG IMAGE ID CREATED SIZE workload-image v1.0 5533b1d161d8 4 weeks ago 585MB ubuntu 18.04 7266638574fb 2 months ago 56.6MB k8s.gcr.io/pause latest 3df7a9f2d9f8 16 months ago 1.57MB

      其中的 workload-image 為制作的鏡像文件,下面啟動該鏡像,并指定 -v 參數來掛載宿主機目錄到Docker 容器中,這樣二者可以共享一些目錄和存儲。其中的/home/data/miniD/driver/lib64 為 Atlas 500 智能小站的NPU驅動,npu-smi 工具可以查看npu相關信息,可以用來驗證NPU芯片是否可用。啟動Docker容器命令如下所示:

      docker run --device=/dev/davinci0 \ --device=/dev/davinci_manager \ --device=/dev/hisi_hdc \ --device /dev/devmm_svm \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \ -v /home/data/miniD/driver/lib64:/home/data/miniD/driver/lib64 \ -v /run/board_cfg.ini:/run/board_cfg.ini \ -v /opt/mount/docker05:/opt/mount/docker05 \ -it workload-image:v1.0 bash

      正常啟動后,會切換到Docker容器中,首先輸入如下命令進行NPU狀態查看:

      root@c25e51b32a55:~# npu-smi info

      顯示信息如下則表示NPU可以使用,可以進行下一步操作。經過實際操作,發現Atlas 500只能有一個Docker容器可以使用NPU資源。npu-smi info 顯示結果如下所示:

      其中的 NPU Chip 代表 NPU芯片,這里的device id 為 0 ,Name Device 為 310 ,代表華為Ascend 310 。Health Bus-Id 為 OK ,則說明正常可以使用。下面需要安裝PyACL? 相關的依賴項,執行如下命令:

      圖文講解Atlas 500適配yolov5進行物體檢測丨【我的華為云體驗之旅】

      #更新 apt-get update #安裝 pip3 apt-get install python3-pip # 只能用python3.6 進行安裝python依賴庫 python3.6 -m pip install --upgrade pip --user -i https://mirrors.huaweicloud.com/repository/pypi/simple python3.6 -m pip install Cython numpy tornado==5.1.0 protobuf --user \ -i https://mirrors.huaweicloud.com/repository/pypi/simple # 安裝 wget apt-get install wget # 安裝 vim apt-get install vim # 安裝opencv-python python3.6 -m pip install opencv-python==4.5.4.60 --user -i https://mirrors.huaweicloud.com/repository/pypi/simple # fix ImportError: libGL.so.1 apt install libgl1-mesa-glx

      成功安裝后,可以輸入如下命令進行驗證,如果在python交互環境中,可以成功導入 import cv2 則說明 OpenCV依賴安裝成功,具體示意如下所示 :

      root@c25e51b32a55:~# python3 Python 3.6.9 (default, Jan 26 2021, 15:33:00) [GCC 8.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import cv2 >>> print(cv2.__version__) 4.5.4 >>>

      然后繼續安裝 ffmpeg 以及相關依賴項,執行如下命令 :

      apt-get install -y libavformat-dev libavcodec-dev libavdevice-dev libavutil-dev libswscale-dev apt-get install pkg-config libxcb-shm0-dev libxcb-xfixes0-dev #安裝 av 庫 python3.6 -m pip install av==6.2.0 -i https://mirrors.huaweicloud.com/repository/pypi/simple apt-get install libtiff5-dev libjpeg8-dev zlib1g-dev libfreetype6-dev liblcms2-dev libwebp-dev tcl8.6-dev tk8.6-dev python-tk # 安裝 x264 x265 apt-get install x264 x265 # 安裝PIL和 requests python3.6 -m pip install Pillow requests -i https://mirrors.huaweicloud.com/repository/pypi/simple # 安裝numpy python3.6 -m pip install numpy -i https://mirrors.huaweicloud.com/repository/pypi/simple # 安裝 ffmpeg apt-get install ffmpeg

      最后,配置一下環境變量,執行如下命令 :

      vi ~/.bashrc

      在末尾添加如下配置 :

      export LD_LIBRARY_PATH=/usr/local/Ascend/ascend-toolkit/latest/atc/lib64:/usr/local/Ascend/nnrt/latest/acllib/lib64:/home/data/miniD/driver/lib64:$LD_LIBRARY_PATH export PATH=/usr/local/Ascend/ascend-toolkit/latest/atc/bin:/usr/local/Ascend/ascend-toolkit/latest/atc/ccec_compiler/bin:$PATH export PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/toolkit/python/site-packages:/usr/local/Ascend/ascend-toolkit/latest/atc/python/site-packages:/usr/local/Ascend/nnrt/latest/pyACL/python/site-packages/acl:$PYTHONPATH export ASCEND_AICPU_PATH=/usr/local/Ascend/nnrt/latest:$ASCEND_AICPU_PATH export ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp export TOOLCHAIN_HOME=/usr/local/Ascend/ascend-toolkit/latest/toolkit:${TOOLCHAIN_HOME}

      以上路徑位置,需要根據自己的實際情況來進行調整。為了更好的后續進行部署,不要重新進行環境配置,這里將容器鏡像導出為文件,可以進行備份,以后可以基于導出的文件來進行還原。執行如下命令 :

      # 將id為c25e51b32a55的容器提交改變到atlas500-python:v2.0 鏡像 docker commit c25e51b32a55 atlas500-python:v2.0 # 將atlas500-python:v2.0 鏡像導出為atlas500-python-opencv4.5-ffmepg.tar 文件 docker save -o atlas500-python-opencv4.5-ffmepg.tar atlas500-python:v2.0

      這樣我們可以通過相關命令,將這個文件通過 Atlas 500 的臨時文件目錄(貌似大小為2G左右)拷貝到其他環境中,下面的命令可以參考:

      # 拷貝到臨時目錄 Euler:/opt/mount/docker05 # cp atlas500-workload-image.tar /tmp #修改權限,這樣可以通過sftp進行下載 Euler:/opt/mount/docker05 # chmod 777 /tmp/* # 啟動Docker 容器 Euler:/opt/mount/docker05 # docker start c25e51b32a55 # 進入Docker 容器 Euler:/opt/mount/docker05 # docker attach c25e51b32a55 root@c25e51b32a55:~#

      另外,需要在Docker容器中執行如下命令,來安裝一些輔助工具:

      #vim 中文亂碼解決方法 vi /etc/vim/vimrc ################添加如下配置 ######### set fileencodings=utf-8,gb2312,gbk,gb18030 set termencoding=utf-8 set encoding=prc ##################################### # 安裝 ping 工具 apt-get install -y inetutils-ping

      下面需要準備適配需要的相關軟件,這里需要使用ATC工具進行模型轉換,這個具體過程可以參考《Atlas 500 Docker ATC模型轉換鏡像搭建》,下面切換到ATC工具所在的Ubuntu環境,由于Atlas 500 CPU 性能比較弱,因此可以在X86機器上進行ATC相關模型的轉換工作。下面基于yolov4 4.0版本來進行相關適配操作。首先,登錄ATC所在的操作系統,以root用戶來進行操作。執行如下命令:

      su root cd mysoft # 下載 yolov5-4.0 wet https://github.com/ultralytics/yolov5/archive/v4.0.tar.gz #重命名 mv v4.0.tar.gz yolov5-4.0.tar.gz #解壓 tar -xzf yolov5-4.0.tar.gz #切換目錄 cd yolov5-4.0 #下載權重文件 wget https://github.com/ultralytics/yolov5/releases/download/v4.0/yolov5s.pt wget https://github.com/ultralytics/yolov5/releases/download/v4.0/yolov5m.pt

      下面給出至關重要的一步,修改官網export.py中的源碼,將 opset_version= 12 修改為 opset_version= 11? 。執行命令如下所示:

      vi models/export.py

      修改內容如下所示:

      執行導出模型操作 ,從 yolov5m.pt 導出為? yolov5m.onnx 模型,具體命令如下所示 :

      #onnx >= 1.9 & numpy >= 1.17 python3 -m pip install onnx python3.6 models/export.py --weights ./yolov5m.pt --img 640 --batch 1

      成功執行,此時可以查看生成的文件名稱,執行 ls 命令查看文件列表 ,界面如下所示 :

      下面對 yolov5m.onnx 模型進行修改,這里執行如下命令:

      python3 modify_yolov5.py yolov5m.onnx yolov5m ########################################### root@jackpc:/home/jack/mysoft/yolov5-4.0# ls data models train.py yolov5_modified.onnx detect.py modify_yolov5.py tutorial.ipynb yolov5m.onnx Dockerfile README.md utils yolov5m.pt hubconf.py requirements.txt weights yolov5m.torchscript.pt LICENSE test.py yolov5m.mlmodel

      其中的? yolov5_modified.onnx 則為修改過的 onnx 模型。下面需要查看這個模型的可視化結構,vi 新建一個view_onnx.py文件,并執行 python3 -m pip install ?netron 來安裝netron工具。view_onnx.py文件內容如下所示:

      # python3 -m pip install netron import netron netron.start('./yolov5-4.0/yolov5_modified.onnx')

      啟動一下netron來查看模型網絡結構,執行如下命令:

      root@jackpc:/home/jack/mysoft# python3.6 view_onnx.py Serving './yolov5-4.0/yolov5_modified.onnx' at http://localhost:8080 Running Firefox as root in a regular user's session is not supported....

      打開瀏覽器,輸入網址 http://localhost:8080/ 進行訪問,這里我們需要從圖上找到3個out 節點,并記住其名稱 ,這里可能每個模型的名稱是不同的,所以需要通過圖形來確定。我這里的三個 out 節點截圖如下所示:

      上述3個圖的out node名稱分別為 : Conv_324? ;Conv_340 和 Conv_356 。下面給出具體的ATC轉換代碼:

      # ATC環境變量 source /usr/local/Ascend/ascend-toolkit/set_env.sh # ATC轉換,注意--out_nodes 的Conv 名稱 atc --model=yolov5_modified.onnx --framework=5 --output=yolov5m_b1 --soc_version=Ascend310 --insert_op_conf=aipp_rgb.cfg --input_format=NCHW --input_shape="images:1,3,640,640" --out_nodes="Conv_324:0;Conv_340:0;Conv_356:0" --output_type="Conv_324:0:FP32;Conv_340:0:FP32;Conv_356:0:FP32" --log=info

      其中 aipp_rgb.cfg 配置文件內容如下所示,可以通過vi 命令創建:

      root@jackpc:/home/jack/mysoft/yolov5-4.0# vi aipp_rgb.cfg ########################### aipp_op { aipp_mode : static related_input_rank : 0 input_format : RGB888_U8 csc_switch : false rbuv_swap_switch : true src_image_size_w : 640 src_image_size_h : 640 crop : false min_chn_0 : 0 min_chn_1 : 0 min_chn_2 : 0 var_reci_chn_0 : 0.0039216 var_reci_chn_1 : 0.0039216 var_reci_chn_2 : 0.0039216 }

      ATC執行成功后,生成 yolov5m_b1.om 文件,操作過程示意界面如下所示:

      將生成的 yolov5m_b1.om 文件拷貝出來,并上傳到Atlas 500 上備用。進入上述構建的Docker容器中,然后執行如下命令,解壓構建的測試項目:

      root@c25e51b32a55:~# mkdir myai root@c25e51b32a55:~# cd myai root@c25e51b32a55:~/myai# cp /opt/mount/docker05/pyacl_yolov5.tar . root@c25e51b32a55:~/myai# ls pyacl_yolov5.tar root@c25e51b32a55:~/myai# tar -xvf pyacl_yolov5.tar root@c25e51b32a55:~/myai# cd pyacl_yolov5 root@c25e51b32a55:~/myai/pyacl_yolov5# ls acl_demo.py aclnet data model readme.md result.jpg scripts root@c25e51b32a55:~/myai/pyacl_yolov5#

      其中的 yolov5m_b1.om 文件處于 model目錄中,acl_demo.py為推理程序的啟動文件,內容如下所示:

      import cv2 from time import * from aclnet.net import Net from aclnet.common import AscendResource from aclnet.utils import yolov5PostProcess, letterbox from aclnet.coco128 import * import sys classes = 80 img_width = 640 img_height = 640 device_id = 0 anchors = [[(10, 13), (16, 30), (33, 23)], # stride_32 [(30, 61), (62, 45), (59, 119)], # stride_16 [(116, 90), (156, 198), (373, 326)]] # stride_8 if __name__ == "__main__": with AscendResource(device_id) as aclres: model = Net(aclres, sys.argv[1]) image = cv2.imread(sys.argv[2]) image = letterbox(image, (img_width, img_height)) begin_time = time() result = model.run([image]) rects = yolov5PostProcess(result, anchors, img_width, classes) for rect in rects: name = get_name_bycls(rect[2]) print("[x1, y1, x2, y2]:", rect[0][0], rect[0][1], rect[1][0], rect[1][1], rect[2] , name, rect[3]) cv2.rectangle(image, (rect[0][0], rect[0][1]), (rect[1][0], rect[1][1]), (0, 255, 0), 1) cv2.putText(image, name, (rect[0][0], rect[0][1] - 20), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (255, 0, 0), 2) cv2.imwrite('result.jpg', image) end_time = time() print('total run time:', end_time - begin_time)

      執行如下命令進行推理:

      python3 acl_demo.py ./model/yolov5m_b1.om ./data/test1.jpg

      輸出信息截圖如下所示:

      測試輸入的test1.jpg經過推理后,會寫入result.jpg中 ,將其拷貝出來進行查看:

      root@c25e51b32a55:~/myai/pyacl_yolov5# cp result.jpg /opt/mount/docker05/ Euler:/opt/mount/docker05 # cp /opt/mount/docker05/result.jpg /tmp/ Euler:/opt/mount/docker05 # chmod 777 /tmp/result.jpg

      寫入的result.jpg文件顯示如下所示:

      最后,給出幾個可以參考的且非常有用的華為官方鏈接 :

      https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=118598

      https://gitee.com/ascend/samples/tree/master/python/environment

      https://www.hiascend.com/zh/software/modelzoo/detail/1/f7338e43cf024ea1851fb46041be1dea

      【我的華為云體驗之旅】有獎征文火熱進行中:https://bbs.huaweicloud.com/activity/CloudStory.html

      Docker OpenCV 昇騰

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:【未完待續】論文閱讀《SegFlow: Joint Learning for Video Object ...》
      下一篇:excel表格里不同百分比設置不同顏色的方法教程
      相關文章
      久久精品国产亚洲av麻| 国产亚洲av片在线观看播放 | 久久久亚洲精华液精华液精华液 | 亚洲AV乱码久久精品蜜桃 | 亚洲精品乱码久久久久久下载| 亚洲日韩av无码| 国产L精品国产亚洲区久久| 国产成人人综合亚洲欧美丁香花| 亚洲一区二区三区高清在线观看| 亚洲综合中文字幕无线码| 亚洲国产精品网站久久| 亚洲国产精品综合久久久| 亚洲短视频在线观看| 亚洲视频小说图片| 亚洲欧洲日韩综合| 亚洲AV无码精品蜜桃| 亚洲av无码片在线观看| 亚洲视频无码高清在线| 国产精品亚洲综合五月天| 亚洲综合在线一区二区三区| 亚洲字幕AV一区二区三区四区| 亚洲一久久久久久久久| 亚洲av无码日韩av无码网站冲| 亚洲国产成人AV在线播放 | 久久亚洲精品中文字幕无码| 亚洲AV人无码激艳猛片| 久久狠狠高潮亚洲精品| 亚洲成年人电影在线观看| 亚洲免费观看网站| 亚洲日产乱码一二三区别| 亚洲Av永久无码精品黑人| 国产亚洲精彩视频| 亚洲天堂在线视频| 亚洲国产精品无码av| 久久久久亚洲精品成人网小说| 久久精品国产亚洲av麻豆小说 | 国产成人精品曰本亚洲79ren| 国产成人亚洲综合无码精品| 亚洲AV无码国产精品色午友在线 | 亚洲男人天堂2022| 国产精品亚洲天堂|