基於jupyter notebook的python編程-----Win10通過OpenCv-3.4.1進行人臉口罩數據集的模型訓練並進行戴口罩識別檢測


新冠疫情的影響下,人民羣衆被迫戴上口罩,相信各位小夥伴們也不例外,但在戴口罩的情況下,我們會遇到各種不方便的問題,例如在進出校園或者是小區的時候,需要將口罩摘下來,然後進行人臉識別,特別麻煩,本次博客,林君學長主要帶大家瞭解如何對口罩數據集進行模型訓練,然後進行戴口罩識別

  • 操作系統:Win10
  • 編程環境:Jupyter Notebook
  • 模型訓練環境:Opencv-3.4.1
  • Python版本:python3.6

一、OpenCv的下載及安裝

在進行OpenCv的安裝同時,大家會有幾個選擇,一個是新版本 的OpenCv-4.xx,另一種選擇便是OpenCv-3.xx,在林君學長經過各種測試之後,發現對於模型訓練的需要,選擇OpenCv-3.4.1版本的進行win下的安裝,因爲該版本會具有數據集模型訓練的exe文件,因此,建議大家選擇OpenCv-3.4.1進行下載安裝!

1、OpenCv的下載

1)、OpenCv-3.4.1官網下載鏈接
https://opencv.org/opencv-3-4-1/
在這裏插入圖片描述
2)、選擇Win pack進行win10安裝包下載
在這裏插入圖片描述
3)、在彈出的頁面等待5秒,進行路徑選擇下載
在這裏插入圖片描述

2、OpenCv的安裝

1)、點擊下載好的OpenCv-3.4.1.exe進行自定義安裝
在這裏插入圖片描述
2)、雙擊,自定義路徑暗轉
在這裏插入圖片描述
3)、安裝成功
在這裏插入圖片描述

3、查看是否具有模型訓練環境

1)、找到opencv的安裝路徑,然後查到路徑 \opencv\build\x64\vc14\bin下是否具有下圖標記的的兩個exe文件
在這裏插入圖片描述
2)、如果具有上面兩個工具,我們便可以進行下一步,當然,如果安裝林君學長推薦的OpenCv-3.4.1,一定會有以上兩個模型訓練exe文件的,接下來,我們便進入下一步,口罩數據集的下載吧!

二、人臉口罩數據集的下載及處理

人臉口罩數據集主要是爲了進行模型訓練,OpenCv通過神經網絡進行模型訓練,通過網絡查找而言,口罩數據集的正負比例爲1:3,及解釋爲,500張戴口罩的數據集,需要1500張不戴口罩的數據集進行模型訓練,在這裏,林君學長已經準備好了我們需要的大致爲1:3正負樣本比例的數據集,小夥伴可以通過如下鏈接進行下載。

1、人臉口罩數據集下載

1)、通過如下鏈接進行人臉口罩數據集的下載,包括600張正樣本(戴口罩)和1800多張負樣本(不帶口罩)
https://download.csdn.net/download/qq_42451251/12566250
2)、CSDN下載後的樣本如下所示,我們解壓後將裏面的mask文件夾放在F盤或者其他方便操作的盤下面;
在這裏插入圖片描述
提取到F盤之後如下所示:
在這裏插入圖片描述
在這裏插入圖片描述

2、數據集重命名爲連續序列

通過樣本,我們可以發現,數據集裏面的圖片是不連續的,,因此,我們需要將正負樣本數據集重命名,命名爲連續增加的圖片格式,爲了後面的圖片像素調整
1)、通過如下python代碼對正負樣本進行重命名

#對數據集重命名
#coding:utf-8
import os
path = "F:\\mask\\have_mask" #你的路徑
filelist = os.listdir(path)
count=1000 #開始文件名1000.jpg
for file in filelist:   
    Olddir=os.path.join(path,file)  
    if os.path.isdir(Olddir):  
        continue
    filename=os.path.splitext(file)[0]   
    filetype=os.path.splitext(file)[1]
 
    Newdir=os.path.join(path,str(count)+filetype)  
    os.rename(Olddir,Newdir)
    count+=1

正樣本重命名結果如下所示:
在這裏插入圖片描述
2)、同樣的,在上面修改路徑,爲負樣本同樣重命名

#對負樣本數據集重命名
#coding:utf-8
import os
path = "F:\\mask\\no_mask" #你的路徑
filelist = os.listdir(path)
count=10000 #開始文件名10000.jpg
for file in filelist:   
    Olddir=os.path.join(path,file)  
    if os.path.isdir(Olddir):  
        continue
    filename=os.path.splitext(file)[0]   
    filetype=os.path.splitext(file)[1]
 
    Newdir=os.path.join(path,str(count)+filetype)  
    os.rename(Olddir,Newdir)
    count+=1

負樣本重命名結果如下所示:
在這裏插入圖片描述
值得注意的是,當我們設置的開始命名需要大於數據集中最後一張圖片的數據,不然會報錯,例如,數據集中最後一張爲1000.jpg,那我們設置的count應該大於1000

當數據集重命名成功之後,我們便可以對圖片的的像素進行處理了!看下面步驟吧!

3、正負樣本數據集像素處理

官方推薦,正樣本數據集的像素最好設置爲20x20的像素,讓訓練的模型精度更高;而負樣本數據集應該不低於50x50的樣本,這樣設置的原因是方便OpenCv加快模型訓練,因此我們需要對剛剛的數據集進行 像素修改,具體操作如下;
1)、通過如下python代碼,修改正樣本數據集的像素爲20x20

#修改正樣本像素
import pandas as pd
import cv2
for n in range(1000,1606):#代表正數據集中開始和結束照片的數字
    path='F:\\mask\\have_mask\\'+str(n)+'.jpg'
    # 讀取圖片
    img = cv2.imread(path)
    img=cv2.resize(img,(20,20)) #修改樣本像素爲20x20
    cv2.imwrite('F:\\mask\\have_mask\\' + str(n) + '.jpg', img)
    n += 1

正樣本數據集修改後如下所示:
在這裏插入圖片描述
2)、同樣的,修改負樣本的像素爲60x60,知道大於50x50便好

#修改負樣本像素
import pandas as pd
import cv2
for n in range(10000,11790):#代表負樣本數據集中開始和結束照片的數字
    path='F:\\mask\\no_mask\\'+str(n)+'.jpg'
    # 讀取圖片
    img = cv2.imread(path)
    img=cv2.resize(img,(60,60)) #修改樣本像素爲60x60
    cv2.imwrite('F:\\mask\\no_mask\\' + str(n) + '.jpg', img)
    n += 1

負樣本數據集修改後像素如下所示:
在這裏插入圖片描述

4、創建正負樣本數據集路徑txt文檔

創建正負樣本路徑的txt文檔是爲了後面模型訓練而使用,接下來我們便通cmd終端命令行進行路徑文檔創建吧!
1)、正樣本數據集路徑文檔創建
(1)、打開打開cmd,進入到存放正樣本的have_mask文件夾

F:
cd mask\have_mask

在這裏插入圖片描述
(2)、cmd終端輸入如下命令創建路徑文檔

dir /b/s/p/w *.jpg > have_mask.txt

在這裏插入圖片描述
這時候,在正樣本數據集的末尾,你就會發現已經創建一個have_mask.txt的路徑正樣本文件,文件內容如下所示:
在這裏插入圖片描述
2)、負樣本數據集路徑文檔創建
對於負樣本路徑文檔的創建,和上面方式一下如下:
(1)、進入負樣本文件夾

cd /mask/no_mask/

(2)、輸入如下命令,創建負樣本路徑txt文檔

dir /b/s/p/w *.jpg > no_mask.txt

在這裏插入圖片描述
負樣本路徑文檔內容如下所示:
在這裏插入圖片描述

5、將正負樣本txt文檔複製到數據集同級目錄

將上面我們創建的路徑文檔分別複製到數據集的同級目錄,如下所示:
在這裏插入圖片描述

三、口罩數據集的模型訓練

1、創建XML文件夾

1)、創建xml文件夾,存放OpenCV訓練好的模型
在這裏插入圖片描述

2、複製訓練exe文件

1)、將OpenCV安裝路徑 \opencv\build\x64\vc14\bin下的opencv_createsamples.exe可執行文件和opencv_traincascade.exe可執行文件及另外兩個下圖文件複製到數據集同級目錄,如下所示:
在這裏插入圖片描述
在這裏插入圖片描述

3、對正負樣本txt文檔進行預處理

1)、由於正負樣本需要生成 .vec格式的文檔進行模型訓練,因此,我們需要通過對txt文檔進行預處理,向have_mask.txt文件沒行中加入 1 0 0 20 20,通過如下代碼添加:

#正樣本文件預處理 沒行目錄結尾加入 1 0 0 20 20 
#coding:utf-8
import os
#Houzui="_Apple"
Houzui=r" 1 0 0 20 20" #後綴
filelist = open('F:\\mask\\have_mask.txt','r+',encoding = 'utf-8')
line = filelist.readlines()
for file in line:
    file=file.strip('\n')+Houzui+'\n'
    print(file)
    filelist.write(file)

2)、該代碼由於不會覆蓋之間的文件,只能添加到文件末尾,所以添加之後需要打開該文件將之前的刪除然後保存即可,如果小夥伴能夠改進以上代碼就更好哦,改正之後希望能夠給學長說啦!
在這裏插入圖片描述
在這裏插入圖片描述
這裏1表示當前圖片重複出現的次數是1, 0 0 20 20表示目標圖片大小是矩形框從(0,0)到(20,20)。
3)、再次將have_mask目錄下的have_mask.txt複製出來,命名爲have_mask1.txt,後面訓練會需要,如下所示:
在這裏插入圖片描述
該內容是沒有預處理的哦,只有路徑內容:
在這裏插入圖片描述
4)、對負樣本同樣執行以上操作

#負樣本文件預處理 沒行目錄結尾加入 1 0 0 60 60
#coding:utf-8
import os
#Houzui="_Apple"
Houzui=r" 1 0 0 60 60" #後綴
filelist = open('F:\\mask\\no_mask.txt','r+',encoding = 'utf-8')
line = filelist.readlines()
for file in line:
    file=file.strip('\n')+Houzui+'\n'
    print(file)
    filelist.write(file)

在這裏插入圖片描述
(1)、再次將no_mask目錄下的no_mask.txt複製出來,命名爲no_mask1.txt,後面訓練會需要,如下所示:

4、生成正樣本mask.vec文件和負樣本mask1.vec文件

1)、在剛剛的cmd終端,輸入一下命令,生成mask.vec文件

cd /mask/
opencv_createsamples.exe -vec mask.vec -info have_mask.txt -num 605 -w 20 -h 20
  • info,指樣本說明文件
  • vec,樣本描述文件的名字及路徑
  • num,總共幾個樣本,要注意,這裏的樣本數是指標定後的30x30的樣本數,數據集中有605張照片,因此選擇605
  • w -h指明想讓樣本縮放到什麼尺寸。這裏的奧妙在於你不必另外去處理第1步中被矩形框出的圖片的尺寸,因爲這個參數幫你統一縮放!(我們這裏準備的樣本都是20*20)

2)、運行出現如下錯誤:
在這裏插入圖片描述
這表明,數據集中可用模型只有410張,因此,我們將上面的命令中num改爲410再次執行
3)、執行成功如下所示:

opencv_createsamples.exe -vec mask.vec -info have_mask.txt -num 410 -w 20 -h 20

在這裏插入圖片描述
4)、mask.vec 文件已經創建
在這裏插入圖片描述
5)、同樣生成負樣本的mask1.vec

opencv_createsamples.exe -vec mask1.vec -info no_mask.txt -num 1688 -w 60 -h 60

在這裏插入圖片描述

5、進行模型訓練

1)、在數據集同級目錄創建一個txt文檔,寫入如下內容,寫入後保存然後關閉:

opencv_traincascade.exe -data xml -vec mask.vec -bg no_mask.txt -numPos 385 -numNeg 400 -numStages 20 -w 20 -h 20 -mode ALL

pause

在這裏插入圖片描述

  • numPos:只正樣本數據集張數,上面是411張,但設置應該比他小,不然會報錯,建議設置成350
  • numNeg:負樣本數據集張數,數據集爲1688張

2)、各個參數含義如下所示:
在這裏插入圖片描述
3)、重命名剛剛創建的txt名稱爲traincascade.bat
在這裏插入圖片描述
4)、刪除之前的have_mask.txt和no_mask,txt,然後將have_mask1.txt和no_mask1.txt該爲have_mask.txt和no_mask.txt,如下所示:
在這裏插入圖片描述
在這裏插入圖片描述
5)、雙擊traincascade.bat文件,進行人臉口罩模型訓練
(1)、出現如下圖則表示爲正在進行模型訓練
在這裏插入圖片描述
在訓練途中,程序可能會暫停,當不動的時候,在cmd終端按一下鍵盤的回車鍵就好!
(2)、該模型訓練需要花費的時間較長,由於需要訓練20層,因此花費大量時間,到這裏,小夥伴可以靜靜等待就好,大約需要50分鐘左右,模型便會訓練完成!
(3)、訓練結束後會在xml目錄下生成如圖文件(其中cascade.xml就是我們訓練得到的分類器)如下所示:
在這裏插入圖片描述

四、戴口罩檢測

1、通過如下python代碼,進行口罩模型訓練的監測

1)、python代碼如下所示:

import cv2
detector= cv2.CascadeClassifier('D:/python/python1/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml')
mask_detector=cv2.CascadeClassifier('F:/mask/xml/cascade.xml')
cap = cv2.VideoCapture(0)
while True:
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = detector.detectMultiScale(gray, 1.1, 3)
    for (x, y, w, h) in faces:
        #參數分別爲 圖片、左上角座標,右下角座標,顏色,厚度
        face=img[y:y+h,x:x+w]  # 裁剪座標爲[y0:y1, x0:x1]
        mask_face=mask_detector.detectMultiScale(gray, 1.1, 5)
        for (x2,y2,w2,h2) in mask_face:
            cv2.rectangle(img, (x2, y2), (x2 + w2, y2 + h2), (0, 0, 255), 2)
    cv2.imshow('mask', img)
    cv2.waitKey(3)
cap.release()
cv2.destroyAllWindows()

上面D:/python/python1/Lib/site-packages/cv2/data/haarcascade_frontalface_default.xml是opencv-python下載得時候裏面的一個xml模型,自帶的人臉識別模型文件,當然還有自帶其他的xml文件,比如笑臉識別,貓臉識別,眼睛識別等等,在python安裝路徑下就能夠找到該文件,前提你安裝了opencv-python庫哦!
2)、運行結果如下所示:
(1)、佩戴口罩識別出人臉
在這裏插入圖片描述
(2)、不佩戴口罩便不能識別出來
在這裏插入圖片描述
哈哈,經過以上多次試驗的發現,林君學長給的數據集數目過少,識別效率實在是過低,錯誤大,因此,小夥伴在進行口罩識別的時候,請務必提升數據集中圖片的數量哦!
以上就是本次博客的全部內容,整體過程在熟悉之後便不會太複雜,相對簡單,難點是對於環境的搭建,和在cmd中操作的不熟悉,但如果熟悉Ubuntn系統的操作,便不會反感在Win上的cmd中使用命令操作,後續林君學長將發佈在Ubuntu系統上的口罩人臉識別,本次作爲實踐項目吧!
遇到問題的小夥伴請在評論去進行留言,林君學長看到會爲大家進行解答的,這個學長不太冷!

陳一月的又一天編程歲月^ _ ^

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章