在 Python 中使用 TensorFlow 進行面罩檢測
在本文中,我們將討論我們的兩階段 COVID-19 口罩檢測器,詳細介紹我們將如何實施我們的計算機視覺/深度學習管道。
我們將使用此 Python 腳本來訓練口罩檢測器并查看結果。鑒于經過訓練的 COVID-19 口罩檢測器,我們將繼續(xù)實施另外兩個額外的 Python 腳本,用于:
- 檢測圖像中的 COVID-19 口罩
- 檢測實時視頻流中的面罩
1 面罩檢測系統(tǒng)流程圖
?
編輯
為了訓練自定義口罩檢測器,我們需要將項目分為兩個不同的階段,每個階段都有自己各自的子步驟(如上面的圖 1 所示):
- 訓練: 在這里,我們將重點介紹如何從磁盤加載口罩檢測數(shù)據(jù)集,在此數(shù)據(jù)集上訓練模型(使用 Keras/TensorFlow),然后將口罩檢測器序列化到磁盤
- 部署: 一旦口罩檢測器經過訓練,我們就可以繼續(xù)加載口罩檢測器,執(zhí)行人臉檢測,然后將每張臉分類為 with_mask 或 without_mask。
?
編輯
我們將使用這些圖像通過 TensorFlow 構建 CNN 模型,以通過使用 PC 的網絡攝像頭來檢測您是否戴著口罩。此外,您還可以使用手機的攝像頭來執(zhí)行相同的作!
2 逐步實施
3 第 1 步:數(shù)據(jù)可視化
第一步,讓我們可視化數(shù)據(jù)集中兩個類別的圖像總數(shù)。我們可以看到 'yes' 類中有 690 張圖像,'no' 類中有 686 張圖像。
蒙版標記為“yes”的圖像數(shù)量:690
蒙版標記為“no”的圖像數(shù)量:686
4 第 2 步:數(shù)據(jù)增強
在下一步中,我們擴充數(shù)據(jù)集以包含更多數(shù)量的圖像用于我們的訓練。在數(shù)據(jù)增強的這一步中,我們旋轉和翻轉數(shù)據(jù)集中的每張圖像。我們看到,在數(shù)據(jù)增強之后,我們總共有 2751 張圖像,其中 1380 張圖像屬于 'yes' 類,'1371' 張圖像屬于 'no' 類。
示例數(shù):2751
正面示例的百分比:50.163576881134134%,位置示例數(shù):1380
負示例百分比:49.836423118865866%,負示例數(shù):1371
5 步驟 3:拆分數(shù)據(jù)
在此步驟中,我們將數(shù)據(jù)拆分為訓練集,該訓練集將包含將訓練 CNN 模型的圖像,以及包含將要測試模型的圖像的測試集。在這種情況下,我們取 split_size =0.8,這意味著總圖像的 80% 將進入訓練集,其余 20% 的圖像將進入測試集。
訓練集中標記為“yes”的帶有面罩的圖像數(shù)量:1104
測試集中標記為“yes”的帶有面罩的圖像數(shù)量:276
標記為“no”的訓練集中沒有面罩的圖像數(shù)量:1096
標記為“no”的測試集中沒有面罩的圖像數(shù)量:275
拆分后,我們看到如上所述,所需百分比的圖像已分布到訓練集和測試集。
6 第 4 步:構建模型
下一步,我們將構建具有各種層(如 Conv2D、MaxPooling2D、Flatten、Dropout 和 Dense)的序列 CNN 模型。在最后一個 Dense 層中,我們使用 'softmax' 函數(shù)輸出一個向量,該向量給出了兩個類別中每個類別的概率。
- Python3 語言
model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(100, (3, 3), activation='relu', input_shape=(150, 150, 3)), tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(100, (3, 3), activation='relu'), tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Flatten(), tf.keras.layers.Dropout(0.5), tf.keras.layers.Dense(50, activation='relu'), tf.keras.layers.Dense(2, activation='softmax') ]) model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc']) |
在這里,我們使用 'adam' 優(yōu)化器和 'binary_crossentropy' 作為我們的損失函數(shù),因為只有兩個類。此外,您甚至可以使用 MobileNetV2 來提高準確性。
?
編輯
7 第 5 步:預訓練 CNN 模型
構建模型后,讓我們創(chuàng)建 'train_generator' 和 'validation_generator' 以在下一步中將它們擬合到我們的模型中。我們看到訓練集中總共有 2200 張圖像,測試集中總共有 551 張圖像。
找到屬于 2 個類的 2200 張圖像。
找到屬于 2 個類的 551 張圖像。
8 第 6 步:訓練 CNN 模型
此步驟是將訓練集中的圖像和測試集擬合到我們使用 keras 庫構建的 Sequential 模型的主要步驟。我已經訓練了 30 個 epoch (迭代) 的模型。但是,我們可以訓練更多數(shù)量的 epoch 以獲得更高的準確性測試,測試是否發(fā)生過擬合。
歷史 = model.fit_generator(train_generator,
epochs=30,
validation_data=validation_generator,
callbacks=[checkpoint])
>>epoch 30/30
220/220 [==============================] – 231s 1s/step – 損失:0.0368 – acc:0.9886 – val_loss:0.1072 – val_acc:0.9619
我們看到,在第 30 個 epoch 之后,我們的模型對訓練集的準確率為 98.86%,對測試集的準確率為 96.19%。這意味著它訓練有素,沒有任何過度擬合。
9 步驟 7:標記信息
構建模型后,我們?yōu)榻Y果標記兩個概率。 ['0' 為 'without_mask' 和 '1' 為 'with_mask']。我還使用 RGB 值設置邊界矩形顏色。['RED' 代表 'without_mask' 和 'GREEN' 代表 'with_mask]
labels_dict={0:'without_mask',1:'with_mask'}
color_dict={0:(0,0,255),1:(0,255,0)}
10 第 8 步:導入人臉檢測程序
在此之后,我們打算使用它來檢測我們是否使用 PC 的網絡攝像頭戴著口罩。為此,首先,我們需要實現(xiàn)人臉檢測。在這方面,我們使用基于 Haar 特征的級聯(lián)分類器來檢測面部特征。
face_clsfr=cv2 中。級聯(lián)分類器('haarcascade_frontalface_default.xml')
這個級聯(lián)分類器由 OpenCV 設計,通過訓練數(shù)千張圖像來檢測正面。需要下載相同的 .xml 文件并用于檢測人臉。我們已將文件上傳到 GitHub 存儲庫。
11 第 9 步:檢測帶和不帶蒙版的人臉
在最后一步中,我們使用 OpenCV 庫運行一個無限循環(huán),以使用我們的網絡攝像頭,在該循環(huán)中,我們使用 Cascade Classifier 檢測人臉。代碼 webcam = cv2。VideoCapture(0) 表示 webcam 的用法。
該模型將預測這兩個類 ([without_mask, with_mask]) 中每個類的可能性。根據(jù)較高的概率,標簽將被選擇并顯示在我們的臉周圍。
main.py
- Python3 語言
以下內容為付費內容,請購買后觀看
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP




















