摘要:本實驗主要是以基於Caffe ResNet-50網路實現圖片分類(僅推理)為例,學習如何在已經具備預訓練模型的情況下,將該模型部署到昇騰AI處理器上進行推理。
本文分享自華為雲社群《【CANN訓練營】【2022第二季】【新手班】基於Caffe ResNet-50網路實現圖片分類(僅推理)的實驗復現》,作者: StarTrek 。
本實驗主要是以基於Caffe ResNet-50網路實現圖片分類(僅推理)為例,學習如何在已經具備預訓練模型的情況下,將該模型部署到昇騰AI處理器上進行推理。該實驗的主要任務有:
1、將Caffe ResNet-50網路的模型檔案轉換為適配昇騰AI處理器的離線模型( * .om檔案);
2、載入該om檔案,對2張 * .jpg圖片進行同步推理,分別得到推理結果後,再對推理結果進行處理,輸出top5置信度的類別標識;
3、將測試的圖片替換為自己的圖片並重新編譯執行。
首先為了更好的讓我們能夠了解並學習昇騰的相關知識,華為CANN訓練營為每一位學員都給予了一定的雲伺服器資源,關於雲伺服器的使用簡單總結如下:
本次提供的共用映象是:Ubuntu 18.04(系統) + 5.1.RC2.alpha005(CANN環境版本)
登陸華為雲->進入控制檯->申請ESC彈性雲伺服器->獲取彈性公網IP->運用SSH遠端存取雲伺服器->正常按照ubuntu系統的終端命令來操作使用伺服器
資源連結:
遠端終端軟體推薦MobaXterm:https://mobaxterm.mobatek.net/
軟體使用方法:https://blog.csdn.net/xuanying_china/article/details/120080644
進入終端後為root使用者,需要進入HwHiAiUser使用者
指令:
cd /home/
su - HwHiAiUser
可以使用ls或者ll指令隨意瀏覽系統中已有的檔案情況。
準備工作完成之後,下面就可以開始正式的實驗之旅啦!可以按照倉庫裡的readme檔案所述步驟一步步操作,此處也僅僅只是簡單的給出實驗的步驟和實驗圖。
克隆sample倉裡的程式碼
git clone https://gitee.com/ascend/samples.git
進入到resnet50_imagenet_classification樣例的資料夾中
cd samples/
cd cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification
先建立一個用來儲存該模型的資料夾,並開啟該資料夾
mkdir caffe_model
cd caffe_model
從網頁直接通過命令下載預訓練模型:權重檔案(resnet50.caffemodel)和模型檔案(resnet50.prototxt)
wegt https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/resnet50/resnet50.prototxt wegt https://modelzoo-train-atc.obs.cn-north-4.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/resnet50/resnet50.caffemodel
上述下載的預訓練模型需要首先運用ATC模型轉換工具將該模型轉換成昇騰AI處理器支援的離線模型(.om)
官方檔案ATC工具學習資源:
https://www.hiascend.com/document/detail/zh/CANNCommunityEdition/51RC2alpha005/infacldevg/atctool
流程:
首先先切換到樣例目錄下(接著上面的操作就是上一級目錄)
cd ../
然後執行模型轉換工具
atc --model=caffe_model/resnet50.prototxt --weight=caffe_model/resnet50.caffemodel --framework=0 --output=model/resnet50 --soc_version=Ascend310 --input_format=NCHW --input_fp16_nodes=data --output_type=FP32 --out_nodes=prob:0
開啟model資料夾可以看到resnet50.om已經轉換完成了
進入data資料夾,並下載兩張ImageNet資料集中存在類別的圖片
cd ../data/ wget https://c7xcode.obs.cn-north-4.myhuaweicloud.com/models/aclsample/dog1_1024_683.jpg wget https://c7xcode.obs.cn-north-4.myhuaweicloud.com/models/aclsample/dog2_1024_683.jpg
測試的兩張圖
下載的圖片是JPEG格式的,需要轉換成適合模型輸入要求格式的二進位制檔案(.bin)
在data目錄下,執行transferPic.py指令碼,將*.jpg轉換為*.bin,同時將圖片從1024 * 683的解析度縮放為224 * 224。
python3 ../script/transferPic.py
進入「cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification」樣例目錄
cd ../
設定臨時的環境變數,設定程式編譯依賴的標頭檔案與庫檔案路徑
export DDK_PATH=$HOME/Ascend/ascend-toolkit/latest
export NPU_HOST_LIB=$DDK_PATH/acllib/lib64/stub
建立build資料夾,準備編譯程式碼檔案
mkdir -p build/intermediates/host
進入build資料夾,編譯.cpp檔案
cd build/intermediates/host cmake ../../../src -DCMAKE_CXX_COMPILER=g++ -DCMAKE_SKIP_RPATH=TRUE make
可以在樣例目錄(cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification)下的out資料夾中找到編譯好的可執行main檔案,接下來我們直接執行main檔案
cd ../../../out/ ./main
這裡在網上隨便找了兩張圖(一張金魚label-1,一張金毛犬label-207),可以隨意找幾張圖,只要是JPG格式的圖片即可,圖片中的事物型別最好是ImageNet資料集標籤中的型別。
可以直接下載到本地電腦中,然後直接將檔案拖到MobaXterm軟體的雲伺服器檔案列表中,為了方便直接先在列表中找到前面的data資料夾,然後直接拖拽到該資料夾下即可。
按照前面的操作(5、圖片格式轉換)重新進行圖片檔案格式的轉換,在data目錄下執行
python3 ../script/transferPic.py
在testFile列表中增加前面新新增的並轉換好的那兩張bin格式的檔案路徑,路徑仿照前兩個寫即可,不過別忘記不同檔案路徑間的逗號分隔哦
按照前面的步驟進行即可(6、編譯執行),需要注意的是,如果重啟過伺服器,之前設定的編譯臨時環境會丟失,需要再次設定臨時的環境變數(設定程式編譯依賴的標頭檔案與庫檔案路徑),然後可以在build/intermediates/host檔案下直接執行make編譯即可,編譯器會自動編譯修改過的原始檔並覆蓋。
按照前面的步驟重新執行編譯好的main檔案即可(6、編譯執行中的最後一步),注意檔案的路徑,需要在out資料夾下執行,因為main檔案是被儲存在這裡的。
最後我們可以看到
標籤為1是金魚,第一張圖是金魚的概率為99.7070%
標籤為207是金毛犬,第二張圖是金毛犬的概率為99.5605%