如何用opencv 自己训练一个人脸识别的级联分类器

今天给大家介绍怎么用OpenCV自己训练一个人脸识别的级联分类器。首先,把OpenCV 3.4装到你的电脑上。我这个指南假设你手头有个干净的开发环境了,不需要太复杂的配置步骤。接下来咱们就开始准备数据,正样本给放进zyb文件夹里,负样本就放到fyb文件夹里头。你还得在这两个文件夹旁边各建一个文本文件,一个是pos.txt用来存正样本的具体信息,另一个是fpos.txt,专门用来记那些负样本的文件名。 pos.txt里每一行都得有一个具体的描述。格式是这样的,先写绝对路径或者相对路径加文件名,后面跟物体个数,再加上左上角X坐标、Y坐标,还有物体的宽度和高度。比方说写个“/home/user/zyb/face01.jpg 1 50 50 64 32”,意思就是这个文件里有1张人脸,人脸在左上角的50,50坐标处,宽64高32。 fpos.txt就简单了,就一列文件名就行了,比如“/home/user/fyb/background01.jpg”。这两个文件最好跟它们对应的文件夹放在同一级目录里,免得路径搞错了。 接下来咱们生成训练要用的向量文件。打开终端窗口,输入命令 opencv_createsamples ,然后指定好输出路径和一些参数就行了。-vec参数后面是要保存的向量文件名;-info是之前写的pos.txt的位置;-bg是用来做背景的fpos.txt的位置;-num是这次要使用的正样本数量,别太多;-w和-h是图像的宽高尺寸,后面训练的时候还要用到这两个数字保持一致。 准备好了之后就开始正式训练了。还是在终端里输入 opencv_traincascade 这个命令启动训练流程。参数里-data是训练好的分类器要存的那个目录名;-vec是刚才生成的那个vec文件;-bg还是刚才的背景文件名;-numPos和-numNeg分别是每阶段要用的正负样本数量,建议稍微少一点实际量;-numStages是级联的层数,一般10到20层效果就挺好了;-w和-h跟刚才那个命令保持一致就好;-mode ALL就是告诉程序用Haar特征和LBP特征一起算;-mem是缓存大小,你内存够大就给大点数快一点。 训练完成后会在指定的目录下生成一个.xml文件,这就是我们的级联分类器啦。用起来非常简单,核心就一句代码:用CascadeClassifier加载这个xml文件。比如这样:cascade = cv2.CascadeClassifier('path/to/your/classifier.xml')。 读取一张测试图片:img = cv2.imread('test.jpg')。然后调用detectMultiScale方法去检测人脸:rects = cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=5)。这里的scaleFactor就是缩放因子,minNeighbors是最小邻居数这两个参数可以根据效果微调。最后用循环把每个检测到的人脸用矩形框画出来就行了:for x,y,w,h in rects: cv2.rectangle(img, (x,y), (x+w,y+h), (0,255,0), 2)。 最后显示一下检测结果:cv2.imshow('detected', img),再加上个等待按键:cv2.waitKey(0),这样一张检测图就出来了。