天天看點

CANN訓練:模型推理時資料預處理方法及歸一化參數計算

作者:華為雲開發者聯盟

本文分享自華為雲社群《【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

CANN訓練:模型推理時資料預處理方法及歸一化參數計算

然後選擇用于訓練的模型PyTorch目錄

CANN訓練:模型推理時資料預處理方法及歸一化參數計算

在搜尋框中,輸入Resnet50,找到對應的模型檔案

CANN訓練:模型推理時資料預處理方法及歸一化參數計算

然後在modelarts / train_start.py裡查到的處理代碼如下:

CANN訓練:模型推理時資料預處理方法及歸一化參數計算

2、方法二:到pytorch官網去查

https://pytorch.org/vision/stable/models/generated/torchvision.models.resnet50.html#torchvision.models.resnet50

CANN訓練:模型推理時資料預處理方法及歸一化參數計算

二、資料預處理的方式

确定好了輸入圖檔需要做哪些預處理,接下來就需要選擇合适的實作方式。Ascend CL常用的有三種:Opencv、AIPP、DVPP。這三種方式的特點如下表所示:

CANN訓練:模型推理時資料預處理方法及歸一化參數計算

本次訓練營,勤勞的小虎老師貼心的給大家準備了三種方式,供大家學習和掌握。代碼在:https://gitee.com/ascend/samples/tree/master/inference/modelInference。分别是:純open CV;CV+AIPP;DVPP+AIPP。如下表所示:

CANN訓練:模型推理時資料預處理方法及歸一化參數計算

1、CV方式:sampleResnetQuickStart

CANN訓練:模型推理時資料預處理方法及歸一化參數計算

2、cv+AIPP方式:sampleResnetAIPP.cpp

CANN訓練:模型推理時資料預處理方法及歸一化參數計算

3、DVPP+AIPP方式:sampleResnetDVPP

CANN訓練:模型推理時資料預處理方法及歸一化參數計算

三、減均值/乘系數 用AIPP實作的計算

Pytorch官方的計算方法:

CANN訓練:模型推理時資料預處理方法及歸一化參數計算

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)

三個通道的計算如下:

CANN訓練:模型推理時資料預處理方法及歸一化參數計算

關注#華為雲開發者聯盟# 點選下方,第一時間了解華為雲新鮮技術~

華為雲部落格_大資料部落格_AI部落格_雲計算部落格_開發者中心-華為雲

繼續閱讀