# Face Mask Detection ReadMe [toc] --- ## `train.py` 這個程式是用於訓練口罩偵測器的工具。它使用了一個預先訓練好的 MobileNetV2 模型作為基礎,並在其上構建了一個自定義的分類頭部模型。程式將根據提供的資料集進行模型訓練,並將訓練好的模型和訓練過程中的損失和準確度繪製成圖表。 ### 安裝相依套件 在執行程式之前,請確保已安裝以下相依套件: - torch - torchvision - scikit-learn - matplotlib - numpy - argparse :::info 你可以使用以下指令安裝這些套件: `pip install torch torchvision scikit-learn matplotlib numpy argparse` ::: ### 使用方式 使用命令列介面來執行程式。下面是執行程式的指令格式: `python train.py --dataset <dataset_path> [--plot <plot_path>] [--model <model_path>]` 參數說明: - `--dataset <dataset_path>`: 訓練資料集的路徑,資料集應按照以下結構組織: ``` dataset/ ├── with_mask/ │ ├── image1.jpg │ ├── image2.jpg │ └── ... └── without_mask/ ├── image1.jpg ├── image2.jpg └── ... ``` - `--plot <plot_path>` (可選): 訓練過程中損失和準確度圖表的儲存路徑,預設為 "plot.png"。 - `--model <model_path>` (可選): 訓練好的口罩偵測器模型的儲存路徑,預設為 "mask_detector.pth"。 ### 範例執行 以下是一個範例的執行指令: `python train.py --dataset dataset --plot loss_acc_plot.png --model mask_detector.pth` 這個指令將會使用 "dataset" 資料集來訓練口罩偵測器模型,並將訓練過程中的損失和準確度繪製成圖表,最後將訓練好的模型儲存至 "mask_detector.pth"。 ## 程式碼解說 這個程式主要由幾個部分組成:資料集的準備、模型的建立、訓練過程和結果評估。 ### 資料集的準備 在 MaskDataset 類別中,我們定義了一個自定義的資料集,用於讀取訓練資料集。我們使用 ImageFolder 類別從資料夾中讀取圖片並對其進行轉換。圖片將被轉換成 PIL 影像,並應用訓練或測試所需的轉換。 ### 模型的建立 我們使用了 MobileNetV2 模型作為基礎模型,並在其上構建了一個自定義的分類頭部模型。基礎模型的參數被凍結,**只有分類頭部模型的參數**進行訓練。 ### 訓練過程 我們使用訓練集和測試集來進行模型的訓練和評估。在每個訓練循環中,我們計算訓練集的損失和準確度,並進行反向傳播和參數更新。在每個測試循環中,我們計算測試集的損失和準確度。 ### 結果評估 最後,我們計算測試集上的準確度並顯示出分類報告。同時,我們將訓練過程中的損失和準確度繪製成圖表。最後,我們將訓練好的模型儲存到指定的路徑中。 --- ## `detect_image.py` 這個程式是一個口罩偵測器,能夠檢測圖片中的人臉是否戴著口罩。它使用了一個預先訓練好的模型來識別圖片中的人臉和口罩。程式會將辨識結果加上標籤並儲存至輸出資料夾。 ### 安裝相依套件 在執行程式之前,請確保已安裝以下相依套件: - torch - torchvision - opencv-python - numpy - argparse :::info 你可以使用以下指令安裝這些套件: `pip install torch torchvision opencv-python numpy argparse` ::: ## 程式使用方式 使用命令列介面來執行程式。下面是執行程式的指令格式: `python detect_image.py -d <input_directory> -o <output_directory> [-f <face_detector_model>] [-m <mask_detector_model>] [-c <confidence_threshold>]` ### 參數說明 - ``-d <input_directory>``: 輸入資料夾的路徑,資料夾中應包含要進行口罩偵測的圖片檔案。 - ``-o <output_directory>``: 輸出資料夾的路徑,程式會將處理後的圖片儲存至這個資料夾中。 - `-f <face_detector_model>` (可選): 人臉偵測器模型的路徑,預設為 "face_detector"。 - `-m <mask_detector_model>` (可選): 口罩偵測器模型的路徑,預設為 "mask_detector.pth"。 - `-c <confidence_threshold>` (可選): 篩選弱偵測的最小概率值,預設為 0.5。 ### 範例執行 以下是一個範例的執行指令: `python detect_image.py -d images -o output_images -f face_detector -m mask_detector.pth -c 0.6` 這個指令將會使用 ``"face_detector"`` 作為人臉偵測器模型,``"mask_detector.pth"`` 作為口罩偵測器模型,並且只保留信心指數大於 0.6 的偵測結果。 ## 程式碼解說 這個程式主要由兩個部分組成:模型建立和圖片處理。 ### 模型建立 在 maskDetectorModel 類別中,我們使用了 MobileNetV2 作為基礎模型,並在其上構建了一個**分類頭部模型**。這兩個模型被組合成一個整體模型,用於口罩偵測。 ## 圖片處理 在 mask_image 函式中,我們使用 OpenCV 讀取輸入圖片並進行相應的前處理。然後,我們使用人臉偵測模型找出圖片中的人臉位置,並將其裁剪出來。接著,我們將裁剪後的人臉圖片進行後續的預測,判斷是否戴著口罩。最後,我們在原圖上繪製矩形框和標籤,顯示出偵測結果。處理完所有圖片後,程式將儲存處理後的圖片至輸出資料夾。