Ascend CL兩種資料預處理的方式:AIPP和DVPP

語言: CN / TW / HK
摘要:本文介紹了昇騰CANN提供的兩種資料預處理的方式:DVPP和AIPP,介紹了兩者的功能、差別及聯絡,並以具體程式碼示例介紹瞭如何使用DVPP和AIPP的功能。

本文分享自華為雲社群《瞭解AscendCL資料預處理的兩種方式:AIPP和DVPP》,作者:昇騰CANN。

資料預處理的典型使用場景

受網路結構和訓練方式等因素的影響,絕大多數神經網路模型對輸入資料都有格式上的限制。在計算機視覺領域,這個限制大多體現在影象的尺寸、色域、歸一化引數等。如果源圖或視訊的尺寸、格式等與網路模型的要求不一致時,我們需要對其處理,使其符合模型的要求,這個操作,一般稱之為資料預處理。

AIPP、DVPP,它們都能做什麼

CANN提供了兩套專門用於資料預處理的方式:AIPP和DVPP。

總結一下,雖然都是資料預處理,但AIPP與DVPP的功能範圍不同(比如DVPP可以做影象編解碼、視訊編解碼,AIPP可以做歸一化配置),處理資料的計算單元也不同,AIPP用的AI Core計算加速單元,DVPP就是用的專門的影象處理單元。

AIPP、DVPP可以分開獨立使用,也可以組合使用。組合使用場景下,一般先使用DVPP對圖片/視訊進行解碼、摳圖、縮放等基本處理,但由於DVPP硬體上的約束,DVPP處理後的圖片格式、解析度有可能不滿足模型的要求,因此還需要再使用AIPP進行色域轉換、摳圖、填充等處理。

例如,在昇騰310 AI處理器,由於DVPP僅支援輸出YUV格式的圖片,如果模型需要RGB格式的圖片,則需要再使用AIPP進行色域轉換。

如何使用AIPP功能

下文以此為例:測試圖片解析度為250*250、圖片格式為YUV420SP,模型對圖片的要求為解析度224*224、圖片格式為RGB,因此需要通過AIPP實現摳圖、圖片格式轉換2個功能。關於各種格式轉換,其色域轉換系數都有模板,可從《ATC工具使用指南》獲取,參見“昇騰文件中心”。

靜態AIPP

1.構造AIPP配置檔案*.cfg。

摳圖:有效資料區域從左上角(0, 0)畫素開始,摳圖寬*高為224*224。

圖片格式轉換:輸入圖片格式為YUV420SP_U8,輸出圖片格式通過色域轉換系數控制。

aipp_op {
 aipp_mode : static                     # AIPP配置模式
 input_format : YUV420SP_U8    # 輸入給AIPP的原始圖片格式
 src_image_size_w : 250 # 輸入給AIPP的原始圖片寬高
 src_image_size_h : 250
       crop: true                                  # 摳圖開關,用於改變圖片尺寸
 load_start_pos_h: 0 # 摳圖起始位置水平、垂直方向座標
 load_start_pos_w: 0
 crop_size_w: 224 # 摳圖寬、高
 crop_size_h: 224
 csc_switch : true                       # 色域轉換開關
       matrix_r0c0 : 256 # 色域轉換系數
       matrix_r0c1 : 0
       matrix_r0c2 : 359
       matrix_r1c0 : 256
       matrix_r1c1 : -88
       matrix_r1c2 : -183
       matrix_r2c0 : 256
       matrix_r2c1 : 454
       matrix_r2c2 : 0
       input_bias_0 : 0
       input_bias_1 : 128
       input_bias_2 : 128
}

2.使能靜態AIPP。

使用ATC工具轉換模型時,可將AIPP配置檔案通過insert_op_conf引數傳入,將其配置引數儲存在模型檔案中。

atc --framework=3 --soc_version=${soc_version}
--model= $HOME/module/resnet50_tensorflow.pb
--insert_op_conf=$HOME/module/insert_op.cfg 
--output=$HOME/module/out/tf_resnet50

引數解釋如下:

- framework:原始網路模型框架型別,3表示TensorFlow框架。
- soc_version:指定模型轉換時昇騰AI處理器的版本,例如Ascend310。
- model:原始網路模型檔案路徑,含檔名。
- insert_op_conf:AIPP預處理配置檔案路徑,含檔名。
- output:轉換後的*.om模型檔案路徑,含檔名,轉換成功後,檔名自動以.om字尾結尾。

3.呼叫AscendCL介面載入模型,執行推理。

可參考往期的技術文章,請參見“基於昇騰計算語言AscendCL開發AI推理應用”。

動態AIPP

1.構造AIPP配置檔案*.cfg。

aipp_op
{
aipp_mode: dynamic
max_src_image_size: 752640 # 輸入影象最大記憶體大小,需根據實際情況調整
}

2.使能動態AIPP。

使用ATC工具轉換模型時,可將AIPP配置檔案通過insert_op_conf引數傳入,將其配置引數儲存在模型檔案中。

atc --framework=3 --soc_version=${soc_version}
--model= $HOME/module/resnet50_tensorflow.pb
--insert_op_conf=$HOME/module/insert_op.cfg 
--output=$HOME/module/out/tf_resnet50

引數解釋如下:

- framework:原始網路模型框架型別,3表示TensorFlow框架。
- soc_version:指定模型轉換時昇騰AI處理器的版本,例如Ascend310。
- model:原始網路模型檔案路徑,含檔名。
- insert_op_conf:AIPP預處理配置檔案路徑,含檔名。
- output:轉換後的*.om模型檔案路徑,含檔名,轉換成功後,檔名自動以.om字尾結尾。

3.呼叫AscendCL介面載入模型,設定AIPP引數後,再執行推理。

模型載入、執行可從參考往期的技術文章,請參見“基於昇騰計算語言AscendCL開發AI推理應用”。

呼叫AscendCL介面設定AIPP引數的程式碼示例如下:

aclmdlAIPP *aippDynamicSet = aclmdlCreateAIPP(batchNumber);
aclmdlSetAIPPSrcImageSize(aippDynamicSet, 250, 250);
aclmdlSetAIPPInputFormat(aippDynamicSet, ACL_YUV420SP_U8);
aclmdlSetAIPPCscParams(aippDynamicSet, 1, 256, 0, 359, 256, -88, -183, 256, 454, 0, 0, 0, 0, 0, 128, 128);
aclmdlSetAIPPCropParams(aippDynamicSet, 1, 2, 2, 224, 224, 0);
aclmdlSetInputAIPP(modelId, input, index, aippDynamicSet); 
aclmdlDestroyAIPP(aippDynamicSet);複製

如何使用DVPP功能

昇騰AI處理器內建影象處理單元DVPP,提供了強大的媒體處理硬加速能力。同時,異構計算架構CANN提供了使用影象處理硬體算力的入口:AscendCL介面,開發者可通過介面來進行影象處理,以便利用昇騰AI處理器的算力。

DVPP內的功能模組如下所示。

此處就以JPEGD圖片解碼+VPC圖片縮放為例來說明如何使用DVPP功能。這裡先通過一張圖總覽介面呼叫流程,包括資源初始化&去初始化、通道建立與銷燬、解碼、縮放、等待任務完成、釋放記憶體資源等。

總覽介面呼叫流程後,接下來我們以開發者更熟悉的方式“程式碼”來展示JPEGD圖片解碼+VPC圖片縮放功能的關鍵程式碼邏輯。

// 建立通道
acldvppChannelDesc dvppChannelDesc = acldvppCreateChannelDesc();
acldvppCreateChannel(dvppChannelDesc);
// 在JPEGD圖片解碼前,準備其輸入、輸出
// …… 
// 建立解碼輸出圖片描述資訊,設定輸出圖片的寬、高、圖片格式、記憶體地址等
acldvppPicDesc decodeOutputDesc = acldvppCreatePicDesc();
acldvppSetPicDescData(decodeOutputDesc, decodeOutputBuffer));
acldvppSetPicDescWidth(decodeOutputDesc, decodeOutputWidth);
acldvppSetPicDescHeight(decodeOutputDesc, decodeOutputHeight);
// 此處省略其它set介面……
// 執行JPEGD圖片解碼
acldvppJpegDecodeAsync(dvppChannelDesc, decodeInputBuffer, decodeInputBufferSize, decodeOutputDesc, stream);
// 5. 在VPC圖片縮放前,準備其輸入、輸出
// 建立縮放輸入圖片的描述資訊,並設定各屬性值,解碼的輸出作為縮放的輸入
acldvppPicDesc resizeInputDesc = acldvppCreatePicDesc();
acldvppSetPicDescData(resizeInputDesc, decodeOutputBuffer);
acldvppSetPicDescWidth(resizeInputDesc, resizeInputWidth);
acldvppSetPicDescHeight(resizeInputDesc, resizeInputHeight);
// 此處省略其它set介面……
// 建立縮放輸出圖片的描述資訊,並設定各屬性值
acldvppPicDesc resizeOutputDesc = acldvppCreatePicDesc();
acldvppSetPicDescData(resizeOutputDesc, resizeOutputBuffer);
acldvppSetPicDescWidth(resizeOutputDesc, resizeOutputWidth);
acldvppSetPicDescHeight(resizeOutputDesc, resizeOutputHeight);
// 此處省略其它set介面……
// 6. 執行VPC圖片縮放
acldvppVpcResizeAsync(dvppChannelDesc, resizeInputDesc,
 resizeOutputDesc, resizeConfig, stream);
// 7. JPEGD圖片解碼、VPC圖片縮放都是非同步任務,需呼叫以下介面阻塞程式執行,直到指定Stream中的所有任務都完成
aclrtSynchronizeStream(stream);

本節通過介面呼叫流程、示例程式碼帶大家瞭解了DVPP的功能開發,更多DVPP的功能介紹及使用請參見“昇騰文件中心”。

 

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