硬體GPU:Nvidia GeForce GTX 1660Ti 8G RAM
作業系統:Windows10
Step0)Windows10開發環境,請參考Window10安裝yolov4
Step1)從Kaggle下載是否戴口罩圖片資料集
https://www.kaggle.com/aditya276/face-mask-dataset-yolo-format(約214MB)
解壓縮後獲得圖片與文字檔,每張圖片對應一個文字檔,文字檔內已經標記人臉的範圍,是否有戴口罩。
Step2)準備yolov4訓練圖片。
將所有解壓縮後的資料集拷貝到dartnet資料夾下,並放置於mask資料夾下,依照以下方式擺放。
筆者在C:\vcpkg編譯darknet程式,編譯好的darknet程式放置於C:\vcpkg\installed\x64-windows\tools\darknet\下
筆者在C:\vcpkg\installed\x64-windows\tools\darknet\下新增資料夾mask,將所下載資料集的圖片放置於
訓練圖片資料集放置於:C:\vcpkg\installed\x64-windows\tools\darknet\mask\images\train\
測試圖片資料集放置於:C:\vcpkg\installed\x64-windows\tools\darknet\mask\images\test\
驗證圖片資料集放置於:C:\vcpkg\installed\x64-windows\tools\darknet\mask\images\valid\
classes.txt放置於:C:\vcpkg\installed\x64-windows\tools\darknet\mask\images\
classes.txt內容為:
no_mask
mask
Step3)製作yolov4設定檔。
在C:\vcpkg\installed\x64-windows\tools\darknet\mask\下,新增資料夾cfg。
(1)C:\vcpkg\installed\x64-windows\tools\darknet\mask\cfg\obj.data,新增obj.data,內容如下
classes = 2
train = mask/cfg/train.txt
valid = mask/cfg/valid.txt
names = mask/cfg/obj.names
backup = mask/weights
說明:classes設定為2,表示要分成兩類,train為所有訓練圖片的路徑與檔案名稱,valid為所有驗證圖片的路徑與檔案名稱,names為兩類別的名稱,backup權重參數的暫存資料夾,需在mask下新增weights資料夾
(2)C:\vcpkg\installed\x64-windows\tools\darknet\mask\cfg\obj.names,新增obj.names,內容如下
no_mask
mask
(3)將test.txt、train.txt與valid.txt移動到資料夾cfg下,開啟以下三個檔案
C:\vcpkg\installed\x64-windows\tools\darknet\mask\cfg\test.txt
C:\vcpkg\installed\x64-windows\tools\darknet\mask\cfg\train.txt
C:\vcpkg\installed\x64-windows\tools\darknet\mask\cfg\valid.txt
使用文字編輯器取代功能,將/content/gdrive/My Drive/darknet/取代為mask/
mask/images/test/TB2R28UvUOWBKNjSZKzXXXfWFXa_!!1116877752.jpg
mask/images/test/US-expands-coronavirus-screenings-United-suspends-some-flights-to-China.jpg
mask/images/test/Pakistan-China-coronavirus-92news.jpg
mask/images/test/RZXE24HFK5GSVKVSN57VCVPQ4M.jpg
...
(4)複製C:\vcpkg\installed\x64-windows\tools\darknet\cfg\yolov4-tiny.cfg到C:\vcpkg\installed\x64-windows\tools\darknet\mask\cfg\yolov4-tiny.cfg
修改以下幾行
第6行:batch=24
第7行:subdivisions=8
第221行:filters=21
第229行:classes=2
第274行:filters=21
第280行:classes=2
說明:batch=24,每批次取24張圖片進行訓練,subdivisions=8,每批次拆成8組,filters=(classes+5)*3,分成戴口罩與未戴口罩,設定classes為2
Step4)輸入圖片進行訓練
從以下網址下載yolov4.weight(https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.weights)
執行以下指令進行訓練,檔案obj.data設定使用口罩圖片進行訓練。
#darknet detector train mask/cfg/obj.data mask/cfg/yolov4-tiny.cfg yolov4.weights
下圖為訓練5分鐘後,損失值還是很大,預估需要57小時左右。訓練了8小時左右損失值降低到0.3左右。
下圖為損失值與訓練次數(iteration),當訓練8小時後,訓練1400000次後,損失值降低到0.3。
Step5)使用圖片進行預估是否戴口罩
準備一張圖片mask/images/test/jian.jpg,使用以下指令進行偵測,使用訓練出來的模型參數mask/weights/yolov4-tiny_1400000.weights,執行結果如下圖。
#darknet detector test mask/cfg/obj.data mask/cfg/yolov4-tiny.cfg mask/weights/yolov4-tiny_1400000.weights mask/images/test/jian.jpg
可以將所有mask/cfg/的設定檔,mask/weights/下的一個權重檔上傳到另一台Nvidia GPU機器(例如JetBot),使用以上指令也可以精確辨識口罩。
Step6)使用攝影機進行預估是否戴口罩
使用以下指令進行偵測,使用訓練出來的模型參數mask/weights/yolov4-tiny_1400000.weights,「-c 0」表示使用電腦的編號0的攝影機,結果如下圖。
#darknet detector demo mask/cfg/obj.data mask/cfg/yolov4-tiny.cfg mask/weights/yolov4-tiny_1400000.weights -c 0
Step7)使用yolov4.cfg進行訓練,修改yolov4.cfg,因為yolov4.cfg有三個偵測器需要修改三個filter與classes
第2行:batch=64
第3行:subdivisions=64
第961行:filters=21
第968行:classes=2
第1049行:filters=21
第1056行:classes=2
第1137行:filters=21
第1144行:classes=2
如果出現錯誤「Error: cuDNN isn't found FWD algo for convolution」,可能是GPU記憶體不足,需調整batch與subdivisions
Step8)使用口罩圖片進行訓練
從以下網址下載darknet53.conv.74(https://pjreddie.com/media/files/darknet53.conv.74)
執行以下指令進行訓練,檔案obj.data設定使用口罩圖片進行訓練,更新權重檔darknet53.conv.74。
#darknet detector train mask/cfg/obj.data mask/cfg/yolov4.cfg darknet53.conv.74