本專欄主要介紹若是經過OpenCv-Python進行圖像處理,經過原理理解OpenCv-Python的函數處理原型,在具體狀況中,針對不一樣的圖像進行不一樣等級的、不一樣方法的處理,以達到對圖像進行去噪、銳化等一系列的操做。同時,但願觀看本專欄的小夥伴能夠理解到OpenCv進行圖像處理的強大哦,若有轉載,請註明出處(原文連接和做者署名),感謝各位小夥伴啦!python
前文參考:
《OpenCv視覺之眼》Python圖像處理一 :Opencv-python的簡介及Python環境搭建
《OpenCv視覺之眼》Python圖像處理二 :Opencv圖像讀取、顯示、保存基本函數原型及使用
《OpenCv視覺之眼》Python圖像處理三 :Opencv圖像屬性、ROI區域獲取及通道處理
《OpenCv視覺之眼》Python圖像處理四 :Opencv圖像灰度處理的四種方法及原理
《OpenCv視覺之眼》Python圖像處理五 :Opencv圖像去噪處理之均值濾波、方框濾波、中值濾波和高斯濾波
《OpenCv視覺之眼》Python圖像處理六 :Opencv圖像傅里葉變換和傅里葉逆變換原理及實現
《OpenCv視覺之眼》Python圖像處理七 :Opencv圖像處理之高通濾波和低通濾波原理及構造
《OpenCv視覺之眼》Python圖像處理八 :Opencv圖像處理之圖像閾值化處理原理及函數
《OpenCv視覺之眼》Python圖像處理九 :Opencv圖像形態學處理之圖像腐蝕與膨脹原理及方法
《OpenCv視覺之眼》Python圖像處理十 :Opencv圖像形態學處理之開運算、閉運算和梯度運算原理及方法
《OpenCv視覺之眼》Python圖像處理十一 :Opencv圖像形態學處理之頂帽運算與黑帽運算
《OpenCv視覺之眼》Python圖像處理十二 :Opencv圖像輪廓提取之基於一階導數的Roberts算法、Prewitt算法及Sobel算法
《OpenCv視覺之眼》Python圖像處理十三 :Opencv圖像輪廓提取之基於二階導數的Laplacian算法和LOG算法
《OpenCv視覺之眼》Python圖像處理十四 :Opencv圖像輪廓提取之Scharr算法和Canny算法
《OpenCv視覺之眼》Python圖像處理十五 :Opencv圖像處理之圖像縮放、旋轉和平移原理及實現
《OpenCv視覺之眼》Python圖像處理十六:Opencv項目實戰之圖像中的硬幣檢測
《OpenCv視覺之眼》Python圖像處理十七:Opencv圖像處理實戰二之圖像中的物體識別並截取
《OpenCv視覺之眼》Python圖像處理十八:Opencv圖像處理實戰三之基於OpenCV訓練模型的AI人臉檢測
算法
上次博客,瞭解了OpenCV經過本身訓練好的模型進行人臉檢測,而且給出了圖像中、視頻中、攝像頭中的人臉檢測算法,也知道了OpenCV的訓練模型針對正臉的檢測準確率是大於百分之95的,而對於側臉的檢測是與側臉突出的臉部面積的大小,光照強度有關的,所以,該模型若是應用於人臉檢測系統只能但方面的用於正臉;既然咱們可以使用該模型,那麼該模型是怎樣進行訓練的呢?這是咱們須要弄懂的。編程
本次博客,林君學長將帶你們瞭解OpenCV神經網絡模型訓練是如何進行訓練的,以人臉口罩識別爲例bash
OpenCV圖像處理實戰四:經過OpenCV進行人臉口罩模型訓練並進行口罩檢測
網絡
[Python圖像處理十九]:Opencv圖像處理實戰四之經過OpenCV進行人臉口罩模型訓練並進行口罩檢測
新冠疫情的影響下,人民羣衆被迫戴上口罩,相信各位小夥伴們也不例外,但在戴口罩的狀況下,咱們會遇到各類不方便的問題,例如在進出校園或者是小區的時候,須要將口罩摘下來,而後進行人臉識別,特別麻煩,本次博客,林君學長主要帶你們瞭解如何對口罩數據集進行模型訓練,而後進行戴口罩識別
- 模型訓練環境:Opencv-3.4.1(這裏並無使用opencv-python進行訓練)
1、OpenCv的下載及安裝
在進行OpenCv的安裝同時,你們會有幾個選擇,一個是新版本 的OpenCv-4.xx,另外一種選擇即是OpenCv-3.xx,在林君學長通過各類測試以後,發現對於模型訓練的須要,選擇OpenCv-3.4.1版本的進行win下的安裝,由於該版本會具備數據集模型訓練的exe文件,所以,建議你們選擇OpenCv-3.4.1進行下載安裝!ide
一、OpenCv的下載
1)、OpenCv-3.4.1官網下載連接
https://opencv.org/opencv-3-4-1/
2)、選擇Win pack進行win10安裝包下載
3)、在彈出的頁面等待5秒,進行路徑選擇下載
函數
二、OpenCv的安裝
1)、點擊下載好的OpenCv-3.4.1.exe進行自定義安裝
2)、雙擊,自定義路徑暗轉
3)、安裝成功
工具
三、查看是否具備模型訓練環境
1)、找到opencv的安裝路徑,而後查到路徑 \opencv\build\x64\vc14\bin下是否具備下圖標記的的兩個exe文件
2)、若是具備上面兩個工具,咱們即可以進行下一步,固然,若是安裝林君學長推薦的OpenCv-3.4.1,必定會有以上兩個模型訓練exe文件的,接下來,咱們便進入下一步,口罩數據集的下載吧!
測試
2、人臉口罩數據集的下載及處理
人臉口罩數據集主要是爲了進行模型訓練,OpenCv經過神經網絡進行模型訓練,經過網絡查找而言,口罩數據集的正負比例爲1:3,及解釋爲,500張戴口罩的數據集,須要1500張不戴口罩的數據集進行模型訓練,在這裏,林君學長已經準備好了咱們須要的大體爲1:3正負樣本比例的數據集,小夥伴能夠經過以下連接進行下載。ui
一、人臉口罩數據集下載
1)、經過以下連接進行人臉口罩數據集的下載,包括600張正樣本(戴口罩)和1800多張負樣本(不帶口罩)
https://download.csdn.net/download/qq_42451251/12566250
2)、CSDN下載後的樣本以下所示,咱們解壓後將裏面的mask文件夾放在F盤或者其餘方便操做的盤下面;
提取到F盤以後以下所示:
二、數據集重命名爲連續序列
經過樣本,咱們能夠發現,數據集裏面的圖片是不連續的,,所以,咱們須要將正負樣本數據集重命名,命名爲連續增長的圖片格式,爲了後面的圖片像素調整
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
當數據集重命名成功以後,咱們即可以對圖片的的像素進行處理了!看下面步驟吧!
三、正負樣本數據集像素處理
官方推薦,正樣本數據集的像素最好設置爲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
負樣本數據集修改後像素以下所示:
四、建立正負樣本數據集路徑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
負樣本路徑文檔內容以下所示:
五、將正負樣本txt文檔複製到數據集同級目錄
將上面咱們建立的路徑文檔分別複製到數據集的同級目錄,以下所示:
3、口罩數據集的模型訓練
一、建立XML文件夾
1)、建立xml文件夾,存放OpenCV訓練好的模型
二、複製訓練模型的exe文件
1)、將OpenCV安裝路徑 \opencv\build\x64\vc14\bin下的opencv_createsamples.exe可執行文件和opencv_traincascade.exe可執行文件及另外兩個下圖文件複製到數據集同級目錄,以下所示:
三、對正負樣本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,後面訓練會須要,以下所示:
四、生成正樣本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
五、進行模型訓練
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就是咱們訓練獲得的分類器)以下所示:
4、戴口罩檢測
一、經過以下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中使用命令操做;遇到問題的小夥伴記得留言評論,學長看到會爲你們進行解答的,這個學長不太冷!
天沒降大任於我,照樣苦我心智,勞我筋骨^ _ ^
陳一月的又一天編程歲月^ _ ^