當(dāng)我們訓(xùn)練好神經(jīng)網(wǎng)絡(luò)之后,下一步就是在HEVC的實(shí)際編碼過程中使用這個(gè)神經(jīng)網(wǎng)絡(luò)模型提升編碼效率野蝇,如果不能將神經(jīng)網(wǎng)絡(luò)集成到HEVC的編碼器中進(jìn)行編碼讼稚,那我們訓(xùn)練這個(gè)編碼的神經(jīng)網(wǎng)絡(luò)就失去了意義,并且绕沈,這樣也不方便驗(yàn)證我們的模型到底能節(jié)省多少編碼時(shí)間锐想,以及BDBR和BD-PSNR的變化。
我已經(jīng)將整個(gè)pipeline實(shí)現(xiàn)并且開源到了GitHub:
GitHub - wolverinn/HEVC-deep-learning-pipeline: Integrating neural network models in HEVC encoder, to test the complexity reduction using deep learning in HEVC intra-prediction.
要將模型部署到pipeline乍狐,首先要設(shè)計(jì)出pipeline的大致流程赠摇,并且,由于我們是在C++源碼中嵌入Python運(yùn)行神經(jīng)網(wǎng)絡(luò)模型,因此需要注意運(yùn)行時(shí)間的問題藕帜,應(yīng)該盡可能優(yōu)化流程以提升編碼效率烫罩,以下是我設(shè)計(jì)的流程:
首先,在HEVC編碼器開始編碼之前洽故,加入一行代碼啟動(dòng)Python腳本贝攒,這個(gè)Python腳本的功能是提取出要編碼的YUV文件的每一幀,并且對(duì)每一幀使用神經(jīng)網(wǎng)絡(luò)模型預(yù)測(cè)對(duì)應(yīng)的最佳分割深度时甚。腳本以多線程方式啟動(dòng)隘弊,因?yàn)橐粋€(gè)YUV文件有很多幀,預(yù)測(cè)不是一會(huì)兒就能做完的撞秋,如果每次編碼都臨時(shí)去預(yù)測(cè)或者等它全部預(yù)測(cè)完再啟動(dòng)編碼长捧,時(shí)間就會(huì)長(zhǎng)很多。預(yù)測(cè)的結(jié)果存儲(chǔ)在txt文件中吻贿,并且可以通過當(dāng)前第幾幀、第幾個(gè)CTU找到哑子。
在HEVC編碼CTU時(shí)舅列,通過索引找到對(duì)應(yīng)的分割信息的預(yù)測(cè)值,當(dāng)HEVC開始遍歷所有深度時(shí)卧蜓,如果當(dāng)前所在深度和預(yù)測(cè)深度一致帐要,則只計(jì)算當(dāng)前深度,不繼續(xù)向下分割弥奸,如果當(dāng)前深度還未到達(dá)預(yù)測(cè)深度榨惠,則不計(jì)算當(dāng)前深度,直接向下分割盛霎。
不計(jì)算當(dāng)前深度赠橙,實(shí)現(xiàn)方式主要就是在xCompressCu
中,跳過xCheckRDCostIntra
這個(gè)函數(shù)愤炸。不繼續(xù)分割的實(shí)現(xiàn)方式就是闻镶,阻止xCompressCu
的遞歸調(diào)用寂呛,直接把pcSubBestPartCU->getTotalCost()
賦值為最大的浮點(diǎn)數(shù)。
我在我的神經(jīng)網(wǎng)絡(luò)模型上測(cè)試了一下這個(gè)流程,編碼時(shí)間大概能減少70%郊霎,所以這個(gè)設(shè)計(jì)還是很有效的。具體的改動(dòng)可以去看我的GitHub洒沦,上面有更多細(xì)節(jié)赁温。