在 Python 中使用 TensorFlow 進行面罩檢測

在本文中,我們將討論我們的兩階段 COVID-19 口罩檢測器,詳細介紹我們將如何實施我們的計算機視覺/深度學習管道。

我們將使用此 Python 腳本來訓練口罩檢測器并查看結果。鑒于經過訓練的 COVID-19 口罩檢測器,我們將繼續(xù)實施另外兩個額外的 Python 腳本,用于:

  • 檢測圖像中的 COVID-19 口罩
  • 檢測實時視頻流中的面罩

1 面罩檢測系統(tǒng)流程圖

在 Python 中使用 TensorFlow 進行面罩檢測的圖1?

在 Python 中使用 TensorFlow 進行面罩檢測的圖2編輯

 

為了訓練自定義口罩檢測器,我們需要將項目分為兩個不同的階段,每個階段都有自己各自的子步驟(如上面的圖 1 所示):

  • 訓練: 在這里,我們將重點介紹如何從磁盤加載口罩檢測數(shù)據(jù)集,在此數(shù)據(jù)集上訓練模型(使用 Keras/TensorFlow),然后將口罩檢測器序列化到磁盤
  • 部署: 一旦口罩檢測器經過訓練,我們就可以繼續(xù)加載口罩檢測器,執(zhí)行人臉檢測,然后將每張臉分類為 with_mask 或 without_mask。

在 Python 中使用 TensorFlow 進行面罩檢測的圖3?

在 Python 中使用 TensorFlow 進行面罩檢測的圖4編輯

 

我們將使用這些圖像通過 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 來提高準確性。

在 Python 中使用 TensorFlow 進行面罩檢測的圖5?

在 Python 中使用 TensorFlow 進行面罩檢測的圖6編輯

 

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 語言

以下內容為付費內容,請購買后觀看

App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

1