做了一段时间的adaboost训练一个可以检测张开的手掌的检测器,最后训练出来的效果不错,在保证较高的检测率的情况下还能保持几乎没有误检的情况出现,adaboost用在物体检测上的效果让我大吃一惊。adaboost的特点是误检测少,且速度快,因为在检测的时候采用滑窗法对窗口挨个进行一个二分类(是手掌或者不是手掌),但是大多数窗口无法通过前面几个stage的分类器就直接被判断为负样本了,因此有着速度快的特点,但是限于检测过程是在手机端运行的,手机的计算能力不比电脑,所以fps还是会存在一点问题,对此我也进行了相应的方法来加速检测的过程,以提高检测速度。这篇博客分为两个部分,一部分是如何准备数据集,包括正样本和负样本,另一个部分是如何进行训练以及训练过程中一些需要注意的地方。下面开始啦~
一、准备数据集
数据集包括了正样本和负样本,正样本毫无疑问就是真正包括想要检测的物体。举个栗子:
截图工具大概就是QQ截图之类的东西了。。图像的大小可以不一样,也可以都缩放为一个尺寸,最好是缩放为一个尺寸,方便后面准备info.data文件,但原则上是只要保证正样本图像中基本恰好包括了想检测的物体即可。把它们放在一个叫做pos的文件夹中。我用到的正样本个数是1400个。正样本这样截好图放在pos文件夹之后就告一段落了,接下来是负样本。关于负样本,有一点值得注意,就是负样本不需要自己去截取,可以拿任何不包括正样本图像的大图作为负样本,再举个栗子,我想检测的是手掌,那么只要一张图片中没有手掌,我就可以把这张图片拿来当做负样本的一部分。也就是说,负样本是大图而不是截图,只要这个大图不包括正样本。还是拿图举个栗子:
这是拿视频存成图片来作为负样本的,图片的个数是1180张,但是图片的个数不代表负样本的个数,这点后面会解释到。把这些图片放在一个叫做neg的文件夹中,pos和neg文件夹在同一个目录下。还是上图吧:
现在有了数据集,还差描述这些正负样本的文件。正样本需要一个叫做info.dat(也可以是)的文件,这个文件表达了什么含义呢?上个info.dat的图:
可以看到inf.dat描述了正样本所在的目录以及正样本的文件名字,后面的1表示这个图里面有一个正样本,它在图中的位置是起点是左上角的坐标是(0,0),然后宽高是24,24。这里宽高之所以是24,24的原因是我把所有正样本都缩放到了24,24的尺寸,所以正样本图片就是整个图片。如何快速生成这个info.dat文件呢?在Ubuntu下可以使用在工作目录下面(也就是pos和neg文件夹所在的文件夹)打开终端输入以下指令:
ls pos/*.jpg > info.dat
这就可以把文件所在目录和文件名的信息写到info.dat文件中,然后再使用文本替换,把info.dat中的所有jpg替换为jpg 1 0 0 24 24,就可以得到上图info.dat文件形式了。这下就可以解释为什么建议先把所有正样本缩放到一个尺寸了,因为方便最后统一替换。现在有了正样本的描述文件了,还差负样本的了,在同样的工作目录下打开终端输入以下指令:
ls neg/*.jpg >
这样就可以生成负样本描述文件,如下图所示:
描述了负样本文件所在的目录和名字。
还差最后一步就可以完成数据集的准备了。需要opencv中的一个可执行文件,叫做opencv_createsamples,可以从opencv的bin目录中拷贝到工作目录下,然后打开终端输入以下指令:
./opencv_createsamples -info info.dat -vec pos.vec -num 1400 -w 24 -h 24
1400这个数字是你有的正样本的总数,后面训练的时候还会涉及到比这个1400少一点的数,是一次训练中真正使用到的正样本的个数。-w -h的参数是程序会将你的正样本缩放到指定的wh尺度,我这里图像本身就是24*24的,再缩放到24*24。执行这个指令后就可以得到一个pos.vec文件,它是一个二进制文件,包含了正样本数据的像素值,具体含义参考另一篇博客。也就是说pos.vec是训练的时候真正读取的数据,包括了正样本的长宽以及像素值的信息。下面进行第二步,训练检测器:
二、训练检测器
在准备好了数据集之后,就要开始训练检测器了,用到的工具是opencv提供的可执行文件opencv_traincascade,同样可以将其拷贝到工作目录下面来。然后在工作目录打开终端,输入指令./opencv_traincascade,就可以查看使用这个可执行文件需要什么参数了。如下图:
下面主要来解释这些参数的含义,以便我们可以正确的选择参数。
-data是训练生成的检测器存放的目录,你可以自己在工作目录下面建一个叫做cascade的目录,然后训练的时候就可以使用这个作为参数填进去,-vec就是正样本的vec文件,也就是前面说的pos.vec文件,-bg是负样本描述文件,即。[]中的是可以选择填的参数,比较重要的有:
-numPos:训练的时候用到的正样本的个数 ,这个个数要比你实际拥有的正样本的个数少个100到200个,因为每一个stage的分类器会将少量正样本识别为负样本,因此需要新的正样本补充进来,也就是那100到200个,如果你这里填的-numPos参数是你实际拥有的也就是pos.vec文件中包含的正样本个数,那么当需要补充正样本的时候你就没有新的正样本可以来补充了。我总共有1400个正样本,所以这里我可以填写1200作为训练时候的正样本数,留下200个正样本做替补队员。
-numNeg:训练的时候用到的负样本个数,这个个数和你中负样本大图片的个数没什么直接关系,举个栗子我这里填的是6000,那么程序会从中的大图中按照某种规则抠出指定个数以及w和h的小图作为负样本,也就是说一张负样本大图可以产生数十上百个负样本小图,这些小图才是真正在训练的时候作为负样本出现的。一个经验的填法是-numNeg是-numPos的5倍左右。比例太低导致虚警高,太高了导致检测率低。正负比为1:5挺合适的。
-numStages:是你想生成多少个stage的分类器,并将它们级联起来,经验值是20,也就是默认值。太低了会导致虚警高。
-featureType:是你可以选择的特征的种类,总共3种特征可以选择,harr,lbp以及hog。我训练过手掌和人头的检测器,实践表明,harr特征往往在adaboost中有着更好的表现,因此这里我填的是HARR,也就是默认值其实可以不填的。
-w -h也就是你想扣出多大的图作为负样本。一般正负样本的尺度保持一致,我这里使用的24 24。
-bt:全名boost type,即boost的几种方法,选择默认的即可,也可以去查下这几个分别是什么意思,我查过然后忘记了。。
-minHitRate以及-maxFalseAlarmRate。这里的参数表示的是一个stage训练到什么程度就结束,然后开始训练下一个stage呢?标准就是在这个stage的正负样本中,检测率不能小于-minHitRate,虚警率不能高于-maxFalseAlarmRate。比如这里我们都采用默认值,-maxFalseAlarmRate为0.995,-maxFalseAlarmRate为0.5,表示的就是给出1000个正样本,至少分类器要将其中的995个样本判断为正样本,如果给出1000个负样本,最多只能将500个判断为正样本。
-maxDepth:指的是在一个stage中会有多个弱分类器,而在opencv中这个弱分类器使用决策树实现的,这个参数就表示决策树的最大深度,填1的话表示决策树就只有一个节点,也只有一层深。一般填1就可以了。
-maxWeakCount:指的是在训练一个stage的过程中,如果弱分类器(也就是决策树)的 数量大于了这个--maxFalseAlarmRate参数的但-minHitRate以及-maxFalseAlarmRate还没有达到指标的话,这个stage也会停止训练,进行下一个stage的训练。
-mode:这是选择了HARR特征之后所独有的一个参数,BASIC、CORE、ALL分别含有不同的特征,但三者是包含关系,也就是ALL包含了CORE中的特征,CORE包含了BASIC中的特征。具体内容可以参考博客,也可以看下图:
BASIC就横竖的特征,即1中的ab以及2中的abcd,CORE在BASIC的基础上还包括了倾斜的横竖特征,即1,2所有的特征,ALL包括了1,2,3中所有的特征。因此可以根据自己想要检测的物体的情况选择这个参数。
参数的介绍就到这里啦,想要了解更多细节的话可以去阅读源码,我的博客也解析过部分adaboost的源码,但都还比较浅,深的还写不出来。
在工作目录打开终端输入以下指令即可开始训练:
./opencv_traincascade -data cascade -vec pos.vec - -numPos 1200 -numNeg 5000 -featureType HARR -w 24 -h 24
训练时间的话,到后面训练一个stage会比前面的stage训练时间要长,我训练1000个正样本和5000个负样本在i7的笔记本上花了将近20个小时,所以看到训练程序没有反应的时候不要担心,其实是在训练的,如果程序因为某些原因比如负样本不够而停止训练的话,程序会自己输出提示信息的。我也没有遇到过卡住了不继续训练的情况。另外,如果程序在训练过程中被人为终止了,可以再次输入上面的指令,会接着上次训练的结果继续训练的。比如上次训练了6个stage,那么这次再训练的话会从第7个stage开始的,只要不去改变cascade目录下的文件就行了。最后,祝大家都能训练出效果好的检测器吧。再上俩图:
本文发布于:2024-01-29 11:58:38,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170650072315116.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |