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