圖文講解Atlas 500適配yolov5進行物體檢測丨【我的華為云體驗之旅】
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? 相關的依賴項,執行如下命令:
#更新 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小時內刪除侵權內容。