摘要:在做基於Ascend CL模型推理時,通常使用的有OpenCV、AIPP、DVPP這三種方式,或者是它們的混合方式,本文比較了這三種方式的特點,並以Resnet50的pytorch模型為例,結合訓練營提供的sample,說明了分別是如何實現預處理的。
本文分享自華為雲社群《【2023 · CANN訓練營第一季】——模型推理時資料預處理方法及歸一化引數計算》,作者: dayao。
前言:
對待推理圖片執行模型推理前,需要對圖片進行預處理,以滿足模型的輸入要求。我們可以透過閱讀模型訓練程式碼,檢視預處理的方法。在做基於Ascend CL模型推理時,通常使用的有OpenCV、AIPP、DVPP這三種方式,或者是它們的混合方式,本文比較了這三種方式的特點,並以Resnet50的pytorch模型為例,結合訓練營提供的sample,說明了分別是如何實現預處理的。本文還介紹了AIPP做減均值/乘係數的引數是如何計算的。
一、查詢模型訓練時的預處理方式
這一步對我這樣的新手有些難度,在訓練營可以直接問授課老師,或者是無所不曉的老班(帥高),亦或是無所不能的小助手
以Resnet50的pytorch模型為例,這裡模型需要的資料預處理方法,再講述兩種查詢方法。
Resnet50模型,需要對待推理圖片的資料預處理是:縮放到224*224;以RGB的順序存放;對畫素/255.0,變換到[0.0,1.0]範圍內;再按三個通道,分別做減均值,乘係數的運算,三個通道的均值是[0.485, 0.456, 0.406],對應係數分別是:[0.229, 0.224, 0.225]。
1、方法一:在昇騰官方的modelzoo去查。https://gitee.com/ascend/modelzoo
然後選擇用於訓練的模型PyTorch目錄
在搜尋框中,輸入Resnet50,找到對應的模型檔案
然後在modelarts / train_start.py裡查到的處理程式碼如下:
2、方法二:到pytorch官網去查
二、資料預處理的方式
確定好了輸入圖片需要做哪些預處理,接下來就需要選擇合適的實現方式。Ascend CL常用的有三種:Opencv、AIPP、DVPP。這三種方式的特點如下表所示:
本次訓練營,勤勞的小虎老師貼心的給大家準備了三種方式,供大家學習和掌握。程式碼在:https://gitee.com/ascend/samples/tree/master/inference/modelInference。分別是:純open CV;CV+AIPP;DVPP+AIPP。如下表所示:
1、CV方式:sampleResnetQuickStart
2、cv+AIPP方式:sampleResnetAIPP.cpp
3、DVPP+AIPP方式:sampleResnetDVPP
三、減均值/乘係數 用AIPP實現的計算
Pytorch官方的計算方法:
1、將影像資料調整到[0.0, 1.0]之間,相當於(/255.0)——torchvision.transforms.ToTensor
2、將資料x = (x - mean(x))/std(x)——torchvision.transforms.Normalize
用數學公式表達:
pixel_out_chx(i)=[pixel_in_chx(i)/255 - mean_i]/std_i
=[pixel_in_ch(i) - mean_i*255]/(255*std_i) (公式一)
注:pixel_out_chx(i):計算輸出值;
pixel_in_chx(i):原始畫素值,取值範圍[0, 255];
mean_i:均值,3個顏色通道分別取:[0.485, 0.456, 0.406]
std_i:係數,3個顏色通道分別取:[0.229, 0.224, 0.225]
AIPP減均值乘係數的計算公式:
pixel_out_chx(i)=[pixel_in_chx(i)-mean_chn_i-min_chn_i]*var_reci_chn (公式二)
注:pixel_out_chx(i):計算輸出值;
pixel_in_chx(i):原始畫素值,取值範圍[0, 255];
mean_chn_i表示每個通道的均值;
min_chn_i表示每個通道的最小值;
var_reci_chn表示每個通道方差的倒數
mean_chn_i和min_chn_i可以任意使用1個,另一個為0。令mean_chn_i=0,
公式一和公式二的畫素經過計算後的值相等,所以公式的右邊也相等,計算可得出:
min_chn_i = mean_i*255
var_reci_chn = 1/(255*std_i)
三個通道的計算如下: