本文下载地址:https://mp.csdn.net/mp_download/manage/download/UpDetailed
一、简介
使用opencv_traincascade 分类器的训练模型包括两个主要阶段:于HAAR或LBP模型的训练阶段和检测阶段。本文档概述了训练自己的弱分类器的级联所需的功能。当前指南将逐步完成所有不同阶段:收集训练数据,准备训练数据并执行实际模型训练。
与Haar特征相比,LBP特征是整数特征,训练和检测过程都会比Haar特征快几倍。LBP和Haar特征用于检测的准确率,是依赖训练过程中的训练数据的质量和训练参数。同等正负样本的情况下,Haar特征能比LBP特征效果更好
将使用几个官方的OpenCV应用程序:opencv_createsamples,opencv_annotation,opencv_traincascade和opencv_visualisation。
二、准备训练数据
训练需要一些样本。样本分两类:负样本和正样本。负样本是指不包括物体的图像。正样本是待检测的物体的图像。负样本必须手工准备,正样本可以使用 opencv_createsamples 创建
1、收集正样本
2、收集负样本
负样本可以是任意图像,但是这些图像中不能包含待检测的物体。用于抠取负样本的图像文件名被列在一个文件中。这个文件是纯文本文件,每行是一个文件名(包括相对目录和文件名)。负样本和样本图像也叫做背景样本,或者背景样本图像,本文档中对之不予区分。这些图像可以是不同的尺寸,但是图像尺寸应该比训练窗口的尺寸大,因为这些图像将被用于抠取负样本,并将负样本缩小到训练窗口大小。
三、处理样本
注意事项
1、正样本要resize成统一大小,负样本不需要resize
2、负样本的数量最好要超过正样本的数据
3、opencv_createsamples从正样本集创建训练样本时,-w和-h的参数代表要检测的滑动窗口大小,不一定是正样本的图像大小。
4、-w和-h两个参数对最后训练得到的xml的检测效果有较大的影响。因此实验时-w和-h两个参数的值可以多尝试。
5、有些人可能需要用HOG特征,但OpenCV 3.x以上的cascade版本不支持HOG特征检测,如果要用HOG特征,可以采用2.4.x的版本。
6、对于车辆检测,LBP的效果不比HAAR的差,而且训练速度快。
1、处理正样本
正样本调整统一大小的灰度图像保存
2、负样本不需要处理
三、生成描述文件
1、正样本pos.txt文件
2、负样本neg.txt文件
四、准备训练分类器
1、下载训练分类器
下载地址:python-opencvHaarLBP级联分类器下载,训练模型-机器学习文档类资源-CSDN文库
2、生成正样本pos.vec文件
opencv_createsamples.exe -vec posTSize.vec -info posTSize.txt -num 1000 -w 24 -h 23
五、训练模型,生成xml级联分类器
1、训练
opencv_traincascade.exe -data xmlHaar10 -vec posTSize.vec -bg negG.txt -numPos 1000 -numNeg 2888 -numStages 10 -w 24 -h 23 -minHitRate 0.999 -maxFalseAlarmRate 0.2 -weightTrimRate 0.95 -precalcValBufSize 3072 -precalcIdxBufSize 3072 -featureType Haar
通用参数解释:
-data <cascade_dir_name>
目录名,如不存在训练程序会创建它,用于存放训练好的分类器。
-vec <vec_file_name>
包含正样本的vec文件名(由 opencv_createsamples 程序生成)。
-bg <background_file_name>
背景描述文件,也就是包含负样本文件名的那个描述文件。
-numPos <number_of_positive_samples>
每级分类器训练时所用的正样本数目。其指设置为正样本数量的85%(这是一个保守值)。具体的也要根据级联器的层数来决定的。因为每个stages都是会增加图片数量来进行分类。
-numNeg <number_of_negative_samples>
每级分类器训练时所用的负样本数目,可以大于 -bg 指定的图片数目。
-numStages <number_of_stages>
训练的分类器的级数。
-precalcValBufSize <precalculated_vals_buffer_size_in_Mb>
缓存大小,用于存储预先计算的特征值(feature values),单位为MB。
-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb>
缓存大小,用于存储预先计算的特征索引(feature indices),单位为MB。内存越大,训练时间越短。
-baseFormatSave
这个参数仅在使用Haar特征时有效。如果指定这个参数,那么级联分类器将以老的格式存储。
级联参数:
-stageType <BOOST(default)>
级别(stage)参数。目前只支持将BOOST分类器作为级别的类型。
-featureType<{HAAR(default), LBP}>
特征的类型: HAAR - 类Haar特征; LBP - 局部纹理模式特征。
-w <sampleWidth>
-h <sampleHeight>
训练样本的尺寸(单位为像素)。必须跟训练样本创建(使用 opencv_createsamples 程序创建)时的尺寸保持一致。
Boosted分类器参数:
-bt <{DAB, RAB, LB, GAB(default)}>
Boosted分类器的类型: DAB - Discrete AdaBoost, RAB - Real AdaBoost, LB - LogitBoost, GAB - Gentle AdaBoost。
-minHitRate <min_hit_rate>
分类器的每一级希望得到的最小检测率。总的检测率大约为 min_hit_rate^number_of_stages。总检测率即为整个级联器的检测召回率,
-maxFalseAlarmRate <max_false_alarm_rate>
分类器的每一级希望得到的最大误检率。总的误检率大约为 max_false_alarm_rate^number_of_stages. 为整个级联器的误检率
-weightTrimRate <weight_trim_rate>
Specifies whether trimming should be used and its weight. 一个还不错的数值是0.95。
-maxDepth <max_depth_of_weak_tree>
弱分类器树最大的深度。一个还不错的数值是1,是二叉树(stumps)。
-maxWeakCount <max_weak_tree_count>
每一级中的弱分类器的最大数目。The boosted classifier (stage) will have so many weak trees (<=maxWeakCount), as needed to achieve the given -maxFalseAlarmRate.
类Haar特征参数:
-mode <BASIC (default) | CORE | ALL>
选择训练过程中使用的Haar特征的类型。 BASIC 只使用右上特征, ALL 使用所有右上特征和45度旋转特征。
2、训练结束结果
注意:由于是10stages,所以训练时间长些,其中采用LBP特征会比Haar特征快十几倍的训练速度。还有如果想把检测准确度提高很高,则需要大量的样本和好的图像质量。
3、异常中断处理
中断后,我们可以接着创建的层数,继续训练,需要修改训练指令的【-numStages】将其设置成已有的states的层数,则其则会生成上面的检测文件xml。
六、视频跟踪、识别
import cv2
import random
import time
#打开摄像头 截图保存
caputer=cv2.VideoCapture('D:/openCVImage/video/video.mp4')
handCascade = cv2.CascadeClassifier("D:/openCVImage/tupiantemp/20220250903/xmlHaar1259/cascade.xml")
while True:
ret, frame = caputer.read()
if ret == True:
rect = handCascade.detectMultiScale(gray, scaleFactor=1.15)
if len(rect)>0 and rect is not None:
x, y, w, h = rect[0][0],rect[0][1],rect[0][2],rect[0][3]
randint = random.randint(0, 1000000)
timeit=time.time()
randstr = str(randint) + "_"+str(timeit)
x1 = x+int(round(w/6))
y1 = y + int(round(h / 6))
w1=w-int(round(w/3))
h1 = h - int(round(h / 3))
cv2.rectangle(frame, (x1, y1), (x1 + w1, y1 + h1), (0, 0, 255), 2) # 框
#cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 0, 255), 2) # 框
strContent=str(x1)+','+str(y1)+','+str(w1)+',' +str(h1)
cv2.putText(frame, str(strContent), (x1, y1 - 6), cv2.FONT_HERSHEY_TRIPLEX, 0.5, (0, 0, 255), 1)
cv2.imshow("20220129223", frame)
key = cv2.waitKey(1)
if key == 27:
break
caputer.release()
cv2.destroyAllWindows()
更多实例请关注作者csdn其它文章
源码,素材打包下载:上传明细-CSDN博客
QQ交流小群:856044792