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