大俠好,歡迎來(lái)到FPGA技術(shù)江湖,江湖偌大,相見(jiàn)即是緣分。大俠可以關(guān)注FPGA技術(shù)江湖,在“闖蕩江湖”、"行俠仗義"欄里獲取其他感興趣的資源,或者一起煮酒言歡?!爸缶蒲詺g”進(jìn)入IC技術(shù)圈,這里有近50個(gè)IC技術(shù)公眾號(hào)。
第一部分 設(shè)計(jì)概述(Design Introduction)
1.1?設(shè)計(jì)目的
近年來(lái)隨著機(jī)器學(xué)習(xí)等技術(shù)的發(fā)展,人工智能在圖像識(shí)別、語(yǔ)音處理等方面的能力不斷增強(qiáng)、應(yīng)用范圍不斷擴(kuò)大,這極大的方便了人們的生活。然而隨之帶來(lái)的安全問(wèn)題也變得越來(lái)越不可忽視。
鑒于此,我們決定采用 Xilinx 的 PYNQ-Z2 開(kāi)發(fā)板,將 FPGA 高度并行化的特點(diǎn)與人工智能安全相結(jié)合,設(shè)計(jì)了一種具有實(shí)時(shí)人臉偽造能力的視頻采集設(shè)備。目的在于對(duì)視頻 數(shù)據(jù)進(jìn)行有針對(duì)性的偽造,協(xié)助安全系統(tǒng)的評(píng)估與改進(jìn)。相較于傳統(tǒng)的基于軟件實(shí)現(xiàn)的人臉偽造系統(tǒng),采用FPGA,功耗與成本較低,實(shí)時(shí)性較高,偽造結(jié)果真實(shí),并且隱蔽性更高。對(duì)安全系統(tǒng)的性能具有更大的挑戰(zhàn),更有助于安全系統(tǒng)的測(cè)試。
1.2 應(yīng)用領(lǐng)域
本作品的應(yīng)用前景十分廣泛,例如在人臉支付領(lǐng)域,可以對(duì)現(xiàn)有的人臉識(shí)別系統(tǒng)進(jìn)行 測(cè)試,輔助找出人臉識(shí)別系統(tǒng)的漏洞,進(jìn)而提高人臉識(shí)別系統(tǒng)的穩(wěn)定性與可靠性。如果利用在會(huì)議視頻中,可以協(xié)助會(huì)議平臺(tái)完善對(duì)參會(huì)者的身份驗(yàn)證的系統(tǒng),防止出現(xiàn)利用參會(huì)者的照片、視頻信息冒名頂替的行為。
1.3 主要技術(shù)特點(diǎn)
(1)總體采用 Deepfake 框架,本質(zhì)是由一套人臉識(shí)別、合成、融合構(gòu)成的技術(shù)框架,屬 于圖像模型在軟硬件結(jié)合的深度學(xué)習(xí)中的應(yīng)用。
(2)軟件端的算法設(shè)計(jì)包括錨框、人臉特征檢測(cè)、點(diǎn)云匹配、DeepFake Module、泊松融合、前后景融合、邊緣膨脹等技術(shù)。
(3)硬件端的相關(guān)層采用 Xilinx 開(kāi)發(fā)的神經(jīng)網(wǎng)絡(luò)加速 IP 核 DPU,同時(shí)結(jié)合 Vitis AI 對(duì)神經(jīng)網(wǎng)絡(luò)模型進(jìn)行壓縮優(yōu)化編譯,轉(zhuǎn)換成可供 FPGA 使用的神經(jīng)網(wǎng)絡(luò)模型。
1.4 關(guān)鍵性能指標(biāo)
(1)延遲:使用 DeepFake 后的延遲約為 270ms。
(2) 幀率:在 640×360 的分辨率下,經(jīng)過(guò) DeepFake 后的 FPGA 輸出的幀率約為 4fps。
1.5 主要?jiǎng)?chuàng)新點(diǎn)
(1)采用軟硬件結(jié)合的方式來(lái)實(shí)現(xiàn) Deepfake 框架,相較于傳統(tǒng)采用 GPU 加速的方式具有功耗低、體積小、成本低的特點(diǎn)。
(2)對(duì) Deepfake 算法進(jìn)行了優(yōu)化,一方面圖像信息存儲(chǔ)采用 int8 數(shù)據(jù)類型,激活函數(shù)采用計(jì)算更快的 ReLU。另一方面對(duì)輸入輸出矩陣的維度進(jìn)行調(diào)整。這些優(yōu)化對(duì)算法速度有很大提升。
(3)完成可配置性的設(shè)計(jì),一方面從硬件角度采用多種視頻流的接入方式(硬件攝像頭/ 網(wǎng)絡(luò)攝像頭),另一方面在算法的圖像融合部分設(shè)計(jì)了兩種不同的算法。這些設(shè)計(jì)可以適應(yīng)不同處理質(zhì)量、實(shí)時(shí)性和應(yīng)用場(chǎng)景的要求。
第二部分 系統(tǒng)組成及功能說(shuō)明 (System Construction & Function Description)
2.1 系統(tǒng)介紹
本系統(tǒng)由 Xilinx Zynq-7000 系列的 PYNQ-Z2 開(kāi)發(fā)板作為主控中心,主要包含攝像頭 (視頻)采集模塊、圖像處理模塊、數(shù)據(jù)處理終端??傮w結(jié)構(gòu)如圖 1 所示,圖像處理結(jié)構(gòu)如圖 2 所示。
系統(tǒng)流程圖說(shuō)明:
由攝像頭獲取人物實(shí)時(shí)的圖片信息,傳送給 PYNQ-Z2 開(kāi)發(fā)板,并在 PYNQ-Z2 中采用 神經(jīng)網(wǎng)絡(luò)模型對(duì)圖像進(jìn)行處理。最后將處理結(jié)果返回到上位機(jī)終端,實(shí)現(xiàn)真假人臉的轉(zhuǎn)換。
圖像處理算法部分說(shuō)明:
首先進(jìn)行幀截取,將動(dòng)態(tài)視頻流轉(zhuǎn)換成靜態(tài)幀。通過(guò)錨框?qū)⑷砣讼竦娜四槻糠纸厝〕鰜?lái),再通過(guò)人臉特征檢測(cè)提取出人臉的特征。再提取出特征之后,采用點(diǎn)云匹配算法完成整個(gè)人臉的對(duì)齊,而后直接使用 Deepfake Module 換掉對(duì)齊后的人臉,再通過(guò)點(diǎn)云匹配將換后的人臉對(duì)齊。然后采用泊松融合或者前后景+邊緣膨脹的方式將人臉還原到靜態(tài)圖片幀(具體采用哪種取決于算力與實(shí)時(shí)性的要求),最終將靜態(tài)圖片幀還原到視頻流中。
2.2 硬件模塊介紹
2.2.1 FPGA 開(kāi)發(fā)板
本系統(tǒng)主要采用 Xilinx Zynq-7000 的 PYNQ-Z2 開(kāi)發(fā)板作為主控中心。從硬件方面上, 該開(kāi)發(fā)板采用 FPGA+ARM 的雙處理架構(gòu),擁有采用 Cortex-A9 雙核處理器的 ARM 芯片, 主頻可以達(dá)到 650MHz,同時(shí)還有快速的 Block RAM 芯片,速度可以達(dá)到 630KB。從軟件方面上,Xilinx 提供大量的 Python API,同時(shí)提供深度學(xué)習(xí)相關(guān)的 IP 核 DPU 以及相應(yīng)的配套軟件 Vitis AI,可以快速部署相應(yīng)的深度學(xué)習(xí)模型。
2.2.2 視頻采集模塊
該模塊采用羅技的 C270 高清攝像頭。攝像頭采用 USB 2.0 接口,內(nèi)置麥克風(fēng),同時(shí)免驅(qū)動(dòng)。捕獲畫(huà)面最大可達(dá)到 1280×720。使用較為簡(jiǎn)便,并且可以達(dá)到本項(xiàng)目的要求,因此十分適合在該項(xiàng)目中使用。
2.2.3 FPGA 硬件 IP 核 DPU
DPU 的詳細(xì)硬件架構(gòu)如圖 5 所示。啟動(dòng)時(shí),DPU 獲取片內(nèi)存儲(chǔ)器中的指令來(lái)控制計(jì)算引擎的運(yùn)行。這些指令是由 Vitis AI 編譯器生成的,并且在編譯時(shí)進(jìn)行了很多優(yōu)化。片上存儲(chǔ)器用于緩沖輸入,中間和輸出數(shù)據(jù),以實(shí)現(xiàn)高吞吐量和處理效率。DPU 中的數(shù)據(jù)均盡可能重復(fù)使用來(lái)減少內(nèi)存帶寬并且使用基于深度流水線設(shè)計(jì)的計(jì)算引擎。處理元件(PE) 充分利用了 Xilinx 器件中的細(xì)粒度構(gòu)造塊,例如多路復(fù)用器,加法器和累加器等。
同樣的這里給出 DPU 的端口圖如圖 6 所示,端口的詳細(xì)類型、數(shù)據(jù)位寬、I/O 類型以及簡(jiǎn)單的描述在圖 7 中。
2.3 圖像處理算法介紹
2.3.1 視頻流接入的設(shè)計(jì)
考慮到可能的不同情境,我們?yōu)榇嗽O(shè)計(jì)了兩種視頻流的接入方式。一種是采用 USB 在安裝好攝像頭驅(qū)動(dòng)的 PYNQ 開(kāi)發(fā)板上直接插入攝像頭(PYNQ 直接處理),另一種方式是采用網(wǎng)絡(luò)攝像頭的網(wǎng)絡(luò)傳輸接入方式(PYNQ 作為加速器)。網(wǎng)絡(luò)攝像頭采用 Python 中的 socket 庫(kù)進(jìn)行開(kāi)發(fā),可以完成視頻流的接收與轉(zhuǎn)發(fā)。USB 方式和網(wǎng)絡(luò)攝像頭方式可以分別適應(yīng)遠(yuǎn)程與近程兩種控制模式。
2.3.2 錨框+人臉特征檢測(cè)
錨框部分:
錨框部分是我們對(duì)整體Deepfake框架的第一次優(yōu)化,因此這里首先對(duì)算法的選擇進(jìn)行說(shuō)明。最開(kāi)始時(shí)考慮使用OpenCV中內(nèi)置的機(jī)器學(xué)習(xí)函數(shù)庫(kù)HaarCascade。OpenCV中有Haar 級(jí)聯(lián)分類器,通過(guò)分析對(duì)比相鄰圖像區(qū)域來(lái)判斷給定圖像或者圖像區(qū)域與已知對(duì)象是否匹 配。可以將多個(gè)Haar級(jí)聯(lián)分類器組合起來(lái),每個(gè)分類器負(fù)責(zé)匹配一個(gè)特征區(qū)域(比如眼 睛),然后進(jìn)行總體識(shí)別。也可以一個(gè)分類器進(jìn)行整體區(qū)域識(shí)別(比如人臉),其他分類器可識(shí)別小的部分(比如眼睛)等。但是Opencv提供的Haar級(jí)聯(lián)分類器和跟蹤器并不具有旋轉(zhuǎn)不變性,也就是說(shuō)無(wú)法較好的識(shí)別側(cè)臉。而且只有將輸入圖片的尺寸設(shè)計(jì)在64×64時(shí)才 能將時(shí)間控制在40ms以下。此時(shí)的識(shí)別效果很差,故舍棄該方法。接下來(lái)采用opencv中的dnn函數(shù)對(duì)基于mobilenet-ssd 網(wǎng)絡(luò)設(shè)計(jì)的人臉檢測(cè)模型進(jìn)行推理。雖然此時(shí)的識(shí)別率較高并且清晰度也較好,但是耗時(shí)大約為300ms,時(shí)間極長(zhǎng),也放棄了該方法。因此,最后考慮使用Densebox方法來(lái)錨框。
DenseBox 目標(biāo)檢測(cè)算法是一個(gè)集成的 FCN 框架,并且不需要生成 proposal,在訓(xùn)練過(guò)程中也可以達(dá)到最優(yōu)。與現(xiàn)存的基于滑動(dòng)窗的 FCN 的檢測(cè)框架相類似,DenseBox 更偏重于小目標(biāo)及較為模糊目標(biāo)的檢測(cè),比較適合對(duì)人臉的檢測(cè)。整體流程如圖 10 所示。
單一的卷積網(wǎng)絡(luò)同時(shí)輸出不同的預(yù)測(cè)框及類別分?jǐn)?shù)。DenseBox 中的所有目標(biāo)檢測(cè)模塊 都為全卷積網(wǎng)絡(luò)結(jié)構(gòu),除了 NMS 處理部分,因此沒(méi)有必要生成 proposal。人臉錨框時(shí),輸 入圖片大小為?? × ?? × 3,輸出為??/4 × ??/4 × 5。將目標(biāo)邊界框左上角及右下角的點(diǎn)的坐標(biāo)域定 義為???? = (???? , ????)及???? = (????, ????),則第 i 個(gè)位置的像素的輸出就可以用一個(gè) 5 維向量描述
其中s^代表識(shí)別到是目標(biāo)的分?jǐn)?shù),剩余幾個(gè)變量代表輸出像素位置與真實(shí)邊框之間的距離。最后對(duì)帶有邊框及類別分?jǐn)?shù)的框進(jìn)行 NMS 處理。其中 NMS(非極大值抑制)就是抑制不是極大值的元素,可以理解為局部最大搜索。這個(gè)局部代表一個(gè)兩參數(shù)可變的鄰域,一是鄰域的維數(shù),二是鄰域的大小。這個(gè)操作的目的實(shí)際上就是將重疊框最后減少到 只有一個(gè)框。
在具體的工程實(shí)現(xiàn)中,在權(quán)衡實(shí)時(shí)性、圖片質(zhì)量等多個(gè)因素之后,我們采用 320× 320 × 3的輸入和 80× 80 × 4與 80× 80 × 2的輸出。其中 80× 80 × 4的輸出是每個(gè)框的左上角和右下角坐標(biāo)。80× 80 × 2的輸出是每個(gè)框是人臉的概率和不是人臉的概率。注意這里比上面的算法流程中多出一維,是因?yàn)閷⑹侨四樅筒皇侨四樀母怕示敵龀鰜?lái)了, 而算法流程中僅輸出是人臉的概率。最后在 DPU 的 IP 核上運(yùn)行該算法,每檢測(cè)一張人臉的耗時(shí)為 43ms。較好的平衡了計(jì)算耗時(shí)與計(jì)算效果。具體在這個(gè)工程中的網(wǎng)絡(luò)結(jié)構(gòu)如圖 11 所示。
人臉特征檢測(cè)部分:
該部分網(wǎng)絡(luò)結(jié)構(gòu)的思想來(lái)自 VanillaCNN,為了更好的匹配 FPGA 的特點(diǎn)和處理要求, 這里將原網(wǎng)絡(luò)調(diào)整成新的 98 個(gè)關(guān)鍵點(diǎn)的 landmark 網(wǎng)絡(luò)。98 landmark 這個(gè)網(wǎng)絡(luò)是專門為 DPU 計(jì)算設(shè)計(jì)的,因?yàn)?DPU 不支持 tanh 函數(shù)和絕對(duì)值單元,這里采用 ReLU 作為激活函 數(shù)。ReLU 的計(jì)算成本比較低,并且由于激活函數(shù)大部分的梯度為 0,因此訓(xùn)練的速度也更快。多次訓(xùn)練該網(wǎng)絡(luò),最后能將網(wǎng)絡(luò)的測(cè)試損失從 0.022 減少到 0.019。同時(shí)為了提高該神經(jīng)網(wǎng)絡(luò)的空間分辨率,這里采用擴(kuò)張卷積替換了原始算法中的池化層,這一步將網(wǎng)絡(luò)的測(cè)試損耗從 0.019 降低到 0.011。原始算法中僅能進(jìn)行 5 個(gè)特征的標(biāo)注,這在 Deepfake 框架 后面的換臉中明顯是不夠用的,因此這里將特征的標(biāo)注數(shù)量從 5 個(gè)增長(zhǎng)到 98 個(gè)。相應(yīng)的, 網(wǎng)絡(luò)的輸入層從原輸入40 × 40 Pixels 變?yōu)?0 × 80 Pixels,輸出層由原來(lái) 10 輸出的全連接層修改成 196 輸出的全連接層,其中 98 個(gè) x 坐標(biāo)和 98 個(gè) y 坐標(biāo)。具體的網(wǎng)絡(luò)結(jié)構(gòu)如圖 12 所示。最終采用這個(gè)網(wǎng)絡(luò)標(biāo)注一張臉花費(fèi)的時(shí)間約為 7ms。
2.3.3 人臉對(duì)齊
Umeyama 是一種點(diǎn)云匹配算法,是將源點(diǎn)云變換到目標(biāo)點(diǎn)云的相同坐標(biāo)系下,包含了 常見(jiàn)的矩陣變換和 SVD 的分解過(guò)程。算法的核心在于使變換前后兩組點(diǎn)之間的均方距離最小。具體來(lái)說(shuō)就是對(duì)兩組均為 d 維的點(diǎn)集 A 和 B(各包含 n 個(gè)樣本點(diǎn)),假定點(diǎn)集 A 的均值為????,均方差為????,點(diǎn)集 B 的均值為????,均方差為????,點(diǎn)集 A 與點(diǎn)集 B 之間的協(xié)方差
則兩組點(diǎn)之間的均方距離用下式表示:
定義矩陣 S 為
當(dāng)協(xié)方差矩陣的秩恰為d-1時(shí)對(duì) S 進(jìn)行修改
對(duì)協(xié)方差矩陣進(jìn)行 SVD 分解得到
當(dāng)協(xié)方差矩陣的秩不小于d-1的時(shí)候參數(shù)表示如下
通過(guò)該算法就可以將已經(jīng)標(biāo)記好的人臉特征進(jìn)行標(biāo)準(zhǔn)化旋轉(zhuǎn),方便下面在對(duì)應(yīng)位置直接進(jìn)行換臉。
2.3.4 DeepFake Model
網(wǎng)絡(luò)總體采用 Encoder – Decoder 的形式。網(wǎng)絡(luò)由一個(gè) Encoder 和兩個(gè) Decoder 組成,兩個(gè) Decoder 分別對(duì)應(yīng)換臉人照片和換臉對(duì)象照片的解碼。其中 Encoder – Decoder 的網(wǎng)絡(luò)結(jié)構(gòu)如圖 13 和圖 14 所示。
這里涉及到對(duì) Deepfake 框架優(yōu)化的第二點(diǎn),相比于在 CPU 和 GPU 上運(yùn)行的該框架的算法,這里為更好適應(yīng) FPGA 的特點(diǎn)對(duì)網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行了重建。具體的網(wǎng)絡(luò)實(shí)現(xiàn)如圖 15 和 圖 16 所示。
相比于原始算法中的網(wǎng)絡(luò)結(jié)構(gòu),新的網(wǎng)絡(luò)結(jié)構(gòu)將中間 Flatten 的步驟刪去。在 Encoder 中采用卷積與激活函數(shù)結(jié)合的方式,取 leak 值為 0.1,并且保證每次讓區(qū)域的長(zhǎng)和寬減小為原來(lái)的二倍,讓區(qū)域的深度增長(zhǎng)到原來(lái)的二倍。在 Decoder 中在卷積與激活函數(shù)后面加上上采樣的過(guò)程,每次卷積將深度減為原來(lái)的一半,每次上采樣將區(qū)域的長(zhǎng)和寬增長(zhǎng)到原來(lái)的兩倍。
2.3.5 調(diào)色
考慮到訓(xùn)練時(shí)換臉人與換臉對(duì)象的數(shù)據(jù)集可能在拍攝時(shí)處在不同的光線條件下,或者換臉人與換臉對(duì)象的膚色本身存在一定的差異。因此這里為了保證能更好的融合換臉人和被換臉對(duì)象的面部,提前進(jìn)行調(diào)色。假定換臉人人臉的圖像矩陣為 A,換臉對(duì)象的人臉圖像矩陣為 B,調(diào)色后的人臉圖像矩陣為 C,則有如下關(guān)系:
后面的融合部分采用這個(gè)調(diào)色后的圖像。
2.3.6 融合內(nèi)核
考慮到該項(xiàng)目的實(shí)時(shí)性要求與 FPGA 有限的計(jì)算資源之間的矛盾,這里提供兩種融合內(nèi)核。根據(jù)不同的計(jì)算資源與實(shí)時(shí)性的要求,在項(xiàng)目中可以采用不同的內(nèi)核。方案 A 是泊松融合內(nèi)核,方案 B 是前后景+邊緣膨脹的內(nèi)核??偟膩?lái)說(shuō)第二種比第一種的融合效果稍差,但是計(jì)算的速度更快,因此實(shí)時(shí)性更好。
方案 A 泊松融合
假定有待克隆的圖像區(qū)域 g,還有一張背景圖片 S,泊松融合能將圖像 g 自然融合到背景圖片 S 中。其中??與?? ?代表對(duì)應(yīng)區(qū)域的像素值,v 是原圖像的梯度場(chǎng), 是原圖, 是邊界。實(shí)際上就是求下面的式子的最小值。
而這個(gè)最小值的解實(shí)際對(duì)應(yīng)泊松等式的解:
對(duì)應(yīng)的算法流程如下:
Step 1:計(jì)算圖像 g 的梯度場(chǎng) v 和背景圖片和融合圖像的梯度場(chǎng)。
Step 2:求解融合圖像的散度場(chǎng)即 Laplace 坐標(biāo)。
Step 3:用這個(gè) Laplace 坐標(biāo)和原圖求解泊松等式。
方案 B 前后景+邊緣膨脹融合前后景的方法如下:
Step1:創(chuàng)建需要替換人臉的區(qū)域并轉(zhuǎn)為灰度圖片,并通過(guò)灰度設(shè)置閾值對(duì)比,建立 mask 區(qū)域。
Step2:?分別對(duì)需要替換人臉的區(qū)域和用來(lái)替換的人臉進(jìn)行掩膜保護(hù),留下需要的圖片。
Step3:將人臉區(qū)域和用來(lái)替換的人臉進(jìn)行合并。?邊緣膨脹:?為了保證融合后的邊緣過(guò)渡的更加自然,這里采用邊緣膨脹進(jìn)行邊緣的完善。?定義像素點(diǎn)的膨脹范圍卷積核如下
指定范圍為9 × 9的矩陣,表示每個(gè)像素點(diǎn)的膨脹范圍,對(duì)原圖像進(jìn)行卷積操作就可以完成 邊緣膨脹。
2.4 Python 算法與 FPGA 結(jié)合的流程
由于這個(gè)項(xiàng)目采用的是神經(jīng)網(wǎng)絡(luò)、Python 與 FPGA 的聯(lián)合開(kāi)發(fā),因此這里有必要對(duì)文件在 Vitis AI、DNNDK 中的綜合以及在 DPU 中的調(diào)用流程進(jìn)行一定的說(shuō)明。?文件的綜合:
對(duì)于采用 TensorFlow 編寫(xiě)的神經(jīng)網(wǎng)絡(luò),首先要生成 frozen_float.pb 文件,然后對(duì)該文件進(jìn)行量化生成 deploy_model.pb 文件。對(duì)于采用 caffe 編寫(xiě)的神經(jīng)網(wǎng)絡(luò),首先要生成 float. caffemodel 以及 float.prototxt 文件,然后對(duì)這些文件進(jìn)行量化生成 deploy.prototxt 以及 deploy.caffemodel 文件。在生成上面的文件后,使用 dnnc 工具將上面的文件轉(zhuǎn)換成 model.elf 文件,通過(guò)鏈接生成對(duì)應(yīng)的 libdpumodel.so 文件,然后就可以在 PYNQ 中直接調(diào)用了。
文件的調(diào)用:
在程序開(kāi)始時(shí)調(diào)用 dpuOpen 打開(kāi) DPU,然后調(diào)用 dpuLoadKernal 將先前綜合好的網(wǎng)絡(luò)模型加載到 DPU 中。調(diào)用 dpuCreateTask 為該網(wǎng)絡(luò)模型創(chuàng)建一個(gè)任務(wù),同時(shí)調(diào)用 dpuRunTask 運(yùn)行這個(gè)網(wǎng)絡(luò)模型。當(dāng)這個(gè)模型計(jì)算完成后,調(diào)用 dpuDestroyKernel 釋放這個(gè) DPU 內(nèi)核。最后當(dāng)全部的計(jì)算完成后,調(diào)用 dpuClose 關(guān)閉整個(gè) DPU。
第三部分 完成情況及性能參數(shù)(Final Design & Performance Parameters)
3.1 FPGA 資源消耗
3.1.1 硬件加速
通過(guò) vivado 搭建了神經(jīng)網(wǎng)絡(luò)加速的底層 IP 核,vivado 生成的 Block Design,如圖 18 所示。圖中展示了各 IP 之間的連接關(guān)系和數(shù)據(jù)流的傳輸過(guò)程。
3.1.2 DPU 的設(shè)置
如圖 19 所示,底層采用單一的 DPU 核,并選取 B1152 的 DPU 架構(gòu)。使用較少的 RAM 并允許通道增強(qiáng)、允許帶有維度信息的卷積和平均池化操作,選擇的激活函數(shù)為ReLU 類。因?yàn)?PYNQ 的 DPU 不支持 softmax,因此這里不選用 softmax,softmax 的計(jì)算在 ARM 的內(nèi)核中實(shí)現(xiàn)。
3.1.3 系統(tǒng)資源消耗
如圖 20 所示,系統(tǒng)目前 LUT 占用 68%,BRAM 占用 88%,DSP 占用 96%,F(xiàn)F 占用 59%。
3.2 圖像處理網(wǎng)絡(luò)模型資源占用情況
3.2.1 DenseBox 網(wǎng)絡(luò)的資源消耗
可以看到 DenseBox 網(wǎng)絡(luò)代碼大小為 0.09MB,參數(shù)占用大約 0.50MB,乘加操作 485.38 百萬(wàn)次/秒,IO 存儲(chǔ)占 0.49MB。
3.2.2 LandMark 網(wǎng)絡(luò)的資源消耗
可以看到 LandMark 網(wǎng)絡(luò)代碼大小為 0.04MB,參數(shù)占用大約 0.77MB,乘加操作 43.46 百萬(wàn)次/秒,IO 存儲(chǔ)占 0.12MB。
3.2.3 DeepFake 網(wǎng)絡(luò)的資源消耗
可以看到 DeepFake 網(wǎng)絡(luò)代碼大小為 0.15MB,參數(shù)占用大約 28.64MB,乘加操作 4415.42 百萬(wàn)次/秒,IO 存儲(chǔ)占 0.57MB。
3.3 圖像處理算法各步驟的結(jié)果
首先從視頻流中截取出靜態(tài)圖,如圖 24 所示
然后經(jīng)過(guò)錨框與人臉特征檢測(cè)處理,處理結(jié)果如圖 25 所示
在上面處理的基礎(chǔ)上經(jīng)過(guò)點(diǎn)云變換和 DeepFake Model 產(chǎn)生換完臉后的圖,同時(shí)這里要對(duì)換完的臉再次進(jìn)行特征提取,這幾步操作結(jié)果分別如圖 26 和圖 27 所示。
最后采用泊松融合或者前后景+邊緣膨脹后接調(diào)色+點(diǎn)云匹配的方式將換完的人臉融合到被換臉人的臉上,就可以得到最終的換臉結(jié)果如圖 28 所示。
3.4 n2cube 的數(shù)據(jù)讀取 API 優(yōu)化
最初開(kāi)發(fā)中,我們使用 DPU 在 Python 的 n2cube API 上進(jìn)行開(kāi)發(fā),但是在模型推理結(jié)束,讀取模型結(jié)構(gòu)到內(nèi)存的過(guò)程中我們發(fā)現(xiàn) n2cube.dpuGetOutputTensorInXXX 這幾個(gè) API 函數(shù)具有較大的性能瓶頸。在讀取 Densebox 的80 × 80 × 4 + 80 × 80 × 2的 int8 的結(jié)果時(shí)耗時(shí)接近 300ms,遠(yuǎn)不能滿足實(shí)時(shí)性的要求。因此我們著手對(duì)這幾個(gè)讀取數(shù)據(jù)的 API 接口進(jìn)行優(yōu)化,具體的優(yōu)化和每步的耗時(shí)如圖 29 和圖 30 所示。
可以看出,優(yōu)化后的 API 接口在相同數(shù)據(jù)長(zhǎng)度的條件下處理耗時(shí)要少得多。通過(guò)測(cè)試,優(yōu)化后的算法比優(yōu)化前的算法快約 30 倍。
第四部分 總結(jié)(Conclusions)
4.1?可擴(kuò)展之處
(1)從算力角度上講:?由于 PYNQ-Z2 的計(jì)算能力有限,因此一方面視頻處理的實(shí)時(shí)性和效果存在一定的局限性,另一方面無(wú)法同時(shí)處理音頻與視頻。之后考慮可以采用算力更高的 Ultra96 開(kāi)發(fā)板進(jìn) 行音視頻的協(xié)同 DeepFake,或者采用 FPGA 陣列提高單位時(shí)間內(nèi)的處理能力,甚至在云端接入 GPU,將 FPGA 作為實(shí)體輸入,加速深度網(wǎng)絡(luò)的計(jì)算。
(2)從算法角度講:?這里采用的 DeepFake Model 相對(duì)比較簡(jiǎn)單,僅使用了類似 Unet 的 Encoder-Decoder 模型,圖像處理的質(zhì)量存在較大的改進(jìn)空間,這里可以考慮在算力有了一定提升的基礎(chǔ)上在 計(jì)算損失函數(shù)時(shí)增加 GAN 的處理部分,提高圖像處理的質(zhì)量。