欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

【人工智能与机器学习】创新性大作业--人脸口罩数据集的模型训练

程序员文章站 2022-03-04 09:00:20
操作系统:Win10编程环境:Jupyter Notebook模型训练环境:Opencv-3.4.1Python版本:python3.7一、OpenCv的下载及安装1、下载opencv官网:https://opencv.org/opencv-3-4-1/2、选择合适的版本进行下载安装3、等待读秒,进行下载4、选择合适的路径进行安装二、下载人脸口罩数据集并进行处理1、下载人脸口罩数据集人脸口罩数据集链接如下:https://download.csdn.net/download/qq...

操作系统:Win10
编程环境:Jupyter Notebook
模型训练环境:Opencv-3.4.1
Python版本:python3.7

一、OpenCv的下载及安装

1、下载

opencv官网:https://opencv.org/opencv-3-4-1/

2、选择合适的版本进行下载安装

【人工智能与机器学习】创新性大作业--人脸口罩数据集的模型训练

3、等待读秒,进行下载

【人工智能与机器学习】创新性大作业--人脸口罩数据集的模型训练

4、选择合适的路径进行安装

二、下载人脸口罩数据集并进行处理

1、下载人脸口罩数据集

人脸口罩数据集链接如下:https://download.csdn.net/download/qq_42451251/12566250

2、数据集重命名为连续序列

将数据集重命名为连续序列,重命名代码如下:

#对数据集重命名
#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

正样本重命名结果如下所示:
【人工智能与机器学习】创新性大作业--人脸口罩数据集的模型训练
同样的步骤对负样本进行重命名,而后在对正负样本数据集进行像素处理
代码如下:

#修改正样本像素
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

负样本重命名结果如下所示:
【人工智能与机器学习】创新性大作业--人脸口罩数据集的模型训练

3、正负样本数据集像素处理

修改正样本数据集的像素为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

修改负样本的像素为60x60:

#修改正样本像素
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

4、创建正负样本数据集路径txt文档

创建正负样本数据集文档:
打开打开cmd,进入到存放正样本的have_mask文件夹

F:
cd mask\have_mask

而后再cmd终端输入如下命令创建路径文档

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

进行完这一步,正样本数据集的末尾,你就会发现已经创建一个have_mask.txt的路径正样本文件

而后对负样本数据集路径文档创建
先进入负样本文件夹

cd /mask/no_mask/

输入如下命令,创建负样本路径txt文档

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

最后将正负样本txt文档复制到数据集同级目录

三、口罩数据集的模型训练

1、创建xml文件夹,存放OpenCV训练好的模型

对正负样本txt文档进行预处理
代码如下:

#正样本文件预处理 没行目录结尾加入 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 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)

而后生成正样本mask.vec文件和负样本mask1.vec文件
在cmd终端,输入以下命令,生成mask.vec文件:

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

同样生成负样本的mask1.vec,代码如下:

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

3、进行模型训练

在数据集同级目录创建一个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

打开traincascade.bat文件,进行人脸口罩模型训练,实验过程如下图:
【人工智能与机器学习】创新性大作业--人脸口罩数据集的模型训练

4、进行戴口罩检测

检测代码如下:

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()

而后就能完成测试了,本次实验结束。

本文地址:https://blog.csdn.net/lyr70334/article/details/107279907