赞
踩
什么是分类器
分类器就是给程序构建了一本字典,让它可以认识一些事物。
一、前期准备
为了训练我们自己的分类器,我们需要先定一个目标,这个分类器需要达成什么样的功能。暂定它只能识别我们自己。这时我们需要准备一下自己的照片,照片的要求取决于我们需要的识别场景,例如:我们日常使用就是为了进门的时候刷脸,这时我们准备的照片场景是固定的,就是进门的那一块地方,不同的就是每天不一样的自己,所以照片的要求就是不同光线下的自己、不同发型、状态下的自己,不需要太多,单一识别的样本的识别几百张足矣。
没有那么多自己的照片?那么可以用opencv自带的分类器识别出一些样本。收集正脸的代码放到下面;
自己的照片有了以后,把他们放在一个文件夹中。
到此,正样本部分的前期准备就完成了。负样本一定也是需要的,而且比你的正样本要多的多,多多少这取决你正样本的复杂程度。也并非越多越好。如果你的正样本从始至终都只有一个人在一种场景下,那么负样本的数量是正样本的1.1倍也是可以的。要是你的正样本场景复杂人物多变,负样本在3倍的数量也不为过。但要注意电脑配置,太多也是容易over的。
当你的正样本与负样本准备好了就可以进行下一步了。
二、训练前的准备
我们要训练一个级联分类器,并不是要用你pip install opencv后的那个opencv而是可以在windows下运行的那个;
3.x版本的训练器我们也可以用,
当你准备好了上述的文件,我们就可以开始着手准备训练我们自己的级联分类器了:
首先,为了满足训练要求我们需要先将先前准备的正负样本文件调整到一个合适的尺寸,opencv推荐是将尺寸调整到20px*20px。
代码如下;
正样本的new_dir可以设置为:posdata;负样本可以设置为:negdata(注意:这两个文件夹的位置需要在有traincascaded.exe 和 createsamplesd.exe这两个文件的文件夹中)。
如果你下载了我为你准备的train.7z,那么解压后的文件中就包含这两个文件夹,你只需把new_dir设置成他们就可以了。
首先进入到negdata文件夹中,在路径栏中输入cmd:
在cmd命令中输入:dir /b/s/p/w *.jpg > neg.txt
完成后我们得到了pos.txt与neg.txt两个文本文件,其中pos.txt需要我们打开,将所有jpg替换为:jpg 1 0 0 20 20,neg.txt则不需要我们这样做。
当完成这一步,我们需要将这两个文件剪贴到上级文件夹中,
如果没有下载我的train.7z那么你只比这个文件少了三个bat文件。txt文件我们的opencv还不认识,所以我们要将他们转化为nec文件。
我们需要在当前目录下新建两个bat文件:
classify.bat
编辑:opencv_createsamples.exe -vec neg.vec -info neg.txt -num 699 -w 50 -h 50
ctratesamples.bat
编辑:opencv_createsamples.exe -vec pos.vec -info pos.txt -num 517 -w 20 -h 20
需要注意的是其他内容不用去修改,你只需要注意-num/-w/-h后的数字(说明如下文),除非你当时运行cmd时输入的名字不是pos.txt\neg.txt,又或者你不想把他们命名成跟我一样的。
-num XXX: XXX代表你的样本数,其中ctratesamples.bat是正样本数,classify.bat是负样本数。
-h XX:代表你尺寸修改后的图片高度。
-w XX:代表你尺寸修改后的图片宽度。
当你完成这些,运行他们;
当你的目录下,出现这两个文件时,那么你便可以开始最后,也是最关键的一步了:开始训练,
在当前目录下新建:
traincascade.bat
编辑:
opencv_traincascade.exe -data xml -vec pos.vec -bg neg.txt -numPos 500 -numNeg 690 -numStages 20 -w 20 -h 20 -precalcValBufSize 1024 -precalcIdxBufSize 1024 -minHitRate 0.999 -maxFalseAlarmRate 0.4 -mode ALL
pause
以下是参数说明:
-data:当前分类器储存的文件夹名称。
-vec:我们创建的正样本vec文件的名称。
-bg:我们创建的负样本vec文件名称。
-numPos:正样本数量,注意:填写的数量要小于实际数量,这里是需要我们根据自己的样本数量修改的。
-numNeg:负样本数量,注意:填写的数量可以大于实际数量,这里这里是需要我们根据自己的样本数量修改的。
-numStages:最大训练深度,20就是20层,但训练可能不会到最大层数,样本少且形态单一时可能6-9层就结束了。
-w,-h:是我们正样本的图像的宽与高,当你的图片大小与本文章所写的不一致时,需要修改,但是需要注意的是图像越大训练的越慢。
-precalcValBufSize、-precalcIdxBufSize:缓存大小,前者计算特征值,后者计算索引。
-minHitRate:每层检测最小期望检测率。
-maxFalseAlarmRate:每层的期望误检率。
-mode:HAAR特征的模式,有三种BASIC、CORE、ALL
还有一些其他的参数,可以自行某度一下。
当我们完成上述所有内容后,别忘了在当前目录创建一个文件夹xml,用于存放训练数据:
最后,运行traincascade.bat!!!
训练结束时,你会在xml目录中得到以下文件,其中cascade.xml便是我们最终所需要的级联分类器;
我们可以尝试写一个函数或者写一个类去测试我们的成果:
自此你的程序有了一本关于你的字典,每当你运行它时,他总会认识你。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。