目录

1、搭建环境

2、准备数据集

3、训练级联文件


之前使用Python+OpenCV实现交通路标识别,具体实现步骤及心得如下:

OpenCV训练属于自己的xml文件,需以下几个步骤:

1、首先下载OpenCV(Windows版);

2、准备数据集,分为正样本集和负样本集;

3、生成路径,将正样本集的路径要存成 *.vec格式;负样本集的路径不做要求,*.txt就可以;

4、训练xml文件。

1、搭建环境

OpenCV创建级联文件需要先下载OpenCV(Windows版)。

接下来傻瓜式安装操作,安装到指定路径。

安装成功后开始配置环境变量(配置环境变量比较简单,此处省略),稍后会用到OpenCV中的opencv_createsamples.exe和opencv_traincascade.exe文件训练级联文件,我的安装路径在D盘,所以设置环境变量的路径是D:\opencv\opencv\build\x64\vc15\bin。 注意:若直接在D:\opencv\opencv\build\x64\vc15\bin路径下训练模型,可以不用配置环境变量。

2、准备数据集

需要准备正样本数据集(所要识别的物体)和负样本数据集(背景图片、干扰图片),数据集数量越多种类越复杂越好。

通常正样本数据裁剪为20*20或40*40大小的像素即可(这里我使用40*40像素训练模型,9小时+可以训练完成),注意:像素过大训练速度相当慢,图片像素最好是正方形图片,长宽相等。

通常负样本数据集是识别物体的背景环境照片,图片越多越复杂抗干扰能力越强,负样本图片可以不用裁剪为固定大小,但是为了提升训练速度建议进行合理裁剪。

正样本图片如下:

负样本图片如下:

为了操作方便,我写了Python程序实现批量调整图片数据大小和图片命名,具体如下:

# -*- coding:utf8 -*-
import os
from PIL import Image
'''
批量重命名文件夹中的图片文件'''
class BatchRename():def __init__(self):self.path = r'C:\Users\Administrator\Desktop\opencv-haar-classifier-training-master\positive_images'def rename(self):filelist = os.listdir(self.path)total_num = len(filelist)i = 0for item in filelist:if item.endswith('.jpg'):src = os.path.join(os.path.abspath(self.path), item)print(src)dst = os.path.join(os.path.abspath(self.path), str(i) + '.jpg')try:os.rename(src, dst)print ('converting %s to %s ...' % (src, dst))i = i + 1except :continueprint ('total %d to rename & converted %d jpgs' % (total_num, i))if __name__ == '__main__':demo = BatchRename()demo.rename()'''
批量修改图片尺寸
'''
#提取目录下所有图片,更改尺寸后保存到另一目录
import os.path
import glob
def convertjpg(jpgfile,outdir,width=40,height=40):img=Image.open(jpgfile)try:new_img=img.resize((width,height),Image.BILINEAR)   new_img.save(os.path.join(outdir,os.path.basename(jpgfile)))except Exception as e:print(e)
for jpgfile in glob.glob(r"C:\Users\Administrator\Desktop\opencv-haar-classifier-training-master\positive_images\*.jpg"):#像素修改后存入images文件convertjpg(jpgfile,r"C:\Users\Administrator\Desktop\opencv-haar-classifier-training-master\images")

3、训练级联文件

1、首先按照要求创建训练文件夹

negative_images文件夹存放负样本图片。

positive_images文件夹存放正样本图片。

xml文件夹存放稍后生成的xml级联文件。

opencv_createsamples.exe负责生成*.vec文件。

opencv_traincascade.exe负责训练级联文件模型。

另外我还写了两个Python文件负责批量处理图片命名、尺寸缩小和生成对应的txt文件。

2、生成指定的txt文件路径

执行这一步之前保证文件已经命名规范,尺寸缩小到合适大小。

运行生成txt文件.py文件,生成对应的正样本路径和负样本路径文件,效果如下:

文件夹结构如下:

正样本路径文件(pos.txt)格式如下:

正样本路径文件(neg.txt)格式如下:

生成对应的txt文件Python代码如下:

import os
'''
正样本数据生成txt文件
'''
file_dir=os.getcwd()
file_dir=r'C:\Users\Administrator\Desktop\opencv-haar-classifier-training-master\positive_images'
L=[]
i=0
with open("pos.txt","w+") as f:for root, dirs, files in os.walk(file_dir):  for file in files:  if os.path.splitext(file)[1] == '.jpg':  L.append(os.path.join(root, file))f.write(L[i]+' 1'+' 0'+' 0'+' 40'+' 40'+'\n')i+=1
'''
负样本数据生成txt文件
'''
file_dir=r'C:\Users\Administrator\Desktop\opencv-haar-classifier-training-master\negative_images'
L=[]
i=0
with open("neg.txt","w+") as f:for root, dirs, files in os.walk(file_dir):  for file in files:  if os.path.splitext(file)[1] == '.jpg':  L.append(os.path.join(root, file))f.write(L[i]+'\n')i+=1  

3、获取正样本矢量集vec文件

在文件夹下新建createsamples.bat,批处理文件,内容如下:

opencv_createsamples.exe -vec pos.vec  -info pos.txt -num 1100 -w 40 -h 40
pause

其中,-vec后面是将生成的正样本矢量集vec文件,-info后面是正样本路径文件,-num后面的数字是正样本个数,-w后面的数字是正样本图片的长,-h后面的数字是正样本图片的高。

双击createsamples.bat后出现pos.vec即为运行成功。

此时文件夹结构如下:

4、训练级联文件模型

在文件夹下新建train.dat文件,内容如下:

opencv_traincascade.exe -data xml -vec pos.vec -bg neg.txt -numPos 1100 -numNeg 3205 -numStages 15 -w 40 -h 40 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -mode ALL
pause

其中,-data 是存放训练好的分类器的路径 ,-vec 就是存放.vec的路径, -bg 负样本描述文件, -numPos 每一阶段训练的正样本数量 , -numNeg 每一阶段训练的负样本数量 (网上说-numPos的参数要比实际正样本数量小,-numNeg 的参数要比实际负样本数量大 ), -numStages 训练阶段数 (这个参数不能太大也不能太小 ,太大训练时间过长,如果太小的话 生成的xml文档分类效果可能就不太好 ), -featureType 选择LBP还是HAAR 在此选用LBP ,-w -h 训练样本尺寸 和vec生成的尺寸大小相同 不然会宕机, -minHitRate  最小命中率 ,-maxFalseAlarmRate 最大虚警率 ,最后需要在加上 -mode ALL。

此时文件夹结构如下:

双击train.bat后进入训练模式,进入漫长等待,效果如下:

最后训练完成之后级联文件保存在xml文件夹中。

其中,只有第一个cascade.xml文件是我们所需要的文件,其余文件是训练过程中生成的检查的文件,防止训练过程中出现意外程序重头训练。

下面使用Python代码进行模型测试,效果如下:

验证Python代码如下:

import numpy as np
import cv2
face_cascade = cv2.CascadeClassifier('cascade.xml')
cap = cv2.VideoCapture(0)
while True:ret,img = cap.read()gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(gray, 1.3, 5)for (x,y,w,h) in faces:cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)cv2.imshow('img',img)       if cv2.waitKey(1) &0xFF == ord('q'):break
cap.release()
cv2.destroyAllWindows()

最后我将模型搭建在树莓派上,发现识别效果,处理速度还是蛮不错的。

Python+OpenCV创建级联文件(Windows7/10环境)相关推荐

  1. Python+OpenCV:级联分类器(Cascade Classifier)

    Python+OpenCV:级联分类器(Cascade Classifier) 目标 We will learn how the Haar cascade object detection works ...

  2. python如何创建一个文件夹_利用Python怎么创建一个文件夹

    利用Python怎么创建一个文件夹 发布时间:2020-12-08 14:48:04 来源:亿速云 阅读:91 作者:Leah 这期内容当中小编将会给大家带来有关利用Python怎么创建一个文件夹,文 ...

  3. Python新建一个文件目录,python怎么创建新文件

    python怎么创建新文件 首先,进行打开的pycharm软件界面当中,进行选中已经打开的项目文件.请点击输入图片描述然后进行点击菜单中的"file"的选项菜单. 请点击输入图片描 ...

  4. Python OpenCV 批量修改文件夹内所有图片的尺寸

    Python OpenCV 批量修改文件夹内所有图片的尺寸 简述 插件 遍历所有文件(包括子文件) 缩放图片尺寸并保存图片 遍历并修改图片 简述 遍历文件夹下的所有子文件(包括自文件夹内的)的图片批量 ...

  5. 在python中创建Excel文件并写入数据

    来源:<在python中创建Excel文件并写入数据> python中的包xlwt和xlsxwriter都是比较方便创建excel文件并写入数据的. xlwt中: 通过xlwt.Workb ...

  6. Python如何创建kv文件

    Python如何创建kv文件 学习Python+kivy模块软件开发,有很多初学者都不知道kv文件怎么创建. 我教你一个简单的代码创建kv文件,直接用with写入创建. with open('Box. ...

  7. python如何创建excel文件_Python xlrd/xlwt 创建excel文件及常用操作

    一.创建excel代码 备注:封装好了(可直接调用) """ -*- coding:utf-8 -*- @Time :2020/8/20 21:02 @Author :J ...

  8. python怎么创建txt文件夹_python怎么创建一个txt文件/python创建文件夹基础教程

    python怎么创建一个txt文件 python怎么创建一个txt文方法. 如考: 1.首先内置的空闲编辑器进行编辑(单击并选择copy),如下图所示. 2.您可以下载记事本和其他编辑软件,以支持多种 ...

  9. python怎么创建txt文件啊_python根据txt文本批量创建文件夹

    前言 前言:想写这个代码的原因是因为实习的时候需要根据表格名创建对应的文件夹,如果只是很少个数文件夹的话,ctrl+shift+n还可以接受吧,可是一次就要创建几百个文件夹,这就有点方方了.所以我写了 ...

最新文章

  1. 后浪来袭!拼多多黄峥身价超过马云,成为中国第二大富豪
  2. python turtle画彩虹-Python基础实例——绘制彩虹(turtle库的应用)
  3. 转:ibatis动态sql
  4. Cacti监控一台Webserver上多个Tomcatport的实现
  5. 服务器与客户端的文件传输报告,网络文件传输设计报告.doc
  6. 关于ListView的作业
  7. Linux中重定向及管道,Linux中重定向及管道
  8. 矩阵加法(信息学奥赛一本通-T1124)
  9. Windows内存映射步骤
  10. sql azure 语法_Azure Kubernetes服务(AKS)中SQL Server
  11. AI技术已经如此逆天了,该有时间学学AI了
  12. 小网站静态资源CDN加速实践记录
  13. 计算机识别人脸原理,人脸识别:原理、方法与技术
  14. 不同shp图层合在一起_ps怎么把别的图层的合到一起
  15. Reflex WMS中阶系列1 – Reflex WMS系统打印单据,是打印成PDF还是直接从打印机里打印出来?
  16. 硬盘分区文件系统成raw格式,无法打开访问
  17. AI病毒来袭,拿什么拯救你我的电脑?
  18. 文件怎么设置密码?一文带你看到文件加密的方法
  19. ISP(图像信号处理)之——坏点校正
  20. Android Window悬浮窗窗口全屏(隐藏导航栏状态栏)

热门文章

  1. struct.error: ushort format requires 0 <= number <= 0xffff
  2. Thread start()方法和run()方法的区别
  3. Android shape 绘制左右 或者上下的渐变色
  4. java.lang.IllegalStateException: Cannot modify managed objects outside of a write transaction. in /U
  5. idea 搭建spring boot 项目
  6. Unknown host 'android.oa.com'. You may need to adjust the proxy settings in Gradle.
  7. Java基于Quartz的定时任务调度服务(一)
  8. Jenkins实现SVN+Maven+Java项目的持续集成
  9. 4.MySQL连接并选择数据库(SQL C)
  10. Android——学习:线性布局权重分配