本次實驗在Mindstudio上開展,本實驗對應(yīng)的 CANN 版本為 5.0.3,請先按照官網(wǎng)教程,配置好 Mindstudio 與其所需依賴。本文使用Mindstudio中的ATC工具,對OSNet的pytorch模型轉(zhuǎn)換成適配昇騰AI處理器的離線模型,并進行精度分析。Mindstudio是一款華為旗下的含算子、模型、開發(fā)一體的工具,內(nèi)部集成了眾多開發(fā)與推理功能模塊,可以使我們更方便的進行開發(fā)推理等工作。
一、概述
參考論文:[OSNet 論文](https://arxiv.org/abs/1905.00953) 作為一個實例級的識別問題,行人再識別(ReID)依賴于具有識別能力的特征,它 不僅能捕獲不同的空間尺度,還能封裝多個尺度的任意組合。這些同構(gòu)和異構(gòu)尺度的 特征為全尺度特征。本文設(shè)計了一種新穎的深度 CNN,稱為全尺度網(wǎng)絡(luò)(OSNet),用于 ReID 的全尺度特征學(xué)習(xí)。這是通過設(shè)計一個由多個卷積特征流組成的殘差塊來實現(xiàn)的, 每個殘差塊檢測一定尺度的特征。重要的是,引入了一種新的統(tǒng)一聚合門用輸入依賴 的每個通道權(quán)重進行動態(tài)多尺度特征融合。為了有效地學(xué)習(xí)空間通道相關(guān)性,避免過 擬合,構(gòu)建塊同時使用點卷積和深度卷積。通過逐層疊加這些塊,OSNet 非常輕量,可 以在現(xiàn)有的 ReID 基準上從零開始訓(xùn)練。盡管 OSNet 模型很小,但其在 6 個 Reid 數(shù)據(jù) 集上到達了 SOTA 結(jié)果。
二、推理環(huán)境準備
1、配置conda環(huán)境、安裝依賴包
依賴名稱 | 版本 |
ONNX | 1.7.0 |
torch | 1.8.1 |
TorchVision | 0.9.1 |
numpy | 1.18.5 |
Pillow | 7.2.0 |
Opencv-python | 4.2.0.34 |
protobuf | 3.13.0 |
onnx-simplifiler | 0.3.6 |
isort | 4.3.21 |
三、執(zhí)行推理
注:本實驗的腳本來源:https://www.hiascend.com/zh/software/modelzoo/detail/1/43a754e306c6461d86dafced5046121f
用戶可以下載獲取。
3.1創(chuàng)建工程
點擊File->New->Project:
進入以下界面:
Name為自己的項目名稱,CANN Version為本機Mindstudio所對應(yīng)的CANN版本,Project Location為項目地址,讀者根據(jù)自己實際情況進行填寫。
選擇Pytorch Project,點擊Finish完成項目創(chuàng)建。
3.2從開源代碼倉獲取OSNet源碼:
在終端輸入代碼:
git clone https://github.com/KaiyangZhou/deep-person-reid.git
獲取源碼,并cd進入文件夾:
cd deep-person-reid/
安裝源碼所需依賴:
pip install -r requirements.txt
運行setup腳本下載torchreid:
python3.7 setup.py develop
3.3數(shù)據(jù)預(yù)處理
從網(wǎng)上下載數(shù)據(jù)集壓縮包,本文提供百度網(wǎng)盤下載地址:
[Market1501數(shù)據(jù)集(百度網(wǎng)盤下載,提取碼:me3q)](https://pan.baidu.com/s/1Nl8tMEvq-MwNGd1pG4_6bg)
本步驟是為了把輸入格式從圖片形式轉(zhuǎn)為二進制info文件,用于om模型的輸入。
把數(shù)據(jù)集解壓到deep-person-reid文件夾里,隨后運行腳本:market1501_torch_preprocess.py,主要過程解釋如下:
對bounding_box_test測試集與query數(shù)據(jù)集進行處理,把原始輸入的圖片的JPG格式,輸出為二進制文件格式—bin文件。
選中所執(zhí)行腳本,點擊鼠標右鍵,進入Modify Run configuration
對bounding_box_test測試集處理
對query數(shù)據(jù)集處理
運行框內(nèi)主要參數(shù)解釋:
參數(shù)名稱 | 解釋 |
Script path | 從文件夾中選中需要執(zhí)行的腳本文件 |
Parameters | 腳本運行所需參數(shù),本例中分別為bounding_box_test文件夾相對路徑,bin文件存放文件夾gallery_prep_dataset相對路徑;對query數(shù)據(jù)集處理時的參數(shù)為query文件夾的相對路徑和bin文件存放的文件夾query_pre_data的相對路徑 |
Python interpreter | 運行腳本所使用的Python解釋器 |
運行成功后:
運行結(jié)果顯示
接下來執(zhí)行生成數(shù)據(jù)集信息腳本,生成數(shù)據(jù)集信息文件。即分別一步所生成的gallery_prep_dataset文件夾與query_prep_dataset的bin文件轉(zhuǎn)換為數(shù)據(jù)集信息文件。
對gallery_prep_dataset文件夾處理
對query_prep_dataset文件夾處理
Parameters里的參數(shù)為:第一個參數(shù)為模型輸入的類型,第二個參數(shù)為生成的bin文件路徑,第三個為輸出的info文件,第四、第五個為寬高信息。腳本運行結(jié)果生成info文件。
3.4模型轉(zhuǎn)換
本文模型需要做兩步轉(zhuǎn)換,即先有path->onnx,再有onnx->om
3.4.1由path轉(zhuǎn)換onnx
本文提供兩種方式下載訓(xùn)練好的權(quán)重文件如下:
[OSNet訓(xùn)練pth權(quán)重文件(google下載)](https://drive.google.com/file/d/1vduhq5DpN2q1g4fYEZfPI17MJeh9qyrA/view?usp=sharing)
[OSNet訓(xùn)練pth權(quán)重文件(百度網(wǎng)盤下載,提取碼:gcfe)](https://pan.baidu.com/s/1Xkwa9TCZss_ygkC8obsEMg)
此步由pytorch完成轉(zhuǎn)換,執(zhí)行轉(zhuǎn)換腳本:pth2onnx.py
Paremeters內(nèi)填入?yún)?shù)分別為參數(shù)文件名與生成的onnx模型文件名:
osnet_x1_0_market_256x128_amsgrad_ep150_stp60_lr0.0015_b64_fb10_softmax_labelsmooth_flip.pth osnet_x1_0.onnx
得到onnx模型文件后,在終端輸入:
python3.7 -m onnxsim osnet_x1_0.onnx osnet_x1_0_bs1_sim.onnx –input-shape 1,3,256,128
利用之前安裝的依賴onnx-simplify對onnx模型進行簡化,生成batch_size=1的靜態(tài)模型:onnxsim osnet_x1_0.onnx。
3.4.2onnx轉(zhuǎn)換om
此步轉(zhuǎn)換使用Mindstudio提供的ATC轉(zhuǎn)換工具,ATC工具功能架構(gòu)如下圖所示:
用戶可以將開源框架網(wǎng)絡(luò)模型如本文的OSNet模型,通過ATC工具轉(zhuǎn)換為適配昇騰AI處理器的離線模型也可以將開源框架網(wǎng)絡(luò)模型轉(zhuǎn)換后的離線模型轉(zhuǎn)成json文件,方便文件查看。
點擊導(dǎo)欄行的Ascend->Model Converter;或者點擊Mindstudio的功能欄:
進入以下界面:
在Model File中選中需要轉(zhuǎn)換的onnx模型,Model Name為模型名稱,Target SoC Version為需要轉(zhuǎn)換成適配的芯片類型,image為輸入圖片的batch_size。點擊圖中紅框的圖標,可以生成可視化模型流程框架:
用戶可以在此了解每層的結(jié)構(gòu)與參數(shù)。
點擊ok,next,即可進行模型轉(zhuǎn)換:
點擊Finish完成模型轉(zhuǎn)換,紅框里分別是om模型存放的服務(wù)器地址與本地地址。
3.5執(zhí)行離線推理
推理benchmark工具用來針對指定的推理模型運行推理程序,并能夠測試推理模型的性能(包括吞吐率、時延)和精度指標。benchmark的安裝包可以通過benchmark工具用戶指南獲取。benchmark工具有兩個使用場景,分別是:
純推理場景 | 該場景僅用來測試推理模型的性能指標,即模型執(zhí)行的平均時間和平均吞吐率。 該場景無需準備推理數(shù)據(jù)及數(shù)據(jù)集文件,只需要準備經(jīng)過ATC轉(zhuǎn)換后的模型文件即可推理。 |
推理場景 | 該場景除了測試性能指標之外,還可以測試模型的精度指標。 該場景需要準備經(jīng)過預(yù)處理的推理數(shù)據(jù)及數(shù)據(jù)集文件和經(jīng)過ATC轉(zhuǎn)換后的模型文件才能推理 |
本文所使用的場景是推理場景,即利用上文所處理的info數(shù)據(jù)以及轉(zhuǎn)換的om模型進行推理:
在終端輸入命令:
a. 設(shè)置環(huán)境變量:
source /usr/local/Ascend/ascend-toolkit/set_env.sh
b. 增加benchmark.{arch}可執(zhí)行權(quán)限:
chmod u+x benchmark.x86_64
c. 執(zhí)行離線推理:
#對query_prep_bin.info進行處理
./benchmark.x86_64 -model_type=vision -device_id=0 -batch_size=1 -om_path=osnet_x1_0_bs1.om -input_text_path=./query_prep_bin.info -input_width=128 -input_height=256 -output_binary=False -useDvpp=False
主要參數(shù)解釋如下:
- -model:為ONNX模型文件。
- -framework:5代表ONNX模型。
- -output:輸出的OM模型。
- -input_format:輸入數(shù)據(jù)的格式。
- -input_shape:輸入數(shù)據(jù)的shape。
- -log:日志級別。
- -soc_version:處理器型號。
執(zhí)行成功后:
3.6精度驗證
執(zhí)行osnet_metrics_market1501_bs1.py腳本:
Parameters參數(shù)填入:result/dumpOutput_device0/ result/dumpOutput_device1/ ./ result_bs1.json,運行腳本執(zhí)行精度驗證,結(jié)果如下所示:
OSNet開源代碼倉精度(https://kaiyangzhou.github.io/deep-person-reid/MODEL_ZOO)
osnet_x1_0 R1=94.2%,mAP=82.6%
本次實驗所得代碼精度:R1=94.3,mAP=82.5
R1比代碼倉結(jié)果略高,mAP下降在1%范圍之內(nèi),故精度達標。
F&Q
1. 在數(shù)據(jù)預(yù)處理時,執(zhí)行market1501_torch_preprocess.py腳本時會出現(xiàn)如下錯誤:
原因是把腳本文件置于數(shù)據(jù)集文件夾中,把腳本文件轉(zhuǎn)移到deep-person-reid文件夾下即可。
2. 在執(zhí)行精度驗證腳本osnet_x1_0_metrics_market1501.py時會出現(xiàn)如下錯誤
原因是沒有進行環(huán)境變量的配置,在終端輸入代碼:
source env.sh
即可。
在項目上有其它問題的也可以登錄昇騰論壇,在帖子里提出自己關(guān)于項目或者Mindstudio的疑文(https://www.huaweicloud.com/s/JU1pbmRTdHVkaW_mkK3lu7ol/t_60_p_1),會有華為內(nèi)部技術(shù)人員對其進行解答,幫助你更好使用MindStudio。