【2023 · CANN訓(xùn)練營第一季】數(shù)據(jù)預(yù)處理-JPEG數(shù)據(jù)解碼
【2023 · CANN訓(xùn)練營第一季】數(shù)據(jù)預(yù)處理-JPEG數(shù)據(jù)解碼
文檔參考:CANN文檔社區(qū)版: 6.0.RC1.alpha001
我們的模型輸入是固定的圖片格式、大小,但是實際上我們的想要進行推理的圖片是各種各樣的,在應(yīng)用中,我們常使用NV12的圖片作為模型的輸入。如果輸入是僅有Y分量的灰度圖,我們便可以通過將UV分量的部分補充為灰色而滿足我們的使用,但是如果我們的輸入為JPEG圖片,我們需要使用到ACL提供的媒體數(shù)據(jù)處理了相關(guān)API,對我們的圖片進行預(yù)處理,把jpg圖片進行解碼成YUV格式的內(nèi)容,并且獲得其圖片信息。
一、媒體數(shù)據(jù)處理API的V1
note:媒體數(shù)據(jù)處理V1版本與媒體數(shù)據(jù)處理V2版本的接口功能范圍相同,都是描述處理媒體數(shù)據(jù)的接口,用于實現(xiàn)摳圖、圖片縮放、格式轉(zhuǎn)換等功能,但兩套接口不能混用
在Device側(cè),我們對要進行媒體數(shù)據(jù)處理的相關(guān)數(shù)據(jù)的內(nèi)存的申請和釋放,就不可以簡單的使用malloc,new或者aclrtmalloc等申請的內(nèi)存了,我們需要使用dvpp接口。并且,從性能角度,為了減少拷貝,媒體數(shù)據(jù)處理的輸出作為模型推理的輸入,實現(xiàn)內(nèi)存復(fù)用。我們盡量申請足夠大的內(nèi)存進行反復(fù)使用,盡可能避免反復(fù)使用dvpp的接口申請內(nèi)存和釋放,造成一定的性能損耗。
1.dvpp內(nèi)存和通道
(1)內(nèi)存申請與釋放
note:調(diào)用該接口申請大頁內(nèi)存失敗,僅表示系統(tǒng)內(nèi)的大頁內(nèi)存不夠
(2)通道的創(chuàng)建與釋放
2.JPEGD相關(guān)接口
性能指標(biāo):
JPEGD性能指標(biāo)是基于硬件解碼的性能,JPEGD硬件解碼不支持3個SOS的圖片解碼,對于硬件不支持的格式,會使用軟件解碼,軟件解碼性能參考為1080P 15fps。JPEGD解碼的輸出圖片如果涉及旋轉(zhuǎn),則性能指標(biāo)低于軟件解碼的參考值,例如對于1080P的圖片,性能指標(biāo)低于15fps。
以下性能數(shù)據(jù),是基于一個stream上下發(fā)1個異步媒體數(shù)據(jù)處理任務(wù)后,執(zhí)行一次aclrtSynchronizeStream接口。
在我們代碼使用的過程中,其實最先需要了解的是我們所用的接口的性能,這直接影響到我們的使用方案,可以防止我們的代碼設(shè)計直接超越了模塊處理的性能。實際和官方標(biāo)量有的時候會有一點實測的出入,不過最好還是按照手冊中的描述進行預(yù)先規(guī)劃,以下為手冊中的指標(biāo):

功能說明:
JPEGD在解碼圖片時,支持對圖片進行旋轉(zhuǎn)。
JPEGD在解碼圖片時,支持按源圖片格式解碼。
圖片分辨率約束:
輸入圖片分辨率:最大分辨率:8192x8192,最小分辨率:32x32。
輸出圖片分辨率:JPEGD只對圖片解碼,不會改變圖片分辨率,因此輸出與輸入的圖片分辨率保持一致。
輸出的寬高對齊:
這里我僅寫出了我們下方代碼輸出的yuv420SP(NV12 8bit)的情況
寬stride為寬128對齊后的值。
高stride為高16對齊后的值。
內(nèi)存大?。▎挝籅yte)≥ 寬stride * 高stride * 3/2
接口說明:
二、代碼驗證與學(xué)習(xí)
代碼思路:
1.初始化好后,讀取一個jpg圖片并獲得其圖像信息,存入aclrtMalloc存入的內(nèi)存中
2.創(chuàng)建dvpp通道,并將其解碼為獲取到的圖像信息大小的yuv圖片
3.按照次序銷毀相關(guān)創(chuàng)建
好啦!讓我們編譯它!


有報錯,查看錯誤代碼,和該處代碼:

發(fā)現(xiàn)是銷毀時銷毀順序有問題,把Device和context都銷毀了,才銷毀通道。
所以,一定要注意銷毀順序?。。≈耙蔡岬竭^了,先創(chuàng)建->后銷毀,后創(chuàng)建->先銷毀?。?!
修改后:

代碼:
附上調(diào)試好的正確的代碼:
runDecode.cpp(主函數(shù)文件)
dvpp_decode.cpp(decode處理文件)
dvpp_decode.h
cmakelist可以參考我之前的文章里有。
到這里就結(jié)束啦,想要存下來看看結(jié)果的同學(xué)也可以存成.yuv文件用yuvplayer打開看看哦!
ps:該文僅是為了記錄CANN訓(xùn)練營的學(xué)習(xí)過程所用,不參與任何商業(yè)用途,有任何代碼問題可以和我一起討論修改