亚洲全黄无码一级在线看_国产剧情久久久性色_无码av一区二区三区无码_亚洲成a×人片在线观看

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

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

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

源代碼地址:

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í)來(lái)訓(xùn)練COVID-19口罩探測(cè)器。

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

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

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

1、收到許多來(lái)自PyImageSearch讀者的請(qǐng)求,要求我寫這樣一篇博客

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

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

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

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

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

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

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

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

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

1、在圖像中檢測(cè)COVID-19口罩

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

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

兩階段COVID-19面罩檢測(cè)器

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

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

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

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

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

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

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

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

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

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

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

1、帶口罩:690張圖片

2、無(wú)口罩:686張圖片

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

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

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

Prajna和我一樣,一直對(duì)世界的現(xiàn)狀感到失落和沮喪——每天都有成千上萬(wàn)的人死去,對(duì)我們?cè)S多人來(lái)說(shuō),我們能做的(如果有的話)很少。

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

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

2、最差的場(chǎng)景-這給了她一個(gè)非常需要的精神寄托

不管怎樣,都是雙贏的!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

參考Prajna若的GitHub庫(kù)

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

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

我的太陽(yáng)鏡帖子中的原理同樣適用于構(gòu)建一個(gè)人工口罩?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)口罩探測(cè)器

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

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

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

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

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

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

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

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

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

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

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

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

我們開(kāi)始吧!

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

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

導(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)對(duì)類標(biāo)簽進(jìn)行二進(jìn)制化、對(duì)數(shù)據(jù)集進(jìn)行分段并打印分類報(bào)告。

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

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

1、如何在Ubuntu上安裝TensorFlow 2.0

2、如何在macOS上安裝TensorFlow 2.0

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

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

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

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

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

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

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

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

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

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

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

在這個(gè)部分,我們做的是:

獲取數(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](通過(guò)preprocess_input快捷功能)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

微調(diào)是一種策略,我?guī)缀蹩偸墙ㄗh在節(jié)省大量時(shí)間的同時(shí)建立一個(gè)基線模型。要了解有關(guān)理論、目的和策略的更多信息,請(qǐng)參閱我的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)練檢測(cè)網(wǎng)絡(luò):

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

如你所見(jiàn),我們?cè)跍y(cè)試集上獲得了約99%的準(zhǔn)確度。

查看圖10,我們可以看到幾乎沒(méi)有過(guò)度擬合的跡象,驗(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)練和測(cè)試集之外的圖像。

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

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

從磁盤加載輸入圖像

檢測(cè)圖像中的人臉

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

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

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

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

顯示和圖像處理需要OpenCV。

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

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

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

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

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

--model:我們?cè)诒窘坛糖懊嬗?xùn)練的口罩檢測(cè)器模型的路徑

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

接下來(lái),我們將同時(shí)加載人臉檢測(cè)器和口罩分類器模型:

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

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

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

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

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

一旦我們知道每個(gè)人臉的預(yù)測(cè)位置,我們將確保它們?cè)谔崛aceRoi之前滿足--confidence 閾值:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

OpenCV圖像中COVID-19口罩的檢測(cè)

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

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

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

a

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

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

讓我們嘗試另一個(gè)圖像,這個(gè)人沒(méi)有戴口罩:

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

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

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

讓我們嘗試最后一個(gè)圖像:

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

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

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

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

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

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

我們無(wú)法檢測(cè)前景中的人臉的原因是:

它被口罩遮住了

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

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

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

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

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

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

讓我們看看。

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

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

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

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

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

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

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

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

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

frame:來(lái)自我們的視頻流的幀

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

maskNet:COVID-19人臉識(shí)別模型

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

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

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

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

接下來(lái),我們將在兩個(gè)對(duì)應(yīng)的列表中添加面部roi:

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

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

我們現(xiàn)在可以通過(guò)我們的口罩檢測(cè)器來(lái)檢測(cè)我們的面部圖像了:

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

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

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

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

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

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

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

--face:人臉檢測(cè)器目錄的路徑

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

--confidence:過(guò)濾弱人臉檢測(cè)的最小概率閾值

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

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

在這里,我們初始化了:

面部探測(cè)器

COVID-19口罩檢測(cè)儀

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

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

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

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

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

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

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

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

打開(kāi)面部邊界框并進(jìn)行口罩/無(wú)口罩預(yù)測(cè)(第117行和第118行)

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

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

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

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

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

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

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

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

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

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

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

改進(jìn)建議

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

接下來(lái)是什么?

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

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

總結(jié)

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

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

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

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

圖像/視頻中的人臉檢測(cè)

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

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

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

希望你喜歡這個(gè)教程!

英文原文: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)口罩探測(cè)器
推薦內(nèi)容