opencv 训练分类器

环境

环境:opencv-3.4,python,c++
方法:opencv_createsamples,opencv_traincascade,haar特征或者lbp特征+cascade分类器

注意点

训练集分为正样本,负样本,样本全部为灰度图片,正样本图片尺寸需要固定,一般40*40左右即可,大了电脑跑不动,负样本尺寸不固定,负样本数量要比正样本多才行,少了有问题。

建议:正样本图片尺寸尽量小一些,并且进行归一化然后灰度处理,检测物体距离边界近一些,背景尽量是纯色,少夹杂一些颜色,突出被检测物体。

数量:正样本 : 负样本=1 : 3 这个比例在OpenCv官网有一个更精准的说法,最大是1 : 3,负样本大于正样本,这样可以保证训练过程中负样本不会因为太少而终止训练。

正负样本

正样本

59

负样本

60

处理正样本

处理样本,灰度化

import cv2
import os


def findAllFile(base):
    for root, ds, fs in os.walk(base):
        for f in fs:
            print("file :" + f)
            yield f


def toGray(path,path_gray):
    for i in findAllFile(path):
        img_gray = cv2.imread(path+i, cv2.IMREAD_GRAYSCALE)
        img_gray = cv2.resize(img_gray, (50, 50))
        try:
            cv2.imwrite(path_gray + i, img_gray)
            print("to gray:" + path_gray + i)
        except Exception as e:
            print (e)


if __name__ == '__main__':
    path = "/share/positive/"
    path_gray = "/share/positive_gray/"
    toGray(path,path_gray)

处理负样本

跟正样本相同修改一下文件夹,并把resize去掉即可

生成描述文件

正样本负样本
import os
def create_pos_info():
    path = "/share/positive_gray"
    for img in os.listdir(path):
        line = path + '/' + img + ' 1 0 0 50 50\n'
        with open('pos.txt', 'a') as f:
            f.write(line)

def create_neg_info():
    path = "/share/negative_gray"
    for img in os.listdir(path):
        line = path + '/' + img + '\n'
        with open('neg.txt', 'a') as f:
            f.write(line)

if __name__ == '__main__':
    create_pos_info()
    create_neg_info()
pos.txt
/share/positive_gray/388.jpg 1 0 0 50 50
/share/positive_gray/509.jpg 1 0 0 50 50
/share/positive_gray/460.jpg 1 0 0 50 50
/share/positive_gray/265.jpg 1 0 0 50 50
/share/positive_gray/137.jpg 1 0 0 50 50
/share/positive_gray/646.jpg 1 0 0 50 50
/share/positive_gray/755.jpg 1 0 0 50 50
/share/positive_gray/478.jpg 1 0 0 50 50
/share/positive_gray/757.jpg 1 0 0 50 50
/share/positive_gray/224.jpg 1 0 0 50 50
/share/positive_gray/314.jpg 1 0 0 50 50
/share/positive_gray/71.jpg 1 0 0 50 50
/share/positive_gray/188.jpg 1 0 0 50 50
/share/positive_gray/84.jpg 1 0 0 50 50
/share/positive_gray/640.jpg 1 0 0 50 50
/share/positive_gray/48.jpg 1 0 0 50 50
/share/positive_gray/655.jpg 1 0 0 50 50
/share/positive_gray/63.jpg 1 0 0 50 50


neg.txt
/share/negative_gray/1066.jpg
/share/negative_gray/314.jpg
/share/negative_gray/860.jpg
/share/negative_gray/912.jpg
/share/negative_gray/71.jpg
/share/negative_gray/188.jpg
/share/negative_gray/84.jpg
/share/negative_gray/640.jpg
/share/negative_gray/874.jpg
/share/negative_gray/48.jpg
/share/negative_gray/1028.jpg
/share/negative_gray/1688.jpg
/share/negative_gray/1439.jpg
/share/negative_gray/854.jpg
/share/negative_gray/655.jpg
/share/negative_gray/890.jpg
/share/negative_gray/951.jpg
/share/negative_gray/63.jpg

合成正样本vec

pencv_createsamples用于处理生成样本,opencv_traincascade用于训练分类器。

opencv_createsamples -vec pos.vec -info pos.txt -bg neg.txt -num 700 -w 50 -h 50

-num:的只要小于或等于正样本的指

训练分类器

opencv_traincascade -data classifier -vec pos.vec -bg neg.txt   -numStages 20 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -numPos 595   -numNeg 2000 -w 50 -h 50 -mode ALL -precalcValBufSize 1024   -precalcIdxBufSize 1024 -featureType LBP
pause

61

-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
-h
训练样本的尺寸(单位为像素)。必须跟训练样本创建(使用 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_ratenumber_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度旋转特征。

注意

报错:parse errorDone.Created 0 Samples!

原因文件名中含有空格

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×