《OpenCv视觉之眼》Python图像处理十九:Opencv图像处理实战四之经过OpenCV进行人脸口罩模型训练并进行口罩检测

本专栏主要介绍若是经过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进行人脸口罩模型训练并进行口罩检测

网络


新冠疫情的影响下,人民群众被迫戴上口罩,相信各位小伙伴们也不例外,但在戴口罩的状况下,咱们会遇到各类不方便的问题,例如在进出校园或者是小区的时候,须要将口罩摘下来,而后进行人脸识别,特别麻烦,本次博客,林君学长主要带你们了解如何对口罩数据集进行模型训练,而后进行戴口罩识别

  • 模型训练环境: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中使用命令操做;遇到问题的小伙伴记得留言评论,学长看到会为你们进行解答的,这个学长不太冷!

天没降大任于我,照样苦我心智,劳我筋骨^ _ ^

陈一月的又一天编程岁月^ _ ^

相关文章
相关标签/搜索