opencv 训练分类器(opencv_traincascade和opencv_createsamples)
- 使用opencv_traincascade和opencv_createsamples生成自己的训练文件并进行训练
pos.txt (负样本为neg.txt)
#利用文本编辑器的 查找替换 jpg 为 1 0 0 20 20 ,1为标记,0 0 20 20 为样本中所需物品的坐标,因为我是一张图片就是一个物品,而且图片为20*20像素,所以直接批量替换为 0 0 20(width) 20(height) ,
opencv_traincascade.exe #训练分类器通用参数:
-data<cascade_dir_name>
目录名,如不存在训练程序会创建它,用于存放训练好的分类器
-vec<vec_file_name>
包含正样本的vec文件名(由 opencv_createsamples 程序生成)
-bg<background_file_name>
背景描述文件,也就是包含负样本文件名的那个描述文件
-numPos<number_of_positive_samples>
每级分类器训练时所用的正样本数目
-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。可以设很高,如0.999
-maxFalseAlarmRate<max_false_alarm_rate>
分类器的每一级希望得到的最大误检率(负样本被判成正样本的比例)。总的误检率大约为 max_false_alarm_rate^number_of_stages。可以设较低,如0.5
-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度旋转特征
- 生成XML文件在data(自己设置的文件目录)
- 测试分类器
-
import cv2mouse_haar = cv2.CascadeClassifier("data/cascade.xml")cam = cv2.VideoCapture(0)while True:_, img = cam.read()gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#http://docs.opencv.org/2.4/modules/objdetect/doc/cascade_classification.htmlmouse = mouse_haar.detectMultiScale(gray_img, 1.2, 3) # 调整参数for mouse_x,mouse_y,mouse_w,mouse_h in mouse:cv2.rectangle(img, (mouse_x, mouse_y), (mouse_x+mouse_w, mouse_y+mouse_h), (0,255,0), 2)cv2.imshow('img', img)key = cv2.waitKey(30) & 0xffif key == 27:breakcam.release()cv2.destroyAllWindows()