opencv学习记录(一)——训练&分类方法(Adaboost、svm)

一、Adaboost

1、准备工作:
             建立训练样本库
             正样本:行人图像,需统一尺寸
             负样本:不包含行人影像的任意图像,不需统一尺寸

2、Training主要步驟:
             载入训练样本
             初始化样本权重
             截取训练样本的Haar feature
             并比对测试样本的Haar feature
             根据比对结果调整样本权重(自适应)
             增加分类错误的样本权重
             检查分类器效能是否达到指定目标有则完成训练。反之,重覆步骤三及步骤四

 过程(linux)

a、找样本库         b、建立描述文件info.txt        c、使用opencv_createsamples转为info.vec   d、训练

 

          样本库samples / pos、nes为所创建的正负样本文件夹.

$cd samples           

$vim create_info.sh

            #!/bin/bash  #生成正负样本描述文件;正样本格式;:  .jpg 目标数量 x0 y0 width hight;eg:  pos/006.jpg 1 0 0 45 78
            find pos -name '*.jpg' -exec identify -format '%i 1 0 0 %w %h\n' \{\} \; > pos_info.txt
            find neg -name '*.jpg' > neg_info.txt    
                    

$chmod 777 create_info.sh    #给权限

$./create_info.sh

        注意:在运行之前先在pos/neg目录下 :$ls -a              $rm -fr .* 删除隐藏文件

        执行以下脚本使用opencv_createsamples转为 .vec

$opencv_createsamples -vec pos.vec -info ./pos_info.txt -num 324 -w 14 -h 28 -mem 1024 -nonsym
        #创建vec文件,num 324代表规范样本为宽14 高28

        说明:出现./pos_info.txt(1) : parse errorDone. Created 0 samples可能是格式不对。出现Create training samples from images  collection...Done. Created 324 samples则生成成功。

         样本库建立完成!

$opencv_haartraining -data output -vec pos.vec -bg neg_info.txt -npos 30 -nneg 70 -nstages 16 -w 14 -h 28 -mem 1024 -nonsym               #开始训练,等就完事了

            说明:-npos 30 -nneg 170 -nstage 16 -w 14 -h 28 -mem 1024   每次正样本30,负样本170,训练16层。output中有每次训练的信息。更详细的解释参考https://blog.csdn.net/yangleo1987/article/details/52883864。

-data:           指定生成的文件目录(将来存放各级分类的地方)

-vec:           样本描述文件
-bg              负样本描述文件名称,就是负样本的路径列表
-nstage 20       指定训练层数,推荐15~20,层数越高,耗时越长。
-nsplits         分裂子节点数目,选取默认值 2 , 1表示使用简单的stump classfier分类
-minhitrate      最小命中率,即训练目标准确度。
-maxfalsealarm   最大虚警(误检率),每一层训练到这个值小于0.5时训练结束,进入下一层训练
-npos            在每个阶段用来训练的正样本数目
-nneg            在每个阶段用来训练的负样本数目
-mode:          all指定haar特征的种类,basic仅仅使用垂直特征,all表示使用垂直以及45度旋转特征
-sym或者-nonsym:后面不用跟其他参数,用于指定目标对象是否垂直对称,若你的对象是垂直对称的,比如脸,则垂直对称有利于提高训练速度

-mem:           表示允许使用计算机的1280M内存

           注意:如下图训练到第十二层之后再也没有反应了。 这是由于FA值(虚误差值)已经达到0, 没有负样本能够进入下一层进行训练。参考http://blog.chinaunix.net/uid-7608308-id-2048365.html。

opencv学习记录(一)——训练&分类方法(Adaboost、svm)_第1张图片

 

opencv学习记录(一)——训练&分类方法(Adaboost、svm)_第2张图片

   解决方法 :

(1)先停止训练,增加并更新负样本,继续训练。

(2)减小参数nstages 到12层,重新运行(如果减少到小于已生成层数会报错,需要重新训练)。nstages缺省值为14,很多人样本到不了这么多,就会导致死循环了。

 (3)原理同二,不用重新训练。直接利用convert_cascade生成xml文件。参考https://blog.csdn.net/u010603823/article/details/52557760 。        convert_cascade.c  在路径/home/jiang/opencv/opencv-2.4.10/samples/c中,怎么用有时间再研究一下。

 

遇到问题:traincascade's error (Required leaf false alarm rate achieved. Branch training terminated.)

解析:虚警率已经达标 不再继续训练 ,这里不能说是一个错误,只能说制作出来的xml文件可能较差

解决办法:先测试一下生成的output.xml,如果效果没有达到你的预期,有以下几个解决方案:
1:maxfalsealarm值应该设定到0.4 - 0.5之间
2:正负样本数太少,增大样本数

-minhitrate      最小命中率,即训练目标准确度。
-maxfalsealarm   最大虚警(误检率),每一层训练到这个值小于0.5时训练结束,进入下一层训练

 

windows  opencv3.4.4 (2020.3.1更新)

1、安装opencv3.4.4

  1.  下载 链接,下载.exe,安装即可
  2.  环境变量添加    C:\usr\opencv\opencv\build\x64\vc14\bin ;C:\usr\opencv\opencv\build\x64\vc14\binopencv学习记录(一)——训练&分类方法(Adaboost、svm)_第3张图片

 

2、数据准备

3、adaboost训练阶段

  • 先进行pos、neg文件夹描述文件生成:

      以下的处理过程都是在命令行下进行的在计算机【开始】里面输入“cmd”就可以进入命令行

    然后进入你刚才新建的包含以上样本的文件夹下 ,“cd 你复制的文件地址”如

    cd C:\Users\76002\Desktop\get_samples

     

          新建下面的py脚本并运行。

    # -*- coding: utf-8
    import  sys
    import  os
    
    # 遍历文件夹
    def walkFile(file):
        for root, dirs, files in os.walk(file):
    
            ff = open(root+'.txt','a')
    
            # root 表示当前正在访问的文件夹路径
            # dirs 表示该文件夹下的子目录名list
            # files 表示该文件夹下的文件list
    
            # 遍历文件
            for f in files:
                path_ = os.path.join(root, f)
                print(path_)
                ff.write(path_+"\n")
            ff.close()
    
    walkFile('pos')
    walkFile('neg')

    运行了上面文件后会生成pos.txt neg.txt文件。把pos.txt文件其中的格式jpg改成jpg 1 0 0 w h。如下所示

    opencv学习记录(一)——训练&分类方法(Adaboost、svm)_第4张图片

     

  • 创建pos.vec文件,输入命令,其中500代表要用的正样本,应小于总数。
    opencv_createsamples.exe -info pos.txt -vec pos.vec -bg neg.txt -num 500 -w 20 -h 30

     

  • 训练(先新建存放结果的文件夹文件夹xml):可自行换参数进行训练!
    opencv_traincascade.exe -data xml -vec pos.vec -bg neg.txt -numPos 40 -numNeg 100 -numStages 10 -w 20 -h 30 -mem 1024 -featureType LBP

 

 

二、SVM

NULL

 

 

   

 

 

     

 

你可能感兴趣的:(学习记录)