幫一個創業的小夥伴轉的他們自己開源的一個人臉戴口罩檢測模型,效果還不錯,支持一下,嘿嘿!原文鏈接在此
-
近一個月來,新冠肺炎疫情牽動着全國人民的心,一線醫護工作者在最前線抗擊疫情的同時,我們也可以看到很多科技行業和人工智能領域的從業者,也在貢獻着他們的力量。近些天來,曠視、商湯、海康、百度都多家科技公司研發出了帶有AI人臉檢測算法的紅外測溫、口罩佩戴檢測等設備,依圖、阿里也研發出了通過深度學習來自動診斷新冠肺炎的醫療算法。可以說,各行各業的從業者都在爲早日戰勝這場疫情貢獻着力量。
作爲互聯網+AI領域的創業團隊,我們決定開源我們整理的口罩檢測數據集和訓練好的模型(提供keras版本和caffe版本)、代碼,另外,我們也將模型轉爲了TensorFlow.js支持的格式,部署到了我們的網站aizoo.com上,方便大家在瀏覽器裏面體驗。
在文章末尾,有我們開源的所有資料的鏈接,如果您不想看文章內容,可以直接滑到文章底部查看資料鏈接。
首先,讓我們先看一個效果視頻。視頻沒法轉,有興趣的小夥伴去看原文吧 -
視頻中紅色是未戴口罩,綠色是佩戴了口罩。可以看到,如果是雙手捂住了嘴巴多半部分,模型會認爲是未戴口罩(關於這一點,下文會有討論)。
下面,我們將從模型結構、數據和TensorFlow.js部署三大方面介紹本項目。好了,廢話不多說了,Let’s go~
一. 模型介紹
-
在深度學習時代之前,人臉檢測一般採用傳統的、基於手動設計特徵的方法,其中最知名的莫過於Viola-Jones算法,至今部分手機和數碼相機內置的人臉檢測算法,仍舊採用Viola-Jones算法。然而,隨着深度學習技術的蓬勃發展,基於深度學習的人臉檢測算法逐步取代了傳統的計算機視覺算法。
-
在人臉檢測最常用的數據集——WIDER Face數據集的評估結果上來看,使用深度學習的模型在準確率和召回率上極大的超過了傳統算法。下圖的青線是Viola-Jones的Precision-Recall圖。
- 下圖是衆多基於深度學習的人臉檢測算法的性能評估PR曲線。可以看到基於深度學習的人臉檢測算法的性能,大幅超過了VJ算法(曲線越靠右越好)。近兩年來,人臉檢測算法在WIDER Face的簡單測試集(easy 部分)上可以達到95%召回率下,準確率也高達90%,作爲對比,VJ算法在40%召回率下,準確率只有75%左右。
-
其實,基於深度學習的人臉檢測算法,多數都是基於深度學習目標檢測算法進行的改進,或者說是把通用的目標檢測模型,爲適應人臉檢測任務而進行的特定配置。而衆多的目標檢測模型(Faster RCNN、SSD、YOLO)中,人臉檢測算法最常用的是SSD算法,例如知名的SSH模型、S3FD模型、RetinaFace算法,都是受SSD算法的啓發,或者基於SSD進行的任務定製化改進, 例如將定位層提到更靠前的位置,Anchor大小調整、Anchor標籤分配規則的調整,在SSD基礎上加入FPN等。
在筆者個人看來,SSD是最優雅、簡潔的目標檢測模型,因此,我們實現的人臉口罩檢測模型,也是採用SSD的思想,限於篇幅原因,本文不會詳細介紹SSD的原理,只會進行簡單的模型配置介紹。
後面,元峯也會寫一些詳細介紹SSD算法和實現的文章,並開源筆者實現的極簡的目標檢測訓練框架,以及SSD和YoloV3的對比分析等,我會發到我們的公衆號上,歡迎大家關注AIZOO公衆號。 -
在本項目中,我們使用的是SSD架構的人臉檢測算法,相比於普通的人臉檢測模型只有人臉一個類別,而人臉口罩檢測,只不過是增加了一個類別,變成戴口罩人臉和不戴口罩的人臉兩個類別而已。我們開源的模型是一個非常小的模型,輸入是260x260大小,主幹網絡只有8層,有五個定位和分類層,一共只有28個卷積層。而每個卷積層的通道數,是32、64、128這三種,所有這個模型總的參數量只有101.5萬個參數。下圖是網絡的結構圖。
-
其中,上面八個卷積層是主幹網絡,也就是特徵提取層,下面20層是定位和分類層(注意,爲了方便顯示,我們沒有畫出BN層)。
訓練目標檢測模型,最重要的合理的設置anchor的大小和寬高比,筆者個人在做項目時,一般會統計數據集的目標物體的寬高比和大小來設置anchor的大小和寬高比。例如,在我們標註的口罩人臉數據集上,我們讀取了所有人臉的標註信息,並計算每個人臉高度與寬度的比值,統計得到高度與寬比的分佈直方圖,如下:
-
因爲人臉的一般是長方形的,而很多圖片是比較寬的,例如16:9的圖片,人臉的寬度和高度歸一化後,有很多圖片的高度是寬度的2倍甚至更大。從上圖也可以看出,歸一化後的人臉高寬比集中在1~2.5之間。所以,根據數據的分佈,我們將五個定位層的anchor的寬高比統一設置爲1,0.62, 0.42。(轉換爲高寬比,也就是約1,1.6:1,2.4:1)
-
五個定位層的配置信息如下表所示:
卷基層 | 特徵圖大小 | anchor大小 | anchor寬高比 |
---|---|---|---|
第一層 | 33x33 | 0.04, 0.056 | 1, 0.62, 0.42 |
第二層 | 17x17 | 0.08, 0.11 | 1, 0.62, 0.42 |
第三層 | 9x9 | 0.16, 0.22 | 1, 0.62, 0.42 |
第四層 | 5x5 | 0.32, 0.45 | 1, 0.62, 0.42 |
第五層 | 3x3 | 0.64, 0.72 | 1, 0.62, 0.42 |
- 筆者使用基於Keras實現的目標檢測微框架訓練的人臉口罩檢測模型,爲了避免一些網友提到的使用手擋住嘴巴就會欺騙部分口罩檢測系統的情況,我們在數據集中加入了部分嘴巴被手捂住的數據,另外,我們還在訓練的過程中,隨機的往嘴巴部分粘貼一些其他物體的圖片,從而避免模型認爲只要露出嘴巴的就是沒戴口罩,沒露出嘴巴的就是帶口罩這個問題,通過這兩個規避方法,我們很好的解決了這個問題,大家可以在aizoo.com體驗我們的模型效果。後處理部分主要就是非最大抑制(NMS),我們使用了單類的NMS,也就是戴口罩人臉和不戴口罩人臉兩個類別一起做NMS,從而提高速度。
二. 數據
-
其實,做這個項目,筆者使用個人實現的檢測框架,只用兩個小時就搞定了訓練部分。但是,爲了整理數據,筆者花了整整兩天的時間。如果我們花兩天時間寫代碼,我們不覺得痛苦,但是如果花兩天時間標註數據,那是一個相當痛苦的事情。
-
最初,筆者使用了B站一個本科生小夥公開的的1千多張圖片訓練了一個模型,但是該數據集比較單一,很容易出現用手捂住嘴巴,模型就認爲是戴口罩這種問題,後面,筆者決定自己整理數據集。
-
人臉檢測數據集非常多,其中最常用的莫過於WIDER Face數據集,我們從中選擇了3894張圖片,並進行了校驗,主要是將部分戴口罩的人臉標註爲戴口罩。對於戴口罩的人臉,我們使用了中科院信工所葛仕明老師開源的MAFA數據集,該數據集本是一個遮擋人臉的數據集,其中有各種被遮擋的人臉圖片,大多數都是被口罩遮擋的人臉圖片,我們從中選擇了4064張人臉戴口罩的圖片。
-
MAFA數據集的人臉位置定義與WIDER Face有較大區別,MAFA的人臉框在靠近眉毛上方,是正方形的,而且標註框不嚴格(框離臉部邊緣有縫隙),而WIDER Face的人臉框在額頭上方,如果不進行修改,會導致模型對於不戴口罩的人臉,檢測框是到額頭上方,而戴口罩的人臉,檢測框只到眉毛上方。因此,我們重新標註了這部分MAFA數據。(標註數據真的是一個非常難受的過程~)。我們最終對數據進行了隨機劃分爲訓練集和驗證集。下表是數據統計。
練集 來自WIDER Face 來自MAFA 共計 練集/張 3114 3006 6120 證集/張 780 1059 1839
-關於數據部分,我們就介紹到這裏。需要的朋友可以在文末找到下載鏈接。或者在公衆號回覆“口罩數據集”也可以獲取到鏈接。
三. TensoFlow.js部署
-
爲了便於在瀏覽器部署模型,我們特意將模型設計的非常小,這導致一個弊端就是模型會犧牲一部分性能,但是速度會非常快,在普通CPU上也可以做到實時性。最終的模型在驗證集上的Precision-Recall曲線如下圖所示:
-
因爲WIDER Face本身是一個稍微複雜的數據集,再加上我們模型的輸入和參數量比較小,所以,可以看到對於人臉的AP只有0.896。不過,這點可以通過設計大一點的模型改善性能。如果您有需要更高精度的模型,歡迎聯繫我們。
-
使用Keras訓練好模型後,我們將其轉換爲TensorFlow.js格式,並使用JavaScript對口罩人臉檢測模型進行了部署。模型的效果圖如下圖所示:
開源資料獲取
最後,是我們開源的相關資料的獲取方式。
• 數據下載地址提取碼: eyfz
• 在線體驗鏈接
======================= END ========================
我是元峯,互聯網+AI領域的創業者,歡迎掃描下方二維碼,或者直接在微信搜索“AIZOO”關注我們的公衆號AIZOO。
如果您是有算法需求,例如目標檢測、人臉識別、缺陷檢測、行人檢測的算法需求,歡迎添加我們的微信號AIZOOTech與我們交流,我們團隊是一羣算法工程師的創業團隊,會以高效、穩定、高性價比的產品滿足您的需求。
如果您是算法或者開發工程師,也可以添加我們的微信號AIXZOOTech,請備註學校or公司名稱-研究方向-暱稱,例如“西電-圖像算法-元峯”,元峯會拉您進我們的算法交流羣,一起交流算法和開發的知識,以及對接項目。