亚洲农村老熟妇肥BBBB_无码人妻精品一区二区蜜桃色_精品亚洲AⅤ无码午夜在线观看_中文字幕熟妇人妻在线视频_囯产色无码精品视频免费

當(dāng)前位置: 首頁 > 科技新聞 >

使用OpenCV、Keras\u002FTensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩

時間:2020-08-08 16:18來源:網(wǎng)絡(luò)整理 瀏覽:
源代碼地址:https://www.pyimagesearch.com/2020/05/04/covid-19-face-mask-dete
使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

源代碼地址:

https://www.pyimagesearch.com/2020/05/04/covid-19-face-mask-detector-with-opencv-keras-tensorflow-and-deep-learning/#download-the-code

在本教程中,您將學(xué)習(xí)如何使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)來訓(xùn)練COVID-19口罩探測器

上個月,我在博客上寫了一篇關(guān)于使用深度學(xué)習(xí)檢測X光圖像中COVID-19的文章。

讀者真的很喜歡在及時、實(shí)用的教程中學(xué)習(xí),所以今天我們來看看另一個與COVID相關(guān)的計算機(jī)視覺應(yīng)用,這個應(yīng)用是關(guān)于用OpenCV和Keras/TensorFlow檢測口罩的。

我在受到以下情況的啟發(fā)后編寫了本教程:

1、收到許多來自PyImageSearch讀者的請求,要求我寫這樣一篇博客

2、看到其他人實(shí)現(xiàn)的解決方案(我最喜歡的是Prajna Bhandary的,我們將從今天開始構(gòu)建

在正確部署的情況下,今天我們在這里構(gòu)建的COVID-19口罩探測器可能有助于確保您和其他人的安全(但我將把這留給醫(yī)療專業(yè)人員來決定、實(shí)施和在外部署)。

要學(xué)習(xí)如何使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)創(chuàng)建COVID-19口罩檢測器,請繼續(xù)閱讀!

COVID-19:使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

在本教程中,我們將討論我們的兩階段COVID-19口罩檢測器,詳細(xì)說明如何實(shí)現(xiàn)我們的計算機(jī)視覺/深度學(xué)習(xí)流水線。

之后,我們將審查數(shù)據(jù)集并用于訓(xùn)練我們的自定義口罩探測器。

然后我將向您展示如何實(shí)現(xiàn)一個Python腳本來使用Keras和TensorFlow在我們的數(shù)據(jù)集上訓(xùn)練一個口罩檢測器。

我們將使用這個Python腳本來訓(xùn)練一個口罩檢測器并檢查結(jié)果。

給定經(jīng)過訓(xùn)練的COVID-19口罩檢測器,我們將繼續(xù)實(shí)現(xiàn)另外兩個Python腳本,用于:

1、在圖像中檢測COVID-19口罩

2、實(shí)時視頻流中的口罩檢測

我們將通過探討口罩探測器的效果來總結(jié)這篇文章。我還將提供一些進(jìn)一步改進(jìn)的建議。

兩階段COVID-19面罩檢測器

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

圖1:使用計算機(jī)視覺和深度學(xué)習(xí)構(gòu)建COVID-19口罩檢測器的階段和各個步驟。

為了訓(xùn)練一個定制的口罩檢測器,我們需要將我們的項(xiàng)目分成兩個不同的階段,每個階段都有各自的子步驟(如上圖1所示):

訓(xùn)練:在這里,我們將聚焦于從磁盤加載我們的口罩檢測數(shù)據(jù)集,在此數(shù)據(jù)集上訓(xùn)練模型(使用Keras/TensorFlow),然后將口罩檢測器序列化到磁盤

部署:一旦口罩檢測器訓(xùn)練完畢,我們就可以加載口罩檢測器,執(zhí)行面部檢測,然后將每個面部圖像分為帶口罩和不帶口罩

在本教程的其余部分中,我們將詳細(xì)介紹這些階段和相關(guān)子集,但同時,先讓我們看看將用于訓(xùn)練COVID-19口罩檢測器的數(shù)據(jù)集。

我們的COVID-19口罩檢測數(shù)據(jù)集

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

圖2:面罩檢測數(shù)據(jù)集由“帶口罩”和“無口罩”圖像組成。我們將使用該數(shù)據(jù)集構(gòu)建一個COVID-19口罩檢測器,該檢測器基于計算機(jī)視覺,并使用Python、OpenCV和TensorFlow/Keras進(jìn)行深度學(xué)習(xí)。

我們今天將在這里使用的數(shù)據(jù)集是由PyImageSearch讀者Prajna Bhandary創(chuàng)建的。

此數(shù)據(jù)集包含1376個圖像,屬于兩個類別:

1、帶口罩:690張圖片

2、無口罩:686張圖片

我們的目標(biāo)是訓(xùn)練一個定制的深度學(xué)習(xí)模型來檢測一個人是否戴著口罩。

注意:為了方便起見,我在本教程的“下載”部分提供了Prajna創(chuàng)建的數(shù)據(jù)集。

我們的口罩?jǐn)?shù)據(jù)集是如何創(chuàng)建的?

Prajna和我一樣,一直對世界的現(xiàn)狀感到失落和沮喪——每天都有成千上萬的人死去,對我們許多人來說,我們能做的(如果有的話)很少。

為了保持積極的狀態(tài),Prajna決定運(yùn)用計算機(jī)視覺和深度學(xué)習(xí)來解決現(xiàn)實(shí)世界的問題,以此分散自己的注意力:

1、最佳的場景-她可以利用自己的項(xiàng)目幫助他人

2、最差的場景-這給了她一個非常需要的精神寄托

不管怎樣,都是雙贏的!

作為程序員、開發(fā)人員和計算機(jī)視覺/深度學(xué)習(xí)實(shí)踐者,我們都可以從Prajna的書中翻開一頁——讓你的技能成為你的寄托和避風(fēng)港。

為了創(chuàng)建這個數(shù)據(jù)集,Prajna有一個巧妙的解決方案:

1、拍攝人臉的正常圖像2、然后創(chuàng)建一個自定義的計算機(jī)視覺Python腳本來向它們添加口罩,從而創(chuàng)建一個人工(但仍然適用于現(xiàn)實(shí)世界)數(shù)據(jù)集

這種方法實(shí)際上比聽起來容易地多,只需要使用面部標(biāo)記來實(shí)現(xiàn)。面部標(biāo)記允許我們自動推斷面部結(jié)構(gòu)的位置,包括:眼睛、眉毛、鼻子、嘴、下頜線。

要使用面部標(biāo)記構(gòu)建一個戴口罩的面部數(shù)據(jù)集,我們首先需要從一個沒有戴口罩的人像開始:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

圖3:為了建立一個COVID-19/冠狀病毒的口罩?jǐn)?shù)據(jù)集,我們首先從一張沒有戴口罩的人的照片開始。

在此基礎(chǔ)上,我們應(yīng)用人臉檢測來計算人臉在圖像中的邊界位置:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

圖4:下一步是應(yīng)用面部檢測。這里我們使用了一種深度學(xué)習(xí)方法來使用OpenCV執(zhí)行人臉檢測。

一旦我們知道人臉在圖像中的位置,我們就可以提取感興趣區(qū)域(ROI):

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

圖5:下一步是使用OpenCV和NumPy切片提取面部ROI。

從那里,我們應(yīng)用面部標(biāo)記,定位眼睛、鼻子、嘴等:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

圖6:然后,我們使用dlib檢測面部標(biāo)志,這樣我們就知道在臉上的哪個位置放置面罩。

接下來,我們需要一個口罩的圖像(帶有透明背景),如下所示:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

圖7:COVID-19/冠狀病毒面罩/防護(hù)罩示例。由于我們知道人臉的標(biāo)記位置,這個面罩將自動覆蓋在原始的人臉ROI上。

通過使用面部標(biāo)記(即沿下巴和鼻子的點(diǎn))來計算口罩的放置位置,該口罩將自動應(yīng)用于面部。

然后調(diào)整口罩的大小并旋轉(zhuǎn),將其放置在面部上:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

圖8:在這個圖中,口罩被放在原來的圖片中的人的臉上。很難一眼看出,COVID-19口罩是通過OpenCV和dlib人臉標(biāo)志的計算機(jī)視覺技術(shù)添加上去的。

然后,我們可以對所有輸入圖像重復(fù)此過程,從而創(chuàng)建我們的人工口罩?jǐn)?shù)據(jù)集:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

圖9:顯示了一組人工COVID-19口罩圖像。這一套將是我們的“帶口罩”和“不帶口罩”數(shù)據(jù)集的一部分,用于COVID-19面罩的計算機(jī)視覺檢測和使用Python、OpenCV和TensorFlow/Keras的深度學(xué)習(xí)。

但是,在使用此方法人工創(chuàng)建數(shù)據(jù)集時,需要注意一點(diǎn)!

如果使用一組圖像創(chuàng)建戴口罩的人的人工數(shù)據(jù)集,則無法“重用”訓(xùn)練集中沒有口罩的圖像-仍需要收集未在人工生成過程中使用過的無口罩圖像!

如果將用于生成口罩樣本的原始圖像作為無口罩樣本,則模型將具有嚴(yán)重的偏向性,無法廣泛適用。為了避免這種情況要不惜一切代價花時間收集沒有口罩的面部圖像。

介紹如何使用面部標(biāo)記將口罩應(yīng)用于面部不在本教程的范圍內(nèi),但如果您想了解更多信息,我建議:

參考Prajna若的GitHub庫

https://github.com/prajnasb/observations/tree/master/mask_classifier/Data_Generator

在PyImageSearch博客上閱讀另一個教程,在那篇教程中我將討論如何使用面部標(biāo)記自動將太陽鏡應(yīng)用于面部(https://www.pyimagesearch.com/2018/11/05/creating-gifs-with-opencv/)

我的太陽鏡帖子中的原理同樣適用于構(gòu)建一個人工口罩?jǐn)?shù)據(jù)集——使用面部標(biāo)記推斷面部結(jié)構(gòu),旋轉(zhuǎn)并調(diào)整口罩大小,然后將其應(yīng)用于圖像。

項(xiàng)目結(jié)構(gòu)

從本文的“下載”部分獲取文件后,將顯示以下目錄結(jié)構(gòu):

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

dataset/目錄包含“我們的COVID-19口罩檢測數(shù)據(jù)集”部分中描述的數(shù)據(jù)。

提供了三個圖像示例/以便您可以測試靜態(tài)圖像口罩檢測器。

在本教程中,我們將回顧三個Python腳本:

train_mask_detector.py:接受我們的輸入數(shù)據(jù)集并對其進(jìn)行微調(diào),以創(chuàng)建我們的mask_detector.model。還將生成包含精度/損失曲線的training history plot.png

detect_mask_image.py:在靜態(tài)圖像中執(zhí)行口罩檢測

detect_mask_video.py:使用網(wǎng)絡(luò)攝像頭,此腳本將對視頻流中的每個幀應(yīng)用口罩檢測

在接下來的兩部分中,我們將訓(xùn)練我們的口罩檢測器。

用Keras和TensorFlow實(shí)現(xiàn)COVID-19口罩檢測器訓(xùn)練腳本

現(xiàn)在,我們已經(jīng)回顧了我們的口罩?jǐn)?shù)據(jù)集,讓我們學(xué)習(xí)如何使用Keras和TensorFlow訓(xùn)練分類器來自動檢測一個人是否戴著口罩。

為了完成這項(xiàng)任務(wù),我們將對MobileNet V2體系結(jié)構(gòu)進(jìn)行微調(diào),這是一種高效的體系結(jié)構(gòu),可應(yīng)用于計算能力有限的嵌入式設(shè)備(例如,樹莓Pi、Google Coral、NVIDIA Jetson Nano等)。

注意:如果你對嵌入式計算機(jī)視覺感興趣,一定要看看我的《樹莓派的計算機(jī)視覺》一書,書中介紹了如何使用性能有限的設(shè)備實(shí)現(xiàn)計算機(jī)視覺和深度學(xué)習(xí)。

將我們的口罩檢測器部署到嵌入式設(shè)備可以降低制造此類口罩檢測系統(tǒng)的成本,這也是我們選擇使用此架構(gòu)的原因。

我們開始吧!

打開目錄結(jié)構(gòu)中的train_mask_detector.py文件,并插入以下代碼:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

導(dǎo)入我們的訓(xùn)練腳本可能讓您產(chǎn)生恐懼,要么是因?yàn)橛刑嗟哪_本,要么您是深度學(xué)習(xí)的新手。如果你是新手,我建議在前進(jìn)之前閱讀我的Keras教程和fine_tuning教程。

我們導(dǎo)入的tensorflow.keras實(shí)現(xiàn):

1、數(shù)據(jù)擴(kuò)充

2、加載MobilNetV2分類器(我們將使用預(yù)先訓(xùn)練的ImageNet權(quán)重微調(diào)此模型)3、構(gòu)建新的全連接(FC)頭

4、預(yù)處理

5、加載圖像數(shù)據(jù)

我們將使用scikit learn(sklearn)對類標(biāo)簽進(jìn)行二進(jìn)制化、對數(shù)據(jù)集進(jìn)行分段并打印分類報告。

我的imutils路徑實(shí)現(xiàn)將幫助我們在數(shù)據(jù)集中查找和列出圖像。我們將使用matplotlib繪制訓(xùn)練曲線。

要安裝必要的軟件以便您可以使用這些庫,請務(wù)必遵循我的Tensorflow 2.0+安裝指南:

1、如何在Ubuntu上安裝TensorFlow 2.0

2、如何在macOS上安裝TensorFlow 2.0

讓我們繼續(xù)分析一些從終端啟動腳本所需的命令行參數(shù):

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

我們的命令行參數(shù)包括:

--dataset:帶口罩的面部和和面部輸入數(shù)據(jù)集的路徑

--plot:輸出訓(xùn)練歷史圖,將使用matplotlib生成

--model:序列化生成的口罩分類模型的路徑

我喜歡在一個地方定義我的深度學(xué)習(xí)超參數(shù):

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

在這里,我指定了超參數(shù)常數(shù),包括我的初始學(xué)習(xí)速率、訓(xùn)練階段數(shù)和批處理大小。稍后,我們將應(yīng)用“學(xué)習(xí)速率衰減計劃”,這就是我們將學(xué)習(xí)速率變量命名為INIT_LR的原因。

現(xiàn)在,我們準(zhǔn)備加載并預(yù)處理我們的訓(xùn)練數(shù)據(jù):

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

在這個部分,我們做的是:

獲取數(shù)據(jù)集中的所有imagepath(第44行)

初始化data和labels列表(第45行和第46行)

在imagePaths上循環(huán)并加載+預(yù)處理圖像(第49-60行)。預(yù)處理步驟包括調(diào)整到224×224像素,轉(zhuǎn)換為數(shù)組格式,并將輸入圖像中的像素強(qiáng)度縮放到范圍[-1,1](通過preprocess_input快捷功能)

將預(yù)處理image和相關(guān)label分別附加到data和labels列表(第59行和第60)

確保我們的訓(xùn)練數(shù)據(jù)是NumPy數(shù)組格式(第63和64行)

上面幾行代碼假設(shè)您的整個數(shù)據(jù)集足夠小,可以放入內(nèi)存。如果您的數(shù)據(jù)集大于可用的內(nèi)存,我建議使用HDF5,這是我在Deep Learning for Computer Vision with Python(從業(yè)者包第9章和第10章)中介紹的一種策略。

我們的數(shù)據(jù)準(zhǔn)備工作還沒有完成。接下來,我們將對標(biāo)簽進(jìn)行編碼,對數(shù)據(jù)集進(jìn)行分區(qū),并準(zhǔn)備進(jìn)行數(shù)據(jù)擴(kuò)充:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

第67-69行對我們的類標(biāo)簽進(jìn)行one-hot編碼,這意味著我們的數(shù)據(jù)將采用以下格式:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

如您所見,labels數(shù)組的每個元素都由一個數(shù)組組成,其中只有一個索引是“hot”(即1)。

使用scikit learn的便利方法,第73行和第74行將我們的數(shù)據(jù)分成80%的訓(xùn)練和剩余的20%的測試。

在訓(xùn)練過程中,我們將對我們的圖像應(yīng)用動態(tài)突變,以提高泛化能力。這稱為數(shù)據(jù)增強(qiáng),第77-84行上設(shè)定隨機(jī)旋轉(zhuǎn)、縮放、剪切、偏移和翻轉(zhuǎn)參數(shù)。我們將在訓(xùn)練時使用aug對象。

但首先,我們需要準(zhǔn)備MobileNetV2進(jìn)行微調(diào):

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

微調(diào)設(shè)置是一個三步過程:

使用預(yù)先訓(xùn)練過的ImageNet權(quán)重加載MobileNet,排除網(wǎng)絡(luò)頭(第88行和第89行)

構(gòu)造一個新的FC頭,并將其附加到基座上以代替舊的頭(第93-102行)

凍結(jié)網(wǎng)絡(luò)的基本層(第106和107行)。在反向傳播過程中,這些基本層的權(quán)重不會被更新,而頭層的權(quán)重將被調(diào)整。

微調(diào)是一種策略,我?guī)缀蹩偸墙ㄗh在節(jié)省大量時間的同時建立一個基線模型。要了解有關(guān)理論、目的和策略的更多信息,請參閱我的fine-tuning blog posts 和Deep Learning for Computer Vision with Python (從業(yè)者包第5章)。

隨著我們的數(shù)據(jù)準(zhǔn)備和模型結(jié)構(gòu)的微調(diào)到位,我們現(xiàn)在準(zhǔn)備編譯和訓(xùn)練我們的訓(xùn)練檢測網(wǎng)絡(luò):

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

第111-113行使用Adam優(yōu)化器、學(xué)習(xí)率衰減計劃和二進(jìn)制交叉熵編譯我們的模型。如果您是從這個訓(xùn)練腳本中構(gòu)建的,并且超過2個類,請確保使用分類交叉熵。

口罩訓(xùn)練通過117-122行啟動。請注意,我們的數(shù)據(jù)增強(qiáng)對象(aug)將如何提供一批經(jīng)過修改的圖像數(shù)據(jù)。

訓(xùn)練完成后,我們將在測試集上評估生成的模型:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

這里,第126-130行在測試集上進(jìn)行預(yù)測,獲取最高概率的類標(biāo)簽索引。然后,我們在終端打印一份分類報告以供檢查。

第138行將我們的口罩分類模型序列化到磁盤。

我們的最后一步是繪制精度和損失曲線:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

一旦繪圖就緒,第152行使用--plot文件路徑將圖形保存到磁盤。

用Keras/TensorFlow訓(xùn)練COVID-19口罩探測器

我們現(xiàn)在準(zhǔn)備使用Keras、TensorFlow和深度學(xué)習(xí)來訓(xùn)練我們的口罩檢測器。

確保您已經(jīng)使用本教程的“下載”部分下載了源代碼和口罩?jǐn)?shù)據(jù)集。

從那里,打開一個終端,執(zhí)行以下命令:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

圖10:COVID-19口罩檢測儀的訓(xùn)練精度/圖10:COVID-19口罩檢測器的訓(xùn)練精度/損失曲線顯示了高精度和數(shù)據(jù)過度擬合的小跡象。我們現(xiàn)在已經(jīng)準(zhǔn)備好應(yīng)用我們的計算機(jī)視覺知識和使用Python、OpenCV和TensorFlow/Keras進(jìn)行深度學(xué)習(xí)來執(zhí)行口罩檢測。

如你所見,我們在測試集上獲得了約99%的準(zhǔn)確度。

查看圖10,我們可以看到幾乎沒有過度擬合的跡象,驗(yàn)證損失低于訓(xùn)練損失(我在這篇博客文章中討論了這一現(xiàn)象 https://www.pyimagesearch.com/2019/10/14/why-is-my-validation-loss-lower-than-my-training-loss/)。

鑒于這些結(jié)果,我們希望我們的模型能很好地推廣到訓(xùn)練和測試集之外的圖像。

用OpenCV實(shí)現(xiàn)COVID-19人臉檢測儀

現(xiàn)在我們的口罩檢測儀已經(jīng)過訓(xùn)練,讓我們學(xué)習(xí)如何:

從磁盤加載輸入圖像

檢測圖像中的人臉

使用我們的口罩檢測器將面部圖像分為帶口罩和不帶口罩

打開目錄結(jié)構(gòu)中的detect_mask_image.py文件,我們開始:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

我們的驅(qū)動程序腳本需要導(dǎo)入三個TensorFlow/Keras庫來(1)加載MaskNet模型和(2)預(yù)處理輸入圖像。

顯示和圖像處理需要OpenCV。

下一步是分析命令行參數(shù):

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

我們的四個命令行參數(shù)包括:

--image:包含輸入的用于推斷的面部圖像路徑

--face:人臉檢測器模型目錄的路徑(我們需要在對人臉進(jìn)行分類之前對其進(jìn)行本地化)

--model:我們在本教程前面訓(xùn)練的口罩檢測器模型的路徑

--confidence:可選的概率閾值可以設(shè)置為覆蓋50%以過濾弱人臉檢測

接下來,我們將同時加載人臉檢測器和口罩分類器模型:

現(xiàn)在,我們的深度學(xué)習(xí)模型已經(jīng)生成,下一步是加載并預(yù)處理輸入圖像:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

在從磁盤加載--image(第37行)時,我們復(fù)制并獲取幀尺寸,以便將來縮放和顯示(第38行和第39行)。

預(yù)處理由OpenCV的blobFromImage函數(shù)(第42行和第43行)進(jìn)行。如參數(shù)所示,我們將大小調(diào)整為300×300像素,并執(zhí)行均值相減。

然后,第47行和第48行執(zhí)行面部檢測以定位圖像中所有面部的位置。

一旦我們知道每個人臉的預(yù)測位置,我們將確保它們在提取FaceRoi之前滿足--confidence 閾值:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

在這里,我們循環(huán)detections 并提取confidence,以根據(jù)--confidence閾值(第51-58行)進(jìn)行度量。

然后,我們計算特定面的邊界框值,并確保該框落在圖像的邊界內(nèi)(第61-67行)。

接下來,我們將通過MaskNet模型運(yùn)行face ROI:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

在這個區(qū)塊,我們:

通過NumPy切片提取面部ROI(第71行)

像我們在訓(xùn)練期間那樣預(yù)先處理ROI(第72-76行)

執(zhí)行口罩檢測以預(yù)測是否有口罩(第80行)

從這里開始,我們將注解并顯示結(jié)果!

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

首先,我們根據(jù)口罩檢測器模型返回的概率(第84行)確定類標(biāo)簽,并為注釋指定相關(guān)顏色(第85行)。有口罩的顏色是綠色,沒有口罩的顏色是紅色。

然后,我們使用OpenCV繪圖函數(shù)(第92-94行)繪制標(biāo)簽文本(包括類和概率)以及面部圖像的邊框。

處理完所有檢測后,第97行和第98行顯示輸出圖像。

OpenCV圖像中COVID-19口罩的檢測

讓我們把COVID-19口罩探測器啟動!確保您已經(jīng)使用本教程的“下載”部分下載了源代碼、示例圖像和經(jīng)過預(yù)訓(xùn)練的口罩檢測器。

從那里,打開一個終端,執(zhí)行以下命令:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

a

圖11:這名男子在公共場合是否戴著COVID-19/冠狀病毒口罩?是的,他戴了,我們的計算機(jī)視覺和使用Python、OpenCV和TensorFlow/Keras的深度學(xué)習(xí)方法使得自動檢測口罩的存在成為可能。(圖片來源)

如您所見,我們的口罩檢測器正確地將此圖像標(biāo)記為口罩。

讓我們嘗試另一個圖像,這個人沒有戴口罩:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

圖12:哦哦。這張照片里我沒有戴COVID-19面罩。使用Python、OpenCV和TensorFlow/Keras,我們的系統(tǒng)已經(jīng)正確地檢測到我的臉“沒有口罩”。

我們的口罩檢測器已經(jīng)準(zhǔn)確地預(yù)測到?jīng)]有口罩。

讓我們嘗試最后一個圖像:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

圖13:結(jié)果是什么?為什么前景中的女士沒有被發(fā)現(xiàn)戴著COVID-19面罩?我們用計算機(jī)視覺和使用Python、OpenCV和TensorFlow/Keras的深度學(xué)習(xí)構(gòu)建的COVID-19面罩探測器失敗了嗎?(圖片來源)

這里發(fā)生了什么事?

為什么我們能夠檢測到背景中兩位男士的臉,并正確地為他們分類為沒有口罩,但我們無法檢測到前景中的女人?

我在本教程后面的“進(jìn)一步改進(jìn)的建議”部分討論了這個問題的原因,但要點(diǎn)是我們太依賴于兩個階段的過程。

請記住,為了分類一個人是否戴著口罩,我們首先需要執(zhí)行面部檢測-如果找不到面部(這是在這幅圖像中發(fā)生的事情),那么就不能應(yīng)用口罩檢測器!

我們無法檢測前景中的人臉的原因是:

它被口罩遮住了

用于訓(xùn)練面部檢測器的數(shù)據(jù)集不包含戴口罩的人的示例圖像

因此,如果大部分人臉被遮擋,我們的人臉檢測器很可能無法檢測出人臉。

再次,我將在本教程的“進(jìn)一步改進(jìn)的建議”部分中更詳細(xì)地討論這個問題,包括如何提高口罩檢測器的精度。

利用OpenCV在實(shí)時視頻流中實(shí)現(xiàn)COVID-19人臉檢測

現(xiàn)在,我們知道我們可以將口罩檢測應(yīng)用于靜態(tài)圖像-但是實(shí)時視頻流呢?

我們的COVID-19口罩探測器能夠?qū)崟r運(yùn)行嗎?

讓我們看看。

打開目錄結(jié)構(gòu)中的detect_mask_video.py文件,并插入以下代碼:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

這個腳本的算法是相同的,但是代碼結(jié)構(gòu)不同,它處理的是網(wǎng)絡(luò)攝像頭視頻流的每一幀。

因此,在導(dǎo)入時唯一的區(qū)別是我們需要一個VideoStream和time。這都有助于我們處理視頻流。我們還將利用imutils的aspect-aware調(diào)整方法。

此腳本的人臉檢測/口罩預(yù)測邏輯位于detect_and_predict_mask方法中:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

通過在這里定義這個快捷函數(shù),我們的幀處理循環(huán)將更容易閱讀。

此函數(shù)檢測人臉,然后將我們的口罩分類器應(yīng)用于每個人臉ROI。這樣的函數(shù)整合了我們的代碼——如果您愿意的話,它甚至可以移動到單獨(dú)的Python文件中。

我們的detect_and_predict_mask函數(shù)接受三個參數(shù):

frame:來自我們的視頻流的幀

faceNet:用于檢測圖像中人臉位置的模型

maskNet:COVID-19人臉識別模型

在內(nèi)部,我們構(gòu)造一個blob、檢測人臉和初始化列表,其中兩個列表被設(shè)置為由函數(shù)返回。這些列表包括我們的面部(即roi)、locs(面部位置)和preds(口罩/無口罩預(yù)測列表)。

從這里開始,我們將對面部detections進(jìn)行循環(huán):

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

在循環(huán)中,我們過濾掉弱檢測(第34-38行)并提取邊界框,同時確保邊界框坐標(biāo)不超出圖像的邊界(第41-47行)。

接下來,我們將在兩個對應(yīng)的列表中添加面部roi:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

在提取面部roi并進(jìn)行預(yù)處理(第51-56行)之后,我們將面部roi和邊界框附加到它們各自的列表中。

我們現(xiàn)在可以通過我們的口罩檢測器來檢測我們的面部圖像了:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

這里的邏輯是為效率而建立的。首先,我們確保至少檢測到一個人臉(第64行)-如果沒有,我們將返回空的pred。

其次,我們對框架中的面部圖像進(jìn)行批量推斷,以便處理效率更快(第68行)。由于開銷的原因,編寫另一個循環(huán)來分別對每個面部進(jìn)行預(yù)測是沒有意義的(特別是如果您使用的GPU在系統(tǒng)總線上需要有大量通信開銷)。批量執(zhí)行預(yù)測更有效。

第72行將我們的面部邊界框位置和相應(yīng)的有口罩/無口罩預(yù)測返回給調(diào)用者。

接下來,我們將定義命令行參數(shù):

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

我們的命令行參數(shù)包括:

--face:人臉檢測器目錄的路徑

--model:經(jīng)過訓(xùn)練的口罩分類器的路徑

--confidence:過濾弱人臉檢測的最小概率閾值

導(dǎo)入、快捷功能和命令行參數(shù)準(zhǔn)備就緒后,在循環(huán)處理幀之前,我們只需處理一些初始化:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

在這里,我們初始化了:

面部探測器

COVID-19口罩檢測儀

網(wǎng)絡(luò)攝像頭視頻流

讓我們繼續(xù)循環(huán)流中的幀:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

我們開始在第103行的幀上循環(huán)。在內(nèi)部,我們從流中獲取一個幀并調(diào)整其大小(第106行和第107行)。

從這里開始,我們使用快捷程序;第111行檢測并預(yù)測人們是否戴著口罩。

讓我們對COVID-19口罩檢測結(jié)果進(jìn)行后置處理(比如注釋):

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

在預(yù)測結(jié)果的循環(huán)中(從第115行開始),我們:

打開面部邊界框并進(jìn)行口罩/無口罩預(yù)測(第117行和第118行)

確定label 和color (第122-126行)

標(biāo)注label 和面部邊界框(第130-132行)

最后,我們顯示結(jié)果并執(zhí)行清理:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

顯示幀后,我們捕獲按鍵。如果用戶按q(quit),我們將跳出循環(huán)并結(jié)束程序。

用Python、OpenCV和TensorFlow/Keras實(shí)現(xiàn)你的實(shí)時口罩檢測非常好!

OpenCV實(shí)時檢測COVID-19口罩

要查看我們的實(shí)時COVID-19口罩檢測器,請確保使用本教程的“下載”部分下載源代碼和預(yù)先訓(xùn)練的口罩檢測器模型。

然后,可以使用以下命令在實(shí)時視頻流中啟動口罩檢測器:

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

在這里,您可以看到我們的口罩檢測器能夠?qū)崟r運(yùn)行(并且在其預(yù)測中也是正確的)。

改進(jìn)建議

從上面的結(jié)果部分可以看出,我們的口罩檢測器工作得很好,盡管:

訓(xùn)練數(shù)據(jù)有限

with_mask類是人工生成的(請參閱“如何創(chuàng)建我們的口罩?jǐn)?shù)據(jù)集”章節(jié))。

為了進(jìn)一步改進(jìn)我們的口罩檢測模型,您應(yīng)該收集戴口罩的人的實(shí)際圖像(而不是人工生成的圖像)。

雖然我們的人工數(shù)據(jù)集在這種情況下工作得很好,但沒有什么可以替代真實(shí)的數(shù)據(jù)集。

其次,你還應(yīng)該收集可能會“混淆”我們的分類器的圖像,這些圖像使其認(rèn)為此人戴著口罩,而事實(shí)上他們并不是——潛在的例子包括裹在面部的襯衫、嘴上的繃帶等。

所有這些都是一些可能被我們的口罩檢測器混淆為口罩的例子。

最后,您應(yīng)該考慮訓(xùn)練一個專用的二元分類對象檢測器,而不是一個簡單的圖像分類器。

目前我們檢測一個人是否戴口罩的方法分為兩步:

步驟1:進(jìn)行面部檢測

步驟2:使用面部檢測器監(jiān)測每個面部

這種方法的問題在于,根據(jù)定義,口罩會遮住面部的一部分。如果有足夠的人臉被遮擋,則無法檢測到該人臉,因此,口罩檢測器沒有生效。

為了避免這個問題,您應(yīng)該訓(xùn)練一個兩類對象檢測器,該檢測器由帶口罩類和不帶口罩類組成。

將對象檢測器與專用的with_mask類結(jié)合將會在兩個方面改進(jìn)模型。

首先,目標(biāo)探測器將能夠自然而然地探測到戴著口罩的人,否則由于太多的面部被遮擋,面部探測器將無法探測到這些人。

其次,這種方法將我們的計算機(jī)視覺管道簡化為一個步驟-而不是應(yīng)用人臉檢測和我們的口罩檢測器模型,我們需要做的只是使用對象檢測器在網(wǎng)絡(luò)的單向步驟中為有口罩和沒有口罩的人提供區(qū)域邊界 。

這樣的方法不僅計算效率更高,而且更“優(yōu)雅”,更符合端到端的風(fēng)格。

接下來是什么?

使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器

圖14:如果您想學(xué)習(xí)在自己的數(shù)據(jù)集上訓(xùn)練自己的深度學(xué)習(xí)模型,請獲取《Deep Learning for Computer Vision with Python》的副本,然后開始學(xué)習(xí)。我和我的團(tuán)隊將在這條路上的每一步,確保您能夠執(zhí)行示例代碼并得到您的問題的答案。

總結(jié)

在本教程中,您學(xué)習(xí)了如何使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)創(chuàng)建COVID-19口罩檢測器。

為了創(chuàng)建我們的口罩檢測器,我們訓(xùn)練了一個人戴口罩和不戴口罩的兩類模型。

我們在戴口罩/不戴口罩?jǐn)?shù)據(jù)集上對MobileNetV2進(jìn)行了微調(diào),得到了一個大約99%準(zhǔn)確率的分類器。

然后,我們使用這個口罩分類器,并通過以下方式將其應(yīng)用于圖像和實(shí)時視頻流:

圖像/視頻中的人臉檢測

提取每個單獨(dú)的面部圖像

應(yīng)用我們的口罩分類器

我們的口罩檢測器是精確的,而且由于我們使用了MobileNetV2架構(gòu),它的計算效率也很高,使得將模型部署到嵌入式系統(tǒng)(樹莓派、Google Coral、Jetosn、Nano等)更加容易。

希望你喜歡這個教程!

英文原文:https://www.pyimagesearch.com/2020/05/04/covid-19-face-mask-detector-with-opencv-keras-tensorflow-and-deep-learning/
譯者:阿布銩
使用OpenCV、Keras/TensorFlow和深度學(xué)習(xí)實(shí)現(xiàn)口罩探測器
推薦內(nèi)容