opencv 训练分类器(opencv_traincascade和opencv_createsamples)

  • 使用opencv_traincascade和opencv_createsamples生成自己的训练文件并进行训练
    opencv_createsamples.exe#生成 训练集的vec文件
opencv_createsamples.exe -info posdata -vec data\pos.vec -num 你所需要创建的正样本数量(一般为正样本内文件数目的0.9倍) -w 20 -h 20
    首先需要建立包含所有图片目录的文件(正负样本各一个),eg:

pos.txt  (负样本为neg.txt)

opencv 训练分类器(opencv_traincascade和opencv_createsamples)

然后修改为
    opencv 训练分类器(opencv_traincascade和opencv_createsamples)

#利用文本编辑器的 查找替换 jpg 为 1 0 0 20 20   ,1为标记,0 0 20 20 为样本中所需物品的坐标,因为我是一张图片就是一个物品,而且图片为20*20像素,所以直接批量替换为 0 0 20(width) 20(height) ,

opencv_traincascade.exe #训练分类器
opencv_traincascade.exe -data data1 -vec data\pos.vec -bg 64negdata numPos 243 -numNeg 300 -minHitRate 0.9999 -maxFalseAlarmRate 0.5 -featureType HA

通用参数:

-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 cv2
     
    mouse_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.html
    mouse = 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) & 0xff
    if key == 27:
    break
     
    cam.release()
    cv2.destroyAllWindows()