OpenCV:级联分类器的训练

一、准备知识

网上其它教程训练分类器所采用的是基于opencv2.x中的open_haartraining.exe,为训练haar特征的分类器,现在新版本已被弃用;

因此本文的级联分类器是基于OpenCV3.x版本制作,所用程序为opencv_traincascade.exe和opencv_createsamples.exe。

1、opencv_traincascade.exe(生成正样本描述文件的可执行程序)

OpenCV3.x版本没有open_haartraining.exe,而是加强了opencv_traincascade.exe的功能,是可训练haar、hog、lbp等多种特征的分类器

2、opencv_traincascade.exe(训练样本的可执行程序)

opencv_createsamples.exe用来准备训练用的正样本数据和测试数据。该程序能够生成能被opencv_haartraining和opencv_traincascade程序支持的正样本数据。它会输出以 *.vec 为扩展名的文件,该文件以二进制方式存储图像。

3、其它准备文件

xml:用于存放训练好的分类器的参数,这个文件夹不是自带的,先创建空文件夹
negdata:存放负样本的文件夹,这个文件不是自带的,需要创建
posdata:存放正样本的文件夹,这个文件不是自带的,需要创建
negdata.txt:负样本的文件路径,这个文件不是自带的,先在negdata文件夹中创建
posdata.txt:正样本的文件路径,这个文件不是自带的,先在posdata文件夹中创建


二、准备训练数据

1、正样本和负样本

1.1、正样本

保证正样本图片的分辨率大小一致(最好为官方推荐的20x20,不易过大),并且按顺序编号,存放在posdata文件夹中

在待检测是人脸的情况下,需要几百甚至几千个正样本,考虑所有的人种、年龄、表情甚至胡子的样式。保证整张图都只有脸,否则训练效果会很差。

在待检测是物体的情况下,如果只有一张包含物体的图像,如一个公司的标志,那么可以通过对物体图像的随机旋转、改变标志亮度以及将标志放在任意的背景上而获得大量的正样本。

1.2、负样本

负样本可以是任意图像,但要保证分辨率和正样本一致,并且这些图像中不能包含待检测的物体。按顺序编号。存放在negdata文件夹中

负样本的尺寸必须大于等于正样本的尺寸。

负样本的数量必须大于正样本的数量。比例的多少会影响大训练效果,具体需要怎样的比例需要自己把控,但负样本过少会出现错误。

2、制作训练数据集

2.1、正样本集

修改posdata文件夹中的posdata.txt文本的内容为

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

 将posdata.txt的后缀改为bat,即posdata.bat。双击运行,生成num.txt文本。

 

 打开num.txt,按Ctrl+h批量修改替换两处内容:("1 0 0 204 285"中的204、285为图片的宽和高,根据自己的样本大小填写)

修改后为

将num.txt改回为posdata.txt,由于文件中指出的位置是相对路径,所以需要移动到与exe程序同级的文件夹内

2.2、 负样本集

前面采用与2.1正样本集的相同步骤,得到num.txt

这里需要注意的是, 生成之后,负样本的绝对路径不用改为相对路径,也不需要在最后加1 0 0 64 64,内容保持原样即可。

将名字改回为negdata.txt,移动到与exe程序同级的文件夹内

 


三、生成正样本描述文件 

(提前注意,复制粘贴时,代码前不要有空格 ,不然无法执行)

 打开电脑的cmd命令指示符,输入exe所在的文件夹(以本人的为例)

cd C:\Users\JAY\Desktop\OpenCV_train

 再输入以下内容(num后是正样本数,w和h代表样本图片的大小)

opencv_createsamples.exe -info posdata.txt -vec pos.vec -num 66 -w 20 -h 20

 生成的正样本描述文件pos.vec


四、 训练样本分类器

(提前注意,保证负样本分辨率和正样本一致,否则会报错)

 打开电脑的cmd命令指示符,输入exe所在的文件夹(以本人的为例)

cd C:\Users\JAY\Desktop\OpenCV_train

再继续输入以下内容(numPos后是正样本数,numNeg后是负样本数,w和h代表样本图片的大小) 

opencv_traincascade.exe -data xml -vec pos.vec -bg negdata.txt -numPos 66 -numNeg 200 numStages 20 -featureType LBP -w 20 -h 20

开始训练(保持xml文件夹是一个空文件夹,否则会报错)

 

训练好之后(会迭代很多轮,直到达到阈值或者训练完二十轮),在xml文件夹中找到名为cascade.xml的文件,这就是训练好的分类器。 

完成!!! 

ps:本文样本数量过少,主要是做个教程,最好以千为数量级,识别效果才好

其它错误,参考https://blog.csdn.net/u010402786/article/details/52298833

五、调用

在unity里调用,参考https://blog.csdn.net/weixin_42872122/article/details/103232865 

 六、参考文献

https://www.jianshu.com/p/17d7d4700df2

http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/user_guide/ug_traincascade.html

https://blog.csdn.net/qq_32502511/article/details/79010509

https://blog.csdn.net/coulson_zhao/article/details/80980408

https://blog.csdn.net/nienelong3319/article/details/79287546

 

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python对于OpenCV分类训练非常方便,可以通过几个简单的步骤,轻松地完成自己的XML文件训练。 第一步是准备训练数据集。训练集应该包括正面和负面的例子,正面的例子是要识别的目标,负面的例子则是不包含目标的图像。 第二步是进行数据预处理。这包括将图像转换为灰度图像,以及对其进行缩小和正规化。这样有助于提高分类的准确性和效率。 第三步是使用OpenCV提供的Cascade Trainer GUI工具进行分类训练。这个工具可以通过交互式界面来设置训练参数,例如正负样本的路径、级深度、检测窗口大小等等。训练完成后,级分类就会在指定的.xml文件中保存。 第四步是使用训练好的分类进行目标检测。可以使用OpenCV提供的Cascade Classifier类来加载分类文件,并应用于图像或视频数据。这个类可以方便地进行级分类的检测和识别。 总的来说,Python对于OpenCV分类训练和应用非常方便和灵活,可以应用于许多实际场景中,如人脸识别、车辆检测等。需要注意的是,训练过程需要耗费大量的计算资源和时间,因此应该选择适当的硬件设备和训练数据集,以获得更好的效果。 ### 回答2: Python对OpenCV的级分类训练可以实现自己的XML文件。级分类是一种基于机学习的图像识别技术,主要用于目标分类、物体检测等。OpenCV是一个开源的计算机视觉库,提供了丰富的图像和视频处理功能。Python是一种高级编程语言,通常用于数据分析和人工智能领域。 Python对OpenCV的级分类训练可以通过以下步骤实现: 1. 收集样本数据:首先需要收集足够多的正负样本数据,正样本用于训练模型,负样本用于补充训练,提高模型准确率。 2. 特征提取:使用OpenCV中的Haar特征进行图像特征提取,以此确定图像中是否存在目标物体。Haar特征是基于图像亮度和对比度变化的一种特征表示方法。 3. 训练模型:使用Python对OpenCV中的级分类进行训练,根据样本数据和特征提取结果,训练模型,并反复迭代优化。 4. 测试模型:完成模型训练后,需要对模型进行测试,验证其在测试数据集中的准确率。 5. 生成XML文件:当训练好了模型后,需要将其保存为XML文件。XML文件包含了训练好的模型参数,可以通过OpenCV的CascadeClassifier类进行加载和应用。 总的来说,Python对OpenCV的级分类训练可以帮助用户创建自己的图像识别模型,并将其保存为XML文件,以便后续应用。该技术具有广泛的应用场景,例如人脸识别、车牌识别、物体检测等。 ### 回答3: Python对OpenCV的级分类训练,可以通过利用分类训练工具Cascade Trainer GUI和HaarTraining.exe,在windows或者Linux/Mac OS系统下进行相关操作,实现自己的级分类训练,生成属于自己的xml文件。 通过一系列的步骤操作,可以在OpenCV中准确地训练一个线性分类。首先,需要进行正样本的收集,这些正样本应该是需要被检测的目标,比如人脸等等。其次,需要进行负样本的收集,这些负样本应该是和目标无关的固定的图像。然后,需要根据正负样本进行训练,选择合适的参数和特征,应用级分类,并进行训练,最终训练出一个能够准确判断图像中是否包含目标的级分类。最后,生成与自己训练的级分类相匹配的XML文件,该XML文件中包含了训练好的特征和参数,可以被导入到其他项目中进行相似的目标检测。 利用级分类进行图像检测,可以帮助我们提高检测的准确度和效率。它在训练时,能够自动选择极具区分性的特征来提高处置速度,达到更好的检测效果。 总之,Python对OpenCV的级分类训练,可以根据需要的检测目标,利用相应的工具和步骤,进行训练和生成相应的XML文件。这种方法能够有效地解决图像目标检测的问题,提高识别的准确度和效率,并具有广泛的应用价值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值