摘要:本實驗主要是以基於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指令隨意瀏覽系統中已有的文件情況。
二、基於Caffe ResNet-50網絡實現圖片分類(僅推理)實驗
準備工作完成之後,下面就可以開始正式的實驗之旅啦!可以按照倉庫里的readme文件所述步驟一步步操作,此處也僅僅只是簡單的給出實驗的步驟和實驗圖。
倉庫資源連結:
https://gitee.com/ascend/samples/tree/master/cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification
1、下載樣例代碼
克隆sample倉里的代碼
git clone https://gitee.com/ascend/samples.git
進入到resnet50_imagenet_classification樣例的文件夾中
cd samples/
cd cplusplus/level2_simple_inference/1_classification/resnet50_imagenet_classification
2、獲取ResNet-50預訓練模型
先創建一個用來存儲該模型的文件夾,並打開該文件夾
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
3、模型轉換
上述下載的預訓練模型需要首先運用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已經轉換完成了
4、下載測試圖片
進入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
測試的兩張圖
5、圖片格式轉換
下載的圖片是JPEG格式的,需要轉換成適合模型輸入要求格式的二進位文件(.bin)
在data目錄下,執行transferPic.py腳本,將*.jpg轉換為*.bin,同時將圖片從1024 * 683的解析度縮放為224 * 224。
python3 ../script/transferPic.py
6、編譯運行
進入「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數據集標籤中的類型。
1、添加圖片並轉換格式
可以直接下載到本地電腦中,然後直接將文件拖到MobaXterm軟體的雲伺服器文件列表中,為了方便直接先在列表中找到前面的data文件夾,然後直接拖拽到該文件夾下即可。
按照前面的操作(5、圖片格式轉換)重新進行圖片文件格式的轉換,在data目錄下運行
python3 ../script/transferPic.py
2、修改sample_process.cpp源碼,添加新增的兩張圖片的路徑
在testFile列表中增加前面新添加的並轉換好的那兩張bin格式的文件路徑,路徑仿照前兩個寫即可,不過別忘記不同文件路徑間的逗號分隔哦
3、重新編譯源碼
按照前面的步驟進行即可(6、編譯運行),需要注意的是,如果重啟過伺服器,之前設置的編譯臨時環境會丟失,需要再次設置臨時的環境變量(配置程序編譯依賴的頭文件與庫文件路徑),然後可以在build/intermediates/host文件下直接運行make編譯即可,編譯器會自動編譯修改過的源文件並覆蓋。
4、推理
按照前面的步驟重新運行編譯好的main文件即可(6、編譯運行中的最後一步),注意文件的路徑,需要在out文件夾下運行,因為main文件是被保存在這裡的。
最後我們可以看到
標籤為1是金魚,第一張圖是金魚的概率為99.7070%
標籤為207是金毛犬,第二張圖是金毛犬的概率為99.5605%
點擊下方,第一時間了解華為雲新鮮技術~
華為雲博客_大數據博客_AI博客_雲計算博客_開發者中心-華為雲