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

简介: Python+OpenCV创建级联文件(Windows7/10环境)


目录

1、搭建环境


2、准备数据集


3、训练级联文件


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


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


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


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


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


4、训练xml文件。


1、搭建环境

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


image.png


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

image.png



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


image.png


2、准备数据集

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


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


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

正样本图片如下:

image.png

负样本图片如下:


image.png


为了操作方便,我写了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 = 0
        for 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 + 1
                except :
                    continue
        print ('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、首先按照要求创建训练文件夹

image.png



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


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


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


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


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


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


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


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


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


文件夹结构如下:

image.png



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


image.png


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

image.png



生成对应的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即为运行成功。


此时文件夹结构如下:

image.png



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。


此时文件夹结构如下:


image.png


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


image.png


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


image.png


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


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


image.png


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

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


相关文章
|
5月前
|
数据可视化 Linux iOS开发
Python脚本转EXE文件实战指南:从原理到操作全解析
本教程详解如何将Python脚本打包为EXE文件,涵盖PyInstaller、auto-py-to-exe和cx_Freeze三种工具,包含实战案例与常见问题解决方案,助你轻松发布独立运行的Python程序。
1487 2
|
4月前
|
监控 机器人 编译器
如何将python代码打包成exe文件---PyInstaller打包之神
PyInstaller可将Python程序打包为独立可执行文件,无需用户安装Python环境。它自动分析代码依赖,整合解释器、库及资源,支持一键生成exe,方便分发。使用pip安装后,通过简单命令即可完成打包,适合各类项目部署。
937 68
|
4月前
|
Ubuntu 编译器 计算机视觉
Ubuntu 20.04环境下无法找到#include<opencv/cv.h>文件 - 解决方案。
希望这些信息能帮助你解决遇到的问题。
322 10
|
6月前
|
缓存 数据可视化 Linux
Python文件/目录比较实战:排除特定类型的实用技巧
本文通过四个实战案例,详解如何使用Python比较目录差异并灵活排除特定文件,涵盖基础比较、大文件处理、跨平台适配与可视化报告生成,助力开发者高效完成目录同步与数据校验任务。
234 0
|
7月前
|
编译器 Python
如何利用Python批量重命名PDF文件
本文介绍了如何使用Python提取PDF内容并用于文件重命名。通过安装Python环境、PyCharm编译器及Jupyter Notebook,结合tabula库实现PDF数据读取与处理,并提供代码示例与参考文献。
|
7月前
|
编译器 Python
如何利用Python批量重命名文件
本文介绍了如何使用Python和PyCharm对文件进行批量重命名,包括文件名前后互换、按特定字符调整顺序等实用技巧,并提供了完整代码示例。同时推荐了第三方工具Bulk Rename Utility,便于无需编程实现高效重命名。适用于需要处理大量文件命名的场景,提升工作效率。
|
9月前
|
人工智能 安全 Shell
Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程
Jupyter MCP服务器基于模型上下文协议(MCP),实现大型语言模型与Jupyter环境的无缝集成。它通过标准化接口,让AI模型安全访问和操作Jupyter核心组件,如内核、文件系统和终端。本文深入解析其技术架构、功能特性及部署方法。MCP服务器解决了传统AI模型缺乏实时上下文感知的问题,支持代码执行、变量状态获取、文件管理等功能,提升编程效率。同时,严格的权限控制确保了安全性。作为智能化交互工具,Jupyter MCP为动态计算环境与AI模型之间搭建了高效桥梁。
654 2
Jupyter MCP服务器部署实战:AI模型与Python环境无缝集成教程
|
8月前
|
编解码 Prometheus Java
当Python同时操作1000个文件时,为什么你的CPU只用了10%?
本文介绍如何构建一个高效的文件处理系统,解决单线程效率低、多线程易崩溃的矛盾。通过异步队列与多线程池结合,实现任务调度优化,提升I/O密集型操作的性能。
201 4
|
9月前
|
Python
在VScode环境下配置Python环境的方法
经过上述步骤,你的VSCode环境就已经配置好了。请尽情享受这扇你为自己开启的知识之窗。如同你在冒险世界中前行,你的探索之路只有越走越广,你获得的知识只会越来越丰富,你的能力只会越来越强。
900 37
|
7月前
|
安全 Linux 网络安全
Python极速搭建局域网文件共享服务器:一行命令实现HTTPS安全传输
本文介绍如何利用Python的http.server模块,通过一行命令快速搭建支持HTTPS的安全文件下载服务器,无需第三方工具,3分钟部署,保障局域网文件共享的隐私与安全。
1826 0

热门文章

最新文章

推荐镜像

更多