基於Caffe ResNet-50網路實現圖片分類(僅推理)的實驗復現

2022-07-25 12:00:51
摘要:本實驗主要是以基於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%

 

點選關注,第一時間瞭解華為雲新鮮技術~