当前位置:   article > 正文

opencv python 训练自己的分类器_opencv训练分类器

opencv训练分类器

源码下载

一、分类器制作

1.样本准备

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

 

 

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

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

 

 2.样本制作

(1)图片重命名

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

  1. import os
  2. # 正样本的路径
  3. path = r'E:\pycharmWorkspace\maskTest\mask\has_mask'
  4. filelist = os.listdir(path)
  5. # 开始文件名1000.jpg
  6. count = 1000
  7. for file in filelist:
  8. Olddir = os.path.join(path, file)
  9. if os.path.isdir(Olddir):
  10. continue
  11. filename = os.path.splitext(file)[0]
  12. filetype = os.path.splitext(file)[1]
  13. Newdir = os.path.join(path, str(count) + filetype)
  14. os.rename(Olddir, Newdir)
  15. count += 1
  16. # 负样本的路径
  17. path = r'E:\pycharmWorkspace\maskTest\mask\no_mask'
  18. filelist = os.listdir(path)
  19. # 开始文件名10000.jpg
  20. count = 10000
  21. for file in filelist:
  22. Olddir = os.path.join(path, file)
  23. if os.path.isdir(Olddir):
  24. continue
  25. filename = os.path.splitext(file)[0]
  26. filetype = os.path.splitext(file)[1]
  27. Newdir = os.path.join(path, str(count) + filetype)
  28. os.rename(Olddir, Newdir)
  29. count += 1
(2)修改图片像素

将正样本尺寸统一修改为20×20来提高模型训练精度,负样本数据集像素不低于50×50

  1. import cv2
  2. # 代表正数据集中开始和结束照片的数字
  3. for n in range(1000, 1099):
  4. path = r'C:\Users\Administrator\Desktop\mask\mask/' + str(n) + '.jpg'
  5. # 读取图片
  6. img = cv2.imread(path)
  7. img = cv2.resize(img, (20, 20)) # 修改样本像素为20x20
  8. cv2.imwrite(r'C:\Users\Administrator\Desktop\mask\mask/' + str(n) + '.jpg', img)
  9. n += 1
  10. # 代表正数据集中开始和结束照片的数字
  11. for n in range(10000, 10099):
  12. path = r'C:\Users\Administrator\Desktop\mask\no_mask/' + str(n) + '.jpg'
  13. # 读取图片
  14. img = cv2.imread(path)
  15. img = cv2.resize(img, (80, 80)) # 修改样本像素为80x80
  16. cv2.imwrite(r'C:\Users\Administrator\Desktop\mask\no_mask/' + str(n) + '.jpg', img)
  17. 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执行以下代码即可

  1. #后缀
  2. Houzhui=r" 1 0 0 20 20"
  3. filelist = open(r'E:\pycharmWorkspace\maskTest\mask\have_mask.txt','r+',encoding = 'utf-8')
  4. line = filelist.readlines()
  5. for file in line:
  6. file=file.strip('\n')+Houzhui+'\n'
  7. print(file)
  8. filelist.write(file)
  9. filelist = open(r'E:\pycharmWorkspace\maskTest\mask\no_mask.txt','r+',encoding = 'utf-8')
  10. line = filelist.readlines()
  11. for file in line:
  12. file=file.strip('\n')+Houzhui+'\n'
  13. print(file)
  14. 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参数的说明:

  1. -vec <vec_file_name>
  2. 输出文件,内含用于训练的正样本。他应该有一个.vec文件扩展名。
  3. -info <file_name>
  4. 这是指定输入示例集合的文件的名字,包括文件名和在图像中示例目标的位置(例如自己创建的.dat
  5. 文件)。
  6. -img <image_file_name>
  7. 这是-info的替代(必须提供其中一个)。使用-img,你可以提供单个裁剪的正向示例。在使用-img的
  8. 模式中,将产生多个输出,且都来自于这一个输入。
  9. -bg <background_file_name>
  10. 背景图像的描述文件,文件中包含一系列的图像文件名,这些图像将被随机选作物体的背景。
  11. -num <number_of_samples>
  12. 生成的正样本的数目。
  13. -bgcolor <background_color>
  14. 背景颜色(目前为灰度图);背景颜色表示透明颜色。因为图像压缩可造成颜色偏差,颜色的容差
  15. 可以由 -bgthresh 指定。所有处于 bgcolor-bgthresh 和 bgcolor+bgthresh 之间的像素都被设置为
  16. 透明像素。
  17. -bgthresh <background_color_threshold>
  18. -inv
  19. 如果指定该标志,前景图像的颜色将翻转。
  20. -randinv
  21. 如果指定该标志,颜色将随机地翻转。
  22. -maxidev <max_intensity_deviation>
  23. 前景样本里像素的亮度梯度的最大值。
  24. -maxxangle <max_x_rotation_angle>
  25. X轴最大旋转角度,必须以弧度为单位。
  26. -maxyangle <max_y_rotation_angle>
  27. Y轴最大旋转角度,必须以弧度为单位。
  28. -maxzangle <max_z_rotation_angle>
  29. Z轴最大旋转角度,必须以弧度为单位。
  30. -show
  31. 很有用的调试选项。如果指定该选项,每个样本都将被显示。如果按下 Esc 键,程序将继续创建样
  32. 本但不再显示。
  33. -w <sample_width>
  34. 输出样本的宽度(以像素为单位)。
  35. -h <sample_height>
  36. 输出样本的高度(以像素为单位)。

 

 

 得到havemask.vec文件  

 5.训练模型

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

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

在terminal执行start.bat

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

 

二、检验分类器

 输入以下代码

  1. import cv2
  2. #加载分类器
  3. mask_detector = cv2.CascadeClassifier(r'E:\pycharmWorkspace\maskTest\mask\xml\cascade.xml')
  4. img = cv2.imread(r'D:\0001.jpg')
  5. #转成灰度图片
  6. gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
  7. #进行预测
  8. mask_face = mask_detector.detectMultiScale(gray, 1.1, 5, cv2.CASCADE_SCALE_IMAGE, (50,50), (200, 200))
  9. for (x2, y2, w2, h2) in mask_face:
  10. cv2.rectangle(img, (x2, y2), (x2 + w2, y2 + h2), (0, 255, 0), 2)
  11. cv2.putText(img, "have_mask", (x2, y2), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
  12. cv2.imshow('mask', img)
  13. cv2.imshow('mask', img)
  14. cv2.imwrite(r'D:/test.jpg', img)
  15. cv2.waitKey()

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

 

源码下载

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/263859
推荐阅读
相关标签
  

闽ICP备14008679号