本文分享自華為雲社群《【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官網去查
https://pytorch.org/vision/stable/models/generated/torchvision.models.resnet50.html#torchvision.models.resnet50
二、資料預處理的方式
确定好了輸入圖檔需要做哪些預處理,接下來就需要選擇合适的實作方式。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)
三個通道的計算如下:
關注#華為雲開發者聯盟# 點選下方,第一時間了解華為雲新鮮技術~
華為雲部落格_大資料部落格_AI部落格_雲計算部落格_開發者中心-華為雲