• 使用OpenCV训练Haar like+Adaboost分类器的常见问题


    《FAQ:OpenCV Haartraining》——使用OpenCV训练Haar like+Adaboost分类器的常见问题

    最近使用OpenCV训练Haar like+Adaboost分类器,查阅了一些资料,这些资料对训练过程陈述的很详细,但是缺少一些细节,偶然看到了一篇英文资料,觉得很好,简单翻译了自己觉得有用的部分。

    原文链接:FAQ:OpenCV Haartraining

    关于正样本图片

    1、I have  positive images, how create vec file of positive samples?
         有了正样本图片,如果生成对应的vec文件?
     OpenCV中有一个工具可以生成vec文件,在安装目录C:Program FilesOpenCVappsHaarTrainingsrc createsamples.cpp。
    使用方法:
    createsamples -info positive_description.txt -vec samples.vec -w 20 -h 20
     
    2、What’s positive description file?
        正样本描述文件是什么?
    以人脸为例,在正样本的图片中,可能有数个人脸,每个人脸的位置可以用一个矩形框来表示:矩形左上角是x, y,宽、高是width,height。所以我们可以写一个文件来表示每张图片中的每个人脸如下:
    positive_image_name  num_of_objects x y width height x y width height …
    像这样,指定了正样本中需要检测目标位置的文件就叫正样本描述文件。在生成vec文件时,添加到vec文件中的是需要检测的目标,而不是整张图片。本质上来讲,vec文件用来加速机器学习。
     
    3、Do I always need description file, even if I have only one object on a image?
        描述文件是不是必须的?如果正样本图片中只包含一个需要检测的目标时呢?
        使用createsamples工具时,描述文件是必须的。如果正样本图片中只有一个被检测物,矩形框就是整幅图片。你也可以自己编写工具来生成vec文件。
     
    4、Should lightning conditions and background be various on positive images?
        正样本图片中的关照和背景的变化是否需要很大?
    是的,而且这很重要。在正样本图片中,除了被检测目标,剩下的就是背景。应该尝试用随机噪声来填充背景,避免没有变化的背景。
     
    5、How much background should be on positive image?
        在正样本图片中,应该有多少背景?
    如果在正样本图片中,背景相对被检测目标来说,所占像素很多的话,会产生不好的效果,因为haartraining(haar训练程序)会把背景当作被检测物的特征记下来。如果在正样本图片中根本没有背景像素,也会造成训练的结果不好。在正样本图片中有很少背景是比较理想的。
     
    6、What’ s  -w and -h should I put in createsamples? Should it be always square?
        在使用createsamples工具时,-w -h参数应该设定为多少?是不是一定要设定成正方向?
    -w -h参数的值应该根据希望检测目标的比例来设定。但是,使用生成的分类器来进行检测时,比-w -h所确定的形状小的目标不会被检测到。在检测脸时,通常使用的值是24*24,20*20。你也可以使用24*20,20*24等等类似的值。
     
    7、Errors during vec file generation: Incorrect size of input array, 0 kb vec file,
        生成vec文件时报错:输入矩阵大小错误,vec文件0kb
    -首先,检测描述文件:例如正样本图片的路径是否正确
    -描述文件末尾不能有空行
    -正样本图片的分辨率不能小于设置的-w -h参数
    -检查正样本图片是否可用,是否被占用
    -正样本图片格式是否正确。支持的格式有jpeg、bmp、ppm。
     

    关于负样本图片

    1、What negative images should I take?
        应该使用什么样的负样本图片?
    可是使用任何OpenCV支持的图片格式,而且其中不能包含被检测目标。负样本图片应该变化很大,多种多样。
     
    2、Should negative images have the same size?
        负样本图片是否需要缩放到同样大小?
    不需要,但是负样本图片不能小于使用createsamples工具生成vec文件时设定的-w -h参数。
     
    3、What’s description file for negative image?
        负样本的描述文件是什么样的?
    负样本的描述文件是一个简单的文本文件,通常命名为negative.dat。它指定了负样本图片,并且不能有空行(包括末尾)。例如:
        image_name1.jpg
        image_name2.jpg
     
    4、How many negative/positive image should I take?
        通常需要使用多少正/负样本图片?
    这往往根据你的需求来确定。例如,对cascades来说,需要有1000个正样本和2000个负样本。
    比较好的比例关系是 positive : negative = 1:2,但这并不是硬性规定。我推荐先使用少量的样本来尝试产生cascades,然后再扩大样本。
     

    关于haartraining.exe的使用

    1、Example of launching
        使用haartraining的示例
    vec文件为samples.vec,负样本描述文件为negative.dat。使用haartraining.exe的方法如下:
     haartraining -data haarcascade -vec samples.vec -bg negatives.dat -nstages 20  -minhitrate 0.999 -maxfalsealarm 0.5 -npos 1000 -nneg 2000 -w 20 -h 20 -nonsym -mem 1024

    -data haarcascade  
            生成的xml文件目录为haarcascade 

    -vec  samples.vec       
        vec文件为samples.vec
    -bg  negatives.dat       
        负样本描述文件为negatives.dat
    -nstages 20         
               分类器的级联层数
     -minhitrate 0.999             每一层的最低正确检测率99.9%
    -maxfalsealarm 0.5           最大错误接受率50%
    -npos 1000 -nneg 2000    正、负样本数
    -w  20 -h 20         
                 -w -h参数与生成vec文件时设置的数值相同
     
    2、What’ s falsealarm and hitrate of stage?
      stage的 ”错误接受率“ 和 ”正确检测率“ 是什么?
    要了解这两个参数,需要查阅adaboost算法中关于强分类器的理论。stage就是强分类器。简单来说:
     
    如果有1000个正样本,你希望检测系统能检测出其中的900个,期望的”正确检测率“就是900/1000 = 0.9。通常将minhitrate设置为0.999;
    如果有1000个负样本,如果检测系统错误的将其中490当作了检测目标,”错误接受率“就是490/1000 = 0.49。通常false alram设置为0.5。
     
    3、Are falsealarm and hitrate depend on each other?
        错误接受率和正确检测率之间有关系吗?
    它们之间是有关系的,不能这样设置:minhitrate = 1.0,  maxfalsealarm 
    = 0.0。
    首先,系统根据期望的hitrate创建分类器,然后计算分类器的falsealarm。如果falsealarm比设置的maxfalsealarm高,系统会拒绝这个分类器,开始创建新的分类器。所以在训练过程中,你可以看到类似下面的信息:
     
    N |%SMP|F| ST.THR | HR | FA | EXP. ERR|
    +—-+—-+-+———+———+———+———+
    | 0 |25%|-|-1423.312590| 1.000000| 1.000000| 0.876272|
     
    HR – hitrate
    FA – falsealarm
     
    4、What’s falsealarm and hitrate of whole cascade?
        整个级联分类器的falsealarm和hitrate是多少?
     
    False alarm of cascade = false alarm of  stage 1* false alarm of  stage 2* …
    Hit rate = hitrate of  stage 1 * hitrate of stage 2* …
     
    5、How many stages should be used?
        级联分类器应该被设定为多少层?
    通常,14-25层就足够了。
    如果层数过多,分类器的false alarm就更小,但是产生级联分类器的时间更长。
    如果层数过多,分类器的hitrate就更小。(原因见4)
    如果层数过多,检测速度更慢。
    如果正、负样本较少,层数没必要设置很多。
     
    6、What’s weighttrimming, eqw, bt, nonsym options?
        weighttrimming、eqw、bt、nonsym 选项表示什么?
    nonsym            —
    如果检测目标不是x或者y轴对称的,使用-nonsym选项。系统默认使用-sym选项
    eqw          
           — 如果正负样本数目不相等,不要使用此选项
    weighttrimming — 计算最优化选项。能减一点计算事件,但是质量也会降低
    bt                  
      — 使用哪种adaboost算法:Real AB,Gentle AB等
     
    7、What’s  minpos, nsplits, maxtreesplits options?
        minpos、nsplits、nsplits、maxtreesplits选项是什么?
    nsplits              —— 
      树节点数的最小值
    maxtreesplits    ——    树节点数的最大值
    minpos             —— 
     训练过程中,节点可使用的正样本数目。正样本根据节点被分类,通常来说,minpos不小于npos / nsplits
     
    8、   Errors and stranges during haartraining!
        训练过程中的错误!
    ①Error (valid only for Discrete and Real AdaBoost): misclass
    这是警告而不是错误。D and R Adaboost算法有一些特别的选项。
     
    ②控制台上都是类似下面的提示 :| 1000 |25%|-|-1423.312590| 1.000000| 1.000000| 0.876272| 
    训练进入了循环,重新启动训练。正常情况下,第一列应小于100
     
    ③cvAlloc fails. Out of memory
    负样本太多或者vec文件太大,所有的图片都加载到内存,导致内存不足。
     
    ④注意-w -h参数的值与生成vec文件时的值相同
     
    ⑤注意正、负样本数目与-npos 、-nneg参数设定值相同
     
    ⑥防止dat文件(描述文件)中的空行
     
    ⑦Required leaf false alarm rate achieved. Branch training terminated
    负样本图片中可能包含了被检测目标。maxfalsealarm值应该设定到0.4 - 0.5之间。
     

    分类器xml文件

    1、During haartraining, there are txt file in haarcascade folder, how can we
    get XML  from them?
        训练过程中会产生txt文件,如果根据这些文件生成xml文件?
    使用convert_cascade工具:
     convert_cascade –size=”20×20″ haarcascade haarcascade.xml
    其中,haarcascade 是txt文件所在目录
     
    2、How can I test generated XML cascade?
          如何测试生成的分类器?
    使用performance工具来测试,其中正样本是训练过程中未使用的图片:
    performance -data haarcascade -w 20 -h 20 -info positive_description.txt -ni
    performance -data haarcascade.xml -info positive_description.txt -ni

    使用OpenCV和训练得到的分类器检测物体

    1、Is it possible to detect rotated faces?
        能不能检测旋转过的脸?
    训练一个分类器来检测旋转不同角度的人脸是不可能的。但是,可是训练出分类器来检测旋转到对应角度的人脸。可以使用选择到这一角度的人脸图片来训练出分类器。在训练分类器时,加上-mode all选项表示使用所有的特征,但是早期的OpenCV版本实现的比较差。你也可以增加自己的特征,这并不困难。
    另一种方法是计算出头部的选择角度,然后根据选择角度旋转检测图片来得到正脸,这样就可以使用OpenCV自带的人脸检测期来进行检测了。
     
    2、Is it possible to recognize gender, attention, race with  Haar features?
        使用Haar特征能否分辨出性别、注意力、种族?
    我们有过尝试,但是使用OpenCV的haartraining没有成功。我们使用性别、注意力分类器。当然你可以使用Adaboost算法,但我们没有得到很好的结果。
     
    3、Is it possible to detect faces in real time?
        能否做到实时检测人脸?
    在电脑上,OpenCV自带的人脸检测器检测一幅分辨率为640*480的图片需要200ms,也就是5fps,非实时。我们可以改进检测器,做到15fps,进行实时检测。
  • 相关阅读:
    Shiro框架:Failed to deserialize java.lang.Exception: Failed to deserialize问题解决
    Linux系统:CentOS防火墙的各种命令使用
    Linux系统:CentOS下vsftpd的安装配置
    Vue项目启动报错:UnhandledPromiseRejectionWarning: TypeError: loaderContext.getResolve is not a function问题解决
    Minio存储桶:部署存储服务以及设置永久下载链接
    Redis之Bitmaps
    Redis事务与Lua
    Redis Pipeline
    Redis Shell详解
    Redis慢查询
  • 原文地址:https://www.cnblogs.com/chensheng-zhou/p/5542887.html
Copyright © 2020-2023  润新知