opencv python 训练自己的分类器

源码下载

一、分类器制作

1.样本准备

收集好你所需的正样本,和负样本,分别保存在不同文件夹

 

 

在pycharm新建项目,项目结构如下:has_mask文件夹放置正样本,no_mask文件夹放置负样本

 安装opencv,把opencv包里的文件复制到项目mask文件夹下

 

 2.样本制作

(1)图片重命名

方便对样本进行批量处理,我们需要对样本进行重命名,重命名代码如下:

import os
# 正样本的路径
path = r'E:\pycharmWorkspace\maskTest\mask\has_mask'
filelist = os.listdir(path)
# 开始文件名1000.jpg
count = 1000
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

# 负样本的路径
path = r'E:\pycharmWorkspace\maskTest\mask\no_mask'
filelist = os.listdir(path)
# 开始文件名10000.jpg
count = 10000
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 cv2

# 代表正数据集中开始和结束照片的数字
for n in range(1000, 1099):
    path = r'C:\Users\Administrator\Desktop\mask\mask/' + str(n) + '.jpg'
    # 读取图片
    img = cv2.imread(path)
    img = cv2.resize(img, (20, 20))  # 修改样本像素为20x20
    cv2.imwrite(r'C:\Users\Administrator\Desktop\mask\mask/' + str(n) + '.jpg', img)
    n += 1

# 代表正数据集中开始和结束照片的数字
for n in range(10000, 10099):
    path = r'C:\Users\Administrator\Desktop\mask\no_mask/' + str(n) + '.jpg'
    # 读取图片
    img = cv2.imread(path)
    img = cv2.resize(img, (80, 80))  # 修改样本像素为80x80
    cv2.imwrite(r'C:\Users\Administrator\Desktop\mask\no_mask/' + str(n) + '.jpg', img)
    n += 1

 这里用到了python opencv库,在pycharm 控制台下用pip安装,以下命令可以解决opencv库安装速度慢的问题

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python --no-cache-dir

 

3.生成资源记录文件 

在控制台进入has_mask文件夹

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

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

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

 进入no_mask文件夹,重复上述步骤即可

最后结果如下

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

#后缀
Houzhui=r" 1 0 0 20 20"
filelist = open(r'E:\pycharmWorkspace\maskTest\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)
    
filelist = open(r'E:\pycharmWorkspace\maskTest\mask\no_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文件

在terminal控制台进入到 mask 文件夹,然后输入如下命令

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

opencv_createsamples.exe参数的说明:


-vec <vec_file_name>
	输出文件,内含用于训练的正样本。他应该有一个.vec文件扩展名。

-info <file_name>
	这是指定输入示例集合的文件的名字,包括文件名和在图像中示例目标的位置(例如自己创建的.dat
	文件)。

-img <image_file_name>
	这是-info的替代(必须提供其中一个)。使用-img,你可以提供单个裁剪的正向示例。在使用-img的
	模式中,将产生多个输出,且都来自于这一个输入。

-bg <background_file_name>
	背景图像的描述文件,文件中包含一系列的图像文件名,这些图像将被随机选作物体的背景。

-num <number_of_samples>
	生成的正样本的数目。

-bgcolor <background_color>
	背景颜色(目前为灰度图);背景颜色表示透明颜色。因为图像压缩可造成颜色偏差,颜色的容差
	可以由 -bgthresh 指定。所有处于 bgcolor-bgthresh 和 bgcolor+bgthresh 之间的像素都被设置为
	透明像素。

-bgthresh <background_color_threshold>

-inv
	如果指定该标志,前景图像的颜色将翻转。

-randinv
	如果指定该标志,颜色将随机地翻转。

-maxidev <max_intensity_deviation>
	前景样本里像素的亮度梯度的最大值。

-maxxangle <max_x_rotation_angle>
	X轴最大旋转角度,必须以弧度为单位。

-maxyangle <max_y_rotation_angle>
	Y轴最大旋转角度,必须以弧度为单位。

-maxzangle <max_z_rotation_angle>
	Z轴最大旋转角度,必须以弧度为单位。

-show
	很有用的调试选项。如果指定该选项,每个样本都将被显示。如果按下 Esc 键,程序将继续创建样
	本但不再显示。

-w <sample_width>
	输出样本的宽度(以像素为单位)。

-h <sample_height>
	输出样本的高度(以像素为单位)。

 

 

 得到havemask.vec文件  

 5.训练模型

在当前文件夹下新建start.bat文件加入以下代码

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

在terminal执行start.bat

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

 

二、检验分类器

 输入以下代码

import cv2
#加载分类器
mask_detector = cv2.CascadeClassifier(r'E:\pycharmWorkspace\maskTest\mask\xml\cascade.xml')
img = cv2.imread(r'D:\0001.jpg')
#转成灰度图片
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#进行预测
mask_face = mask_detector.detectMultiScale(gray, 1.1, 5, cv2.CASCADE_SCALE_IMAGE, (50,50), (200, 200))
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.imshow('mask', img)
cv2.imwrite(r'D:/test.jpg', img)
cv2.waitKey()

 得到如下测试结果 ,效果不是很好

 

源码下载

  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 使用OpenCV-Python可以训练分类器分类器是一种机器学习模型,可以将输入数据分为不同的类别。在OpenCV-Python中,可以使用Haar特征分类器或LBP特征分类器训练分类器训练分类器需要准备好训练数据集和测试数据集,然后使用机器学习算法进行训练训练完成后,可以使用分类器对新的数据进行分类。 ### 回答2: OpenCV-Python 是一个强大的计算机视觉库,它提供了许多用于图像处理和分析的功能。其中一个重要的功能就是训练分类器训练分类器是一个机器学习的过程,通过给定的训练数据集,模型可以学习到不同的特征,并根据这些特征对新的未知数据进行分类。在 OpenCV-Python 中,我们可以使用支持向量机(SVM)来进行分类器训练。 在训练分类器之前,我们首先需要准备好训练数据集。数据集应包含我们希望训练的对象的图像,并且每个图像都应标记为所属的类别。 使用 OpenCV-Python 进行分类器训练的步骤如下: 1. 加载训练数据集:使用 OpenCV 的函数加载训练图像和对应的类别标签。 2. 特征提取:将加载的图像转换为特征向量,以便机器学习模型可以学习到图像的特征。 3. 数据预处理:对特征向量进行预处理,例如标准化、降维等。 4. 训练分类器:使用 SVM 算法对预处理后的特征向量进行训练,得到分类器模型。 5. 保存分类器模型:将训练得到的分类器模型保存到文件中,以便之后可以加载和使用。 通过训练分类器,我们可以将新的图像数据进行分类,从而实现图像识别和目标检测等任务。在实际应用中,我们可以使用 OpenCV-Python 提供的分类器来识别人脸、车辆、物体等。 总的来说,使用 OpenCV-Python 训练分类器是一个相对复杂的过程,需要准备好训练数据集并按照一定的步骤进行训练。但通过合理的训练和调整参数,我们可以得到一个高效准确的分类器模型,从而应用于各种计算机视觉任务中。 ### 回答3: OpenCV是一个功能强大的计算机视觉库,提供各种图像处理和分析工具。通过使用OpenCV中的机器学习模块,我们可以训练自己的分类器训练分类器的第一步是准备数据集。我们需要收集足够数量的图像,每个图像都标有相应的标签。例如,如果我们要训练一个垃圾分类器,我们需要收集带有"可回收"和"不可回收"标签的图像。 接下来,我们需要将图像转化为适当的特征向量。OpenCV提供了一些用于提取特征的函数,例如计算色彩直方图或提取图像纹理特征。这些特征将用于训练分类器。 然后,我们使用收集到的图像和标签来训练分类器OpenCV提供了一些常见的机器学习算法,例如支持向量机(SVM)或k最近邻算法(KNN)。我们可以根据需要选择合适的算法,并用训练数据进行训练训练完成后,我们可以使用分类器来进行预测。对于新的未标记图像,我们将提取相同的特征并使用分类器来预测其标签。 需要注意的是,训练分类器是一个复杂的过程,需要考虑到数据集的大小和质量,以及特征选择和算法调优等方面。在实践中,我们通常需要进行多次实验和调整来获得最佳的分类器性能。 总之,使用OpenCV的机器学习模块,我们可以训练自己的分类器并用于解决各种计算机视觉问题。这是一个令人兴奋且具有挑战性的领域,可以在图像分析、目标检测和图像识别等应用中发挥重要作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

古智云开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值