python⼈头识别_python+opencv实现⼈头检测
python+opencv实现⼈头检测
python+opencv实现⼈头检测
前段时间琢磨了下⼈头检测这个功能,现在有了初步的认知和体会,下⾯开始讲下我在实现⼈头检测过程中遇到的坑和解决⽅法。
环境搭建:pycharm,python2.7,opencv2.7,numpy。
这些个环境都是前期准备的,安装和配置都挺⽅便的,不得不说这⾥就是python的各种功能的库是真的多,前辈们真是值得膜拜。这⾥给出⼀个我下载那些库的⽹站,python库下载
下载了需要的库⽤pip安装就⾏。
进⼊正题,因为opencv只有现成的⼈脸识别特征分类器,但是没有⼈头识别的,所以需要⾃⼰训练⼀个。这⾥我采⽤的是HAAR特征训练分类器。看了很多这⽅⾯的博⽂,⼤多数⽤的HAAR特征,所以也就开始就打定主意使⽤这个特征来训练,后⾯也简单了解了下HAAR特征和LBP特征,HAAR特征是将图像中相同像素内的⽩⾊部分减去⿊⾊部分得到该区域的HAAR特征值,反应了图像的灰度变换情况;LBP
特征则是将每个像素周围看成⼀个3*3的正⽅形,将中⼼像素的值作为阀值,周围8个点像素点与中⼼点做⽐较,若像素⼤于中⼼点则与中⼼像素作⽐较的点的LBP值置为1,反之为0。这样就得到⼀个中⼼的LBP值,反应区域的纹理信息。得到特征值后,⽤特征值作为分类依据训练分类器的事情就是那些个算法做的事情了,这⾥我就不发表拙见了。看看⼤⽜写的⼀篇⽂章吧,涉及到很多数学内容,细细看还是会很有理解的。图像特征提取。
接下来进⾏具体训练过程:
1.创建⼀个训练所⽤的⽂件夹,⽬录结构如下:
各⽬录作⽤:
data:⽤于存放正样本描述⽂件pos.vec,由产⽣。
data1:⽤于存放训练⽣成的级联分类器⽂件(l),以及训练各阶段产⽣分类器(l,l等等)。
negdagta:⽤于存放负样本⽂件。
posdata:⽤于存放正样本⽂件。
2.在正负样本⽬录下各⾃⽣成其数据⽂件:posdata.dat和negdata.dat。
命令为:
这样正负样本的数据⽂件都在其各⾃⽬录下⽣成了,接下来进⾏修改数据⽂件。打开数据⽂件的编辑界⾯,删掉数据⽂件最后⾯的posdata.dat,同理删除负样本数据⽂件⾥⾯的negdata.dat。如图:
接下⾥修改数据⽂件成我这样,posdata.dat:
negdata.dat:
解释下 1 0 0 20 20这个参数的意思,1代表⽂件,0 0 20 20,是这个⽬录下每⼀张图⽚的坐标,因为是⼆维的,⽽且我正样本所有图⽚全是20*20像素的,所以就是(0,0)点到(20,20)点,即是读取图⽚时,从左下⾓扫描到右上⾓。
python怎么读取dat文件注意:在负样本的数据⽂件⾥⾯,要给每⼀个图⽚⽂件加上他的相对地址,因为默认我们训练时,是在negdata的⽗⽬录下进⾏,即是你创建的训练⽂件夹下进⾏。
3.准备⼯作已经完成,下⾯开始训练具体操作,⾸先⽤⽣成样本描述⽂件pos.vec。命令如下:
-info posdata -vec data\pos.vec -num 你所需要创建的正样本数量(⼀般为正样本内⽂件数⽬的0.9倍) -w 20 -h 20
⽣成了正样本描述⽂件后,接下来就是⽤进⾏分类器的⽣成。命令如下:
-data data1 -vec data\pos.vec -bg 64negdata numPos 243 -numNeg 300 -minHitRate 0.9999 -maxFalseAlarmRate 0.5 -featureType HA
AR -numStages 20 -w 20 -h 20
接着,等着他训练完成就⾏。
最后我来说下我训练过程中碰到的坑和解决的办法:
1.训练参数中-bg,即负样本路径不正确,仔细检查后就能解决。
2.训练参数中的-numPos,-numNeg,⼀定要⽐实际的正负样本⽂件夹中样本数⽬少,千万不要强迫症,不然就会在训练中途停⽌,并报如下错误:Assertion failed (elements_read == 1) in
icvGetHaarTraininDataFromVecCallback,file..\opencv\apps\haartraining\cvhaartraining.cpp, line 1861”
3.正负样本采集问题,开始我⽤的⽹上下的样本库训练,虽然样本数量很多,但是正样本质量太差,导致训练结果⼀直很差,所以就想到了⾃⼰采集样本的办法,这样就解决了这个问题。ps:可以⾃⼰写个截图⼯具来完成样本采集⼯作,正样本数量上的话,上千张就会有很好的效果了,⼀定注意要加些灰度处理后的正样本图⽚,会增加些精确度;负样本的话,⼤概与正样本的三倍,因为后⾯出现负样本不⾜的情况,可以换⼀批负样本接着训练。
4.训练到后⾯,训练终⽌,提⽰负样本不⾜,这个问题是我碰到的最难解决的问题了,我的解决⽅法是,⽤新的负样本替换掉negdata⾥⾯的负样本⽂件,然后重新⽣成相应的negdata.dat,接着⽤相同参数训练,这样就相当于boosting算法,能够重新在新的负样本中进⾏筛选,就能解决负样本不⾜情况。这样做还有个好处是,不⽤赋予-numNeg特别⼤的值,导致其他错误。
5.关于正负样本⽐例问题,这个问题看你所需要的训练场景⽽论,如果你训练的分类器⽤于变化⽐较⼤的环境,建议你正负样本⽐例⾄少是1:2;如果分类器⽤于环境变化较⼩的情况,就是我所⾯临的场景,我的建议是1:1。
⾄此,我的样本训练过程就完成了,最后,贴⼀张最终训练效果图,这是训练了接近是个分类器后,最好的⼀个了,基本达到了要求,进⼀步提升精确度就需要在图像预处理部分,和“去抖动”部分琢磨。
python+opencv实现⼈头检测相关教程
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论