大俠好,歡迎來(lái)到FPGA技術(shù)江湖,江湖偌大,相見(jiàn)即是緣分。大俠可以關(guān)注FPGA技術(shù)江湖,在“闖蕩江湖”、"行俠仗義"欄里獲取其他感興趣的資源,或者一起煮酒言歡?!爸缶蒲詺g”進(jìn)入IC技術(shù)圈,這里有近50個(gè)IC技術(shù)公眾號(hào)。
第一部分 設(shè)計(jì)概述
1.1 設(shè)計(jì)目的
新冠病毒的肆虐讓整個(gè) 2020 年籠罩在恐慌之中,戴口罩成了人們外出必備 的“新日?!薄P鹿诓《局饕ㄟ^(guò)飛沫傳播和接觸傳播,正確選擇佩戴口罩,可有效阻隔病毒傳播。但在人流量龐大的商圈、車站等場(chǎng)所,仍有許多人拒絕佩戴口罩。若能在這些場(chǎng)所進(jìn)行當(dāng)前人群口罩檢測(cè),則能有效避免冠狀病毒的傳播。
本作品是一種能實(shí)時(shí)檢測(cè)識(shí)別人臉口罩佩戴情況并進(jìn)行語(yǔ)音播報(bào)的系統(tǒng),準(zhǔn)確度高達(dá) 95.2%,系統(tǒng)處理速度可達(dá) 25fps 左右。除此之外,本作品具備較高的可拓展性,稍加更改就可在更多的領(lǐng)域得到應(yīng)用。
1.2 應(yīng)用領(lǐng)域
基于深度學(xué)習(xí)的人臉捕獲及口罩檢測(cè)系統(tǒng)可以適用于人流量大的場(chǎng)所,實(shí)現(xiàn) 了人臉檢測(cè)與跟蹤以及人臉口罩識(shí)別的功能,并將識(shí)別結(jié)果進(jìn)行播報(bào),可以輔助疫情防控工作的開(kāi)展。
除此之外,本系統(tǒng)的人臉檢測(cè)系統(tǒng)有著廣泛的應(yīng)用范圍。
在智能家居領(lǐng)域,可以通過(guò)我們的系統(tǒng)實(shí)現(xiàn)人類闖入報(bào)警裝置,在攝像頭捕捉到的區(qū)域檢測(cè)到人臉后觸發(fā)報(bào)警;
在新冠疫情期間,我們的系統(tǒng)可以安裝在商圈、旅游景點(diǎn),實(shí)時(shí)檢測(cè)人流密度,為實(shí)時(shí)限流措施提供參考。
1.3 主要技術(shù)特點(diǎn)
對(duì)密集人群進(jìn)行口罩檢測(cè),首先要在畫面中進(jìn)行人臉檢測(cè)。在非深度學(xué)習(xí)階段的目標(biāo)檢測(cè)算法都是針對(duì)特定目標(biāo)提出的,比如 CVPR 2001 的 Viola-Jones (VJ)[1]是針對(duì)人臉檢測(cè)問(wèn)題,CVPR 2005 的 HOG+SVM[2]是針 對(duì)行人檢測(cè)問(wèn)題,TPAMI 2010 的 DPM[3]雖然可以檢測(cè)各類目標(biāo),但要用于多目標(biāo)檢測(cè),需要每個(gè)類別分別訓(xùn)練模板。而強(qiáng)大的深度學(xué)習(xí)只要一個(gè) CNN 就可以 搞定多類別檢測(cè)任務(wù)。雖然這些都是多類別方法,但它們也都可以用來(lái)解決單類別問(wèn)題。
本作品是基于深度學(xué)習(xí)的人臉捕獲及口罩檢測(cè)系統(tǒng),通過(guò)片外的圖像傳感器采集圖像到片上緩沖區(qū),而后把圖像送到 FPGA 上的神經(jīng)網(wǎng)絡(luò)加速器進(jìn)行處理, 識(shí)別結(jié)果輸出到顯示器,在顯示器中框出人臉并顯示目標(biāo)是否佩戴口罩,我們還使用語(yǔ)音模塊對(duì)畫面中的總?cè)藬?shù)和未戴口罩人數(shù)作出播報(bào)。
1.4 關(guān)鍵性能指標(biāo)
本作品可以實(shí)時(shí)檢測(cè)識(shí)別人臉口罩佩戴情況,我們從幀率和精度兩個(gè)方面進(jìn)行了分析。識(shí)別精度可達(dá)到 95.2%,而系統(tǒng)延遲僅僅 40ms 左右,可達(dá)到 25fps 的幀率。
1.5 主要?jiǎng)?chuàng)新點(diǎn)
神經(jīng)網(wǎng)絡(luò)部分創(chuàng)新點(diǎn)
1、使用了一個(gè)輕量級(jí) backbone,去除了 BN 層,在精度達(dá)到優(yōu)秀的前提下極大提升了速度;
2、去掉了 FPN 結(jié)構(gòu),僅降低微小的精度卻大大提升了速度(20%);
3、在網(wǎng)絡(luò)的 head 部分對(duì)邊框回歸和類別預(yù)測(cè)做了不對(duì)稱設(shè)計(jì),進(jìn)一步提升性能。
系統(tǒng)框架創(chuàng)新點(diǎn)
1、為了加快系統(tǒng)設(shè)計(jì),采用了 Xilinx 專用于卷積神經(jīng)網(wǎng)絡(luò)的深度學(xué)習(xí)處理單元(DPU)。在設(shè)計(jì)系統(tǒng)過(guò)程中,可根據(jù)系統(tǒng)的具體情況配置 DPU 的參數(shù),將該 IP 集成到所選器件 PL 中,通過(guò) PS 端軟件控制,實(shí)現(xiàn)多種卷積神經(jīng)網(wǎng)絡(luò)的加速。
2、利用 PYNQ 框架,可以在開(kāi)發(fā)板上動(dòng)態(tài)地加載比特流實(shí)現(xiàn)系統(tǒng)所需硬件電路,靈活方便。
3、利用 Vitis AI 編譯模型,將浮點(diǎn)模型轉(zhuǎn)換為定點(diǎn)模型,降低了計(jì)算復(fù)雜度,并且需要的內(nèi)存帶寬更少,提高了模型速度。
第二部分 系統(tǒng)組成及功能說(shuō)明
2.1 整體介紹
基于深度學(xué)習(xí)的人臉檢測(cè)系統(tǒng)由 PS 端、PL 端與外設(shè)及其接口組成。其中, 外設(shè)包括、攝像頭(通過(guò) USB3.0 連接)、語(yǔ)音模塊(通過(guò) UART 連接)和 VGA 顯示(通過(guò) Mini DP 轉(zhuǎn) VGA 連接),開(kāi)發(fā)板內(nèi)部還提供了 2GB 的 LPDDR4;PS 端包括 openCV 采集處理模塊、后處理模塊、語(yǔ)音控制模塊及顯示控制模塊;PL 端包括特征提取模塊和邊框回歸及分類模塊。在 PS 端的模塊中,openCV 采集處理模塊的主要功能是控制攝像頭采集圖像,并對(duì) LPDDR4 中的圖像進(jìn)行預(yù)處理;后處理模塊的主要功能是使用非極大值抑制(Non-Maximum Suppression, NMS)算法對(duì)候選區(qū)域進(jìn)行篩選,得到合適的區(qū)域信息并統(tǒng)計(jì)畫面中檢測(cè)到的人臉總數(shù);語(yǔ)音控制和顯示控制驅(qū)動(dòng)語(yǔ)音模塊和攝像頭構(gòu)成結(jié)果展示部分,語(yǔ)音控制模塊根據(jù)后處理模塊的結(jié)果播報(bào)當(dāng)前畫面中的人臉數(shù)目,而顯示控制模塊根據(jù) VGA 時(shí)序顯示拍攝畫面并框出人臉位置。PL 端中的特征提取模塊對(duì)預(yù)處理后的圖像進(jìn)行計(jì)算,得到大小不同的區(qū)域,邊框回歸及分類模塊處理這些區(qū)域,給出邊框信息與分類結(jié)果。
本系統(tǒng)的開(kāi)發(fā)平臺(tái)為 Ultra96-V2 開(kāi)發(fā)板,是基于 FPGA 的 Xilinx Zynq UltraScale +MPSoC 開(kāi)發(fā)板,并基于 Linaro 96Boards Consumer Edition(CE)規(guī)范構(gòu)建。
Ultra96-V2 開(kāi)發(fā)板系統(tǒng)框圖如下圖所示:
2.2 各模塊介紹
OpenCV 采集處理
本系統(tǒng)采用的是超微 1601U 攝像頭上圖所示,輸出圖像大小為 1280×720, 最高幀率可達(dá) 30fps。該攝像頭通過(guò) USB3.0 接口與開(kāi)發(fā)板連接,輸出圖像的數(shù)據(jù)格式支持 MJPEG 和 YUV 格式。它還支持自動(dòng)曝光控制 AEC 和自動(dòng)白平衡 AEB,可以調(diào)節(jié)亮度、對(duì)比度、色飽和度、色調(diào)等基礎(chǔ)參數(shù)。
通過(guò)系統(tǒng) PS 端的 OpenCV 來(lái)完成攝像頭相關(guān)參數(shù)的配置以及圖像幀的獲取, 之后對(duì)獲取的圖像進(jìn)行resize等預(yù)處理再送到PL部分的深度學(xué)習(xí)處理單元(DPU)進(jìn)行處理。
后處理
對(duì)于一幀圖像,該模塊接收到來(lái)自神經(jīng)網(wǎng)絡(luò)檢測(cè)模塊的 3780 個(gè)候選框信息 (包括邊框坐標(biāo)、識(shí)別標(biāo)簽、置信度)。后處理模塊首先對(duì)這些候選框進(jìn)行篩選, 留下置信度大于 0.6 的候選框。這一步可以減少無(wú)效候選框的處理時(shí)間。接著, 我們使用非極大值抑制算法對(duì)通過(guò)篩選的候選框進(jìn)行處理,去除重復(fù)的候選框, 得到最優(yōu)結(jié)果。最后將結(jié)果輸出給結(jié)果展示部分。
非極大值抑制,顧名思義就是抑制不是極大值的元素,可以理解為局部最大 搜索。這個(gè)局部代表的是一個(gè)鄰域,鄰域有兩個(gè)參數(shù)可變,一是鄰域的維數(shù),二是鄰域的大小。例如在行人檢測(cè)中,滑動(dòng)窗口經(jīng)提取特征,經(jīng)分類器分類識(shí)別后, 每個(gè)窗口都會(huì)得到一個(gè)分?jǐn)?shù)。但是滑動(dòng)窗口會(huì)導(dǎo)致很多窗口與其他窗口存在包含或者大部分交叉的情況。這時(shí)就需要用到 NMS 來(lái)選取那些鄰域里分?jǐn)?shù)最高(是行人的概率最大),并且抑制那些分?jǐn)?shù)低的窗口。
結(jié)果展示部分——語(yǔ)音控制
本系統(tǒng)中語(yǔ)音模塊的功能是在系統(tǒng)檢測(cè)完畢且后處理模塊統(tǒng)計(jì)畫面人數(shù)后, 將檢測(cè)結(jié)果通過(guò)語(yǔ)音的方式播報(bào)給外界。語(yǔ)音模塊 JQ8900-16P 選用了 SoC 方案, 集成了一個(gè) 16 位的 MCU,能夠靈活更換 SPI-flash 內(nèi)的語(yǔ)音內(nèi)容,有一線串口控制模式和 RX232 串口控制模式可選。
由于開(kāi)發(fā)板上有多個(gè) USB 接口,我們采用 USB 轉(zhuǎn)串口的方式來(lái)控制語(yǔ)音模塊。具體控制方式為把檢測(cè)到的人數(shù)轉(zhuǎn)化為語(yǔ)音模塊的控制指令,通過(guò)串口發(fā)送到該模塊,語(yǔ)音模塊對(duì)指令進(jìn)行解碼之后播報(bào)存放在該模塊內(nèi)的相應(yīng)音頻。
結(jié)果展示部分——顯示控制
經(jīng)過(guò)神經(jīng)網(wǎng)絡(luò)處理之后的圖像由開(kāi)發(fā)板上的 Mini DP 接口外接 Mini DP 轉(zhuǎn) VGA 轉(zhuǎn)接頭,連接到 VGA 顯示器進(jìn)行顯示。
識(shí)別模塊
本系統(tǒng)中卷積神經(jīng)網(wǎng)絡(luò)模塊的功能是對(duì)攝像頭采集圖像中的人臉進(jìn)行檢測(cè)并判斷目標(biāo)人臉上是否佩戴口罩,是系統(tǒng)的核心模塊。本小節(jié)將從數(shù)據(jù)集的制作、 特征提取模塊、軟件模型設(shè)計(jì)和硬件模型設(shè)計(jì)等四個(gè)方面介紹該模塊。
(1)數(shù)據(jù)集的制作
數(shù)據(jù)集主要來(lái)自于 WIDER Face 和 MAFA 數(shù)據(jù)集,加入了上百?gòu)埓骺谡值?圖片(來(lái)源于網(wǎng)絡(luò))。具體地,我們從 WIDER Face 中篩選出 7000 張,從 MAFA 中篩選出 2000 張,自己根據(jù)已有的戴口罩的數(shù)據(jù)集生成了 2000 張左右,最終分為訓(xùn)練集 13000 張,測(cè)試集 300 張。值得一提的是,在我們自己生成的數(shù)據(jù)集圖片中,有許多是將有口罩的圖片與無(wú)口罩的圖片的組合,如圖 6 最右所示,因?yàn)樵诮?jīng)典數(shù)據(jù)集中很難找到這樣的情況。
2)神經(jīng)網(wǎng)絡(luò)模型的搭建和訓(xùn)練
本系統(tǒng)采用的目標(biāo)檢測(cè)算法為 anchor-base 的 one-stage 算法,整個(gè)網(wǎng)絡(luò)參考 了 RetinaNet[4]進(jìn)行設(shè)計(jì),可分為 backbone、neck、head 三大部分。其中,backbone 參考 BlazeFace[5]的設(shè)計(jì)去掉了 BN 層,這樣能在不影響準(zhǔn)確率的前提下提高速度。在 RetinaNet 的 neck 部分中,F(xiàn)PN[6]有很好的特征提取功能,引入 FPN 能解決較為復(fù)雜的問(wèn)題。但由于 FPN 需要額外的卷積計(jì)算,它也在一定程度上降低了速度。由于本次應(yīng)用只有兩個(gè)類別,有口罩和無(wú)口罩,識(shí)別困難度比較低,我們參考了 SSD[7]的結(jié)構(gòu),去掉 FPN 部分,僅用一個(gè)卷積層調(diào)整通道。對(duì)于 head 部分, 由于只有兩個(gè)類別,我們減少了 class 分支的卷積層,不再與 boxes 分支對(duì)稱。減少卷積層并沒(méi)有引起精度下降,但進(jìn)一步提升了速度。
我們 anchor 設(shè)置如下:
總共有(24×40+12×20+6×10)×3=3780 個(gè) anchor,最小尺寸為 20,最大尺 寸為 127。
整體網(wǎng)絡(luò)框架如下所示:
整體網(wǎng)絡(luò)可分為兩部分——特征提取模塊與邊框回歸及分類模塊。
對(duì)于特征提取模塊的處理如圖 6 所示。令輸入圖像為 P0,其尺寸為 192×320;P1 由 P0 經(jīng)過(guò)一個(gè)卷積層和兩個(gè) blaze_block 得到,P1 經(jīng)過(guò)三個(gè) blaze_block 得到 P2 ;P3 由 P2 經(jīng) 過(guò) 三 個(gè) double_blaze_block 得來(lái), P4 由 P3 經(jīng)過(guò)三個(gè) double_blaze_block 得來(lái),P5 由 P4 經(jīng)過(guò)三個(gè) double_blaze_block 得來(lái)。P3、P4 和 P5 是本模塊的輸出,即識(shí)別模塊的輸入。其中 blaze_block 由 DepthwiseConv2D + Conv2D + MaxPool2D + Add 組成,double_blaze_block 由 DepthwiseConv2D + Conv2D + DepthwiseConv2D + Conv2D + MaxPool2D + Conv2D + Add 組成。各層 參數(shù)詳見(jiàn)本文附錄中軟件模型的源代碼。
邊框回歸及分類模塊對(duì) P3、P4、P5 進(jìn)行分析。RetinaNet 類別分支和邊框分 支分別采用了四個(gè)卷積層,本設(shè)計(jì)采用了 RetinaNet 的 head 設(shè)計(jì)思想,但是進(jìn)行 了改進(jìn):我們減少了卷積層的數(shù)量,邊框分支采用三個(gè)卷積層,類別分支采用兩個(gè)卷積層。因?yàn)橹挥袃蓚€(gè)類別,所以我們的類別分支和邊框分支采用了不對(duì)稱設(shè)計(jì),將類別分支的卷積層進(jìn)一步減少。減少類別分支的卷積層對(duì)準(zhǔn)確率幾乎沒(méi)有影響,但提升了速度。
(3)硬件部分
該部分利用支持 PYNQ 框架的開(kāi)發(fā)板鏡像。首先通過(guò)在開(kāi)發(fā)板上加載帶 Xilinx 的 DPU IP 的比特流文件,把 DPU 燒寫到開(kāi)發(fā)板的 PL 端;再通過(guò)安裝在開(kāi)發(fā)板鏡像上的 DPU 驅(qū)動(dòng),調(diào)用相應(yīng)的 API 把經(jīng)過(guò) Vitis AI 編譯過(guò)的模型部署到 DPU 中;最后啟動(dòng) DPU 讀取預(yù)處理之后的圖像進(jìn)行檢測(cè)和分類,DPU 運(yùn)算完之后取出運(yùn)算結(jié)果,對(duì)運(yùn)算結(jié)果進(jìn)行解析之后得到人臉框的坐標(biāo)以及是否佩戴口罩的分類結(jié)果。
第三部分 完成情況及性能參數(shù)
3.1 完成情況
本系統(tǒng)目前可以實(shí)現(xiàn):
實(shí)時(shí)檢測(cè)并跟蹤人臉位置,人臉位置被框出;
人臉檢測(cè)框上方給出目標(biāo)是否戴口罩 mask/nomask 以及置信度;
定時(shí)對(duì)當(dāng)前人數(shù)與未佩戴口罩人數(shù)進(jìn)行語(yǔ)音播報(bào)。
3.2 人臉檢測(cè)性能指標(biāo)
本系統(tǒng)基于人臉捕捉及口罩識(shí)別的應(yīng)用對(duì) RetinaNet 進(jìn)行優(yōu)化,并利用硬件加速,大大提升了處理速度。目前該系統(tǒng)可對(duì) 192×320 大小的三通道彩色視頻進(jìn)行實(shí)時(shí)處理,幀率可達(dá) 25fps,精度可達(dá) 95.2%。
第四部分 總結(jié)
可擴(kuò)展之處
目前系統(tǒng)圖像采集時(shí)間占總體時(shí)間的比例比較大,后期可探索更多軟硬件優(yōu)化的方法對(duì)圖像采集部分進(jìn)行優(yōu)化,提升系統(tǒng)幀率。除此之外,目前我們的應(yīng)用是進(jìn)行口罩(人臉)的檢測(cè),未來(lái)可在此基礎(chǔ)上進(jìn)行拓展加入識(shí)別模型,識(shí)別模型可以精確識(shí)別出是哪一個(gè)人,這樣可將應(yīng)用范圍進(jìn)一步拓展,比如說(shuō)門禁的人臉識(shí)別、簽到、智能監(jiān)控等等。