(详细教程)opencv+python+pycharm 训练属于自己的分类器(以口罩识别为例)

您所在的位置:网站首页 图像分类与识别软件 (详细教程)opencv+python+pycharm 训练属于自己的分类器(以口罩识别为例)

(详细教程)opencv+python+pycharm 训练属于自己的分类器(以口罩识别为例)

2024-07-17 08:32| 来源: 网络整理| 查看: 265

文章目录

目录

前言

一、分类器制作

1.样本准备

2.样本制作

(1)图片重命名

(2)修改图片像素

 3.生成资源记录文件

 4.生成vec文件

  5.训练模型

二、检验分类器​

总结

前言

本文详细介绍怎么制作属于自己的分类器,本篇以口罩识别为例来讲解.

一、分类器制作 1.样本准备

在pycharm建立的项目根目录中建立mask文件夹

在mask文件夹下分别建立have_mask和no_mask,分别用来放正样本,即戴口罩的照片,和负样本,即不带口罩的照片,搜一搜可以下载到口罩检测训练集,我这里因为文件数量太多无法上传。

 

正样本未处理

负样本未处理

2.样本制作 (1)图片重命名

方便对样本进行批量处理,我们需要对样本进行重命名,运行以下即可获得以1000开头的连续图片命名的正样本。

改为负样本的路径,且把count改为10000即可获得为10000开头的连续图片命名的负样本

coding:utf-8 import os path = r'C:\Users\Gaomagic\PycharmProjects\kouzhaodetect\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)修改图片像素 将正样本尺寸统一修改为20×20来提高模型训练精度,负样本数据集像素不低于50×50 import pandas as pd import cv2 for n in range(10000, 11790): # 代表正数据集中开始和结束照片的数字 path = r'C:\Users\Gaomagic\PycharmProjects\kouzhaodetect\mask\no_mask/' + str(n) + '.jpg' # 读取图片 img = cv2.imread(path) img = cv2.resize(img, (80, 80)) # 修改样本像素为20x20 cv2.imwrite(r'C:\Users\Gaomagic\PycharmProjects\kouzhaodetect\mask\no_mask/' + str(n) + '.jpg', img) n += 1

修改完后效果如下

正样本

负样本

 3.生成资源记录文件

按下win+r输入cmd打开命令提示符界面进入have_mask文件夹

输入以下代码即可创建路径文件

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

 此时在have_mask下就会产生一个have_mask.txt文件,并将其放到上一层目录

 

 对于no_mask进行上述重复步骤即可

最后结果如下

 之后要对正样本进行预处理,在have_mask.txt末尾加入1 0 0 20 20执行以下代码即可

coding:utf-8 Houzhui=r" 1 0 0 20 20" #后缀 filelist = open(r'C:\Users\Gaomagic\PycharmProjects\kouzhaodetect\mask\have_mask.txt','r+',encoding = 'utf-8') line = filelist.readlines() for file in line: file=file.strip('\n')+Houzhui+'\n' print(file) filelist.write(file)

最后得到的文件

 

 4.生成vec文件

将如下opencv包里的文件复制到项目mask文件夹下,并在当前文件夹创建xml放置训练好的模型

 

 按 win+R 输入 cmd 进入命令窗口, 然后进入到 mask 文件夹,然后输入如下命令:

opencv_createsamples.exe -vec havemask.vec -info have_mask.txt -num 400 -w 20 -h 20

得到havemask.vec文件  

  5.训练模型

在当前文件夹下新建text文件加入以下代码

opencv_traincascade.exe -data xml -vec havemask.vec -bg no_mask.txt -numPos 250 -numNeg 500 -numStages 20 -w 20 -h 20 -mode ALL pause

 修改文件名称为start.bat

打开start.bat开始训练模型 

 根据训练样本数目多少来确定训练时间长短,我训练的比例为250:500,预计半小时左右时间

训练完成后在xml文件下即可看到以下文件,第一个文件即为我们训练好的分类器

 

二、检验分类器

 输入以下代码

import cv2 detector = cv2.CascadeClassifier(r'C:\Users\Gaomagic\PycharmProjects\kouzhaodetect\mask\xml\haarcascade_mcs_nose.xml') mask_detector = cv2.CascadeClassifier(r'C:\Users\Gaomagic\PycharmProjects\kouzhaodetect\mask\xml\cascade.xml') cap = cv2.VideoCapture(0) while True: ret, img = cap.read() gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) nose = detector.detectMultiScale(gray, 1.1, 3) if ret: for (x, y, w, h) in nose: face = img[y:y + h, x:x + w] mask_face = mask_detector.detectMultiScale(gray, 1.1, 5) cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 2) cv2.putText(img, "no_mask", (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2) for (x2, y2, w2, h2) in mask_face: cv2.rectangle(img, (x2, y2), (x2 + w2, y2 + h2), (0, 255, 0), 2) cv2.putText(img, "have_mask", (x2, y2), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) cv2.imshow('mask', img) cv2.waitKey(3) cap.release() cv2.destroyAllWindows()

得到如下测试结果 

 

 训练精度不是很高,当检测到鼻子识,说明没有戴口罩。

总结

本篇以口罩识别为例,讲述了如何制作自己的分类器



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3