openCV训练分类器是一些错误及解决办法

  昨天看了一天的opencv训练分类器的资料,想自己试试。经过昨天一天的折腾终于成功的训练出了自己的分类器,虽然效果不好,但是是个好的开端。在整个过程中我遇到了很多问题,在这里和大家分享一下,希望对你有帮助。

      1.正样本的创建过程基本上按照以下步骤:

      1) 制作一个正样本描述文件,用于描述正样本文件名(包括绝对路径或相对路径),正样本数目以及各正样本在图片中的位置和大小。典型的正样本描述文件如下:
      face_100/face00001.bmp 1 0 0 20 20
      face_100/face00002.bmp 1 0 0 20 20
      face_100/face00003.bmp 1 0 0 20 20

可采用Dos命令结合EditPlus软件生成样本描述文件。具体方法是在Dos下的恰当目录敲入dir face_100 /b > samples.dat,则会生成一个samples.dat,里面包含所有正样本文件名列表,但没有相对路径名和正样本位置信息。在samples.dat文件各行行首增加“face _100/”的方法是使用EditPlus,先选中所有行,然后按Tab键为每行增加一个制表位,然后将制表位全部替换为“face _100/”即可。通过将“bmp”替换为“bmp 1 0 0 20 20”即可在每行添加“1 0 0 20 20”。


2) 运行CreateSamples程序。如果直接在VC环境下运行,可以在Project\Settings\Debug属性页的Program arguments栏设置运行参数。下面是一个运行参数示例:
-info F:\FaceDetect\samples.dat -vec F:\FaceDetect\samples.vec -num 200 -w 20 -h 20
表示有200个样本,样本宽20,高20,正样本描述文件为samples.dat,结果输出到samples.vec。


3) 运行完了会生成一个*.vec的文件。该文件包含正样本数目,宽高以及所有样本图像数据

需要注意:1、人脸的样本库如何获得,我选择的是ORL人脸样本库,这个可能使用的比较多,但是这个样本库人脸的大小是92*112,最好预先裁剪成20*20,可用PS的批处理操作完成,具体步骤找百度。

2、人脸样本大小最好是20*20~25*25,不要太大,否则计算量太大,容易内存不足

3、样本尽可能的多

4、编辑描述文件时软件的选择,我选择的是DOS+Notepad++,  Editplus没有找的纯净的版本,下了一个带病毒的,让我郁闷。


      2、负样本的创建过程

      过程基本上和正样本一样,但是

1,负样本不用像正样本一样创建.vec文件,只需要.dat文件就行。


2、负样本的描述文件不用有负样本的详细描述信息(如:1 0 0 20 20)只需要相对路径或绝对路径和图片文件名即可,这点切记,我在这吃了大亏。


3、图样本图片不能太大,这一点也要切记,还有虽然opencv中可以自动将负样本文件大小剪裁成与正样本大小一致,但是我们最好提前自己剪裁好,这样可以减少内存不足错误,并且增加训练速度。

      3、训练过程

       训练过程我遇到的困难最多,话费的时间最长,主要是正样本与负样本创建的不规范有关,训练过程错误提示主要遇到了三种,1)没有标识;2)无效的背景描述文件(如样本描述文件);3)内存不足。

       1、没有标识错误原因(没弄太清楚),个人认为是没有找到相应的图片文件,解决办法是检查你的Dos环境,运行opencv_haartraining.exe时,你的路径在哪,比如你的路径是E:\shiyan->,那么你的正样本和负样本描述文件里就是相对路径,反之亦然。2)参数-npos和-nneg值必须与描述文件一致。3)仔细检查命令有没有打错

       2、无效的背景描述文件解决方法1)opencv_haartraining.exe参数-w和-h值需要和负样本一致(强烈建议,正样本和负样本提前裁剪成一致大小,避免此处出错);2)前面提到的负样本描述文件里不需要样本的详细信息(这是我最后发现的一个问题,看资料要仔细呀)

       3、内存不足解决办法:1)正样本和负样本的大小不宜过大,一般为20*20,不宜超过25*25;2)负样本的数量不宜过多,负样本数量过多,增加计算量


以上就是我在训练自己的分类器时遇到的问题及解决办法,希望对你有用。其实还有一些问题没有弄清楚,待后续补充,也希望你有好的解决方法,及时回复,大家共同进步。

1.负样本的数量?看了很多资料负样本的数量一般都是大于等于正样本数量,能否小于呢?有待验证

2.分类器的级数怎么确定,原则是什么?

如果你知道答案,请回复,谢谢。

欢迎大家转载,但请标明出处,谢谢!


  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值