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的功能介紹及使用請參見“昇騰文檔中心”。

 

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