人脸检测——Haar、LBP分类器模型训练
一、样本数据集
*这里需要注意的是正样本的大小和尺寸一定要是统一的
这里提供博主找到的数据集链接:https://pan.baidu.com/s/1MQnFwvlR2aHJkah_vaX9rg 提取码:yeop
里面的两个.bat文件生成描述文件用到 。
二、 正负样本数据描述文件生成:
如上图所示我们需要对正样本产生.dat文件、负样本产生.txt文件。
具体产生方法请参看连接:https://www.cnblogs.com/Jack-Elvis/p/12822372.html
三、使用opencv_createsamples.exe生成正样本.VEC文件
在OpenCV的安装文件中有一个opencv_createsamples.exe路径如图所示:
接下来我们 "win+R" 、 cmd ,打开命令窗口 ;
1. 输入: cd /d E:opencvuildx64vc14in (切到opencv_createsamples.exe的文件路径下)
2.输入: opencv_createsamples -info H:cascadetrainpositiveinfo.dat -vec H:cascadetrainmysamples_342.vec
-num 185 -bgcolor 0 -bgthresh 0 -w 24-h 24 (生成正样本.VEC文件)
说明:
-info, 指样本说明文件
-vec, 样本描述文件的名字及路径
-num, 训练正样本的总共数量
-w -h , 指明想让样本缩放到什么尺寸。
四、训练样本生成人脸检测分类器
此时我们可以看到正样本的VEC文件:
继续在命令框输入:
opencv_traincascade -data H:cascadetrain -vec H:cascadetrainmysamples_342.vec -bg H:cascadetrain egativeimg.txt -numPos 170 -numNeg 500 -numStages 12 -featureType LBP -w 24 -h 24 -minHitRate 0.996 -maxFalseAlarmRate 0.5 (自行修改文件路径,三个位置)
-numStages 训练的层数
-featureType 训练的方法 LBP/Haar
-w -h 指明想让样本缩放到什么尺寸
-minHitRate 最小命中率
-maxFalseAlarmRate 最大虚警率 (专业名词百度一下就知道)
训练结果如下:
共训练10个stage达到训练要求完成训练。相应生成文件如下
其中生成的cascade.xml文件为我们需要的分类器。
五、调用分类器检测人脸
代码如下:
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; CascadeClassifier face_cascader; //定义一个分类器变量 String haarfile = "H:/cascadetrain/cascade.xml"; int main(int argc, char** argv) { if (!face_cascader.load(haarfile)) { //加载haar分类器xml文件 printf("could not load image... "); return -1; } namedWindow("demo-win", CV_WINDOW_AUTOSIZE); Mat src = imread("H:/123.jpg"); //读取图片 if (src.empty()) { printf("could not load image... "); return -1; } imshow("input image", src); Mat gray; vector<Rect> faces; cvtColor(src, gray, COLOR_BGR2GRAY); //转化为灰度图像 equalizeHist(gray, gray); //均值化 int st = getTickCount(); //st被赋值此时间 face_cascader.detectMultiScale(gray, faces, 1.3, 3, 0, Size(40, 40)); int et = (getTickCount() - st); // et=此时的时间-st (人脸检测时间) printf("time consume : %d", et); for (size_t t = 0; t < faces.size(); t++) { //画出检测出的每个人脸 rectangle(src, faces[t], Scalar(255, 0, 0), 2, 8, 0); } imshow("demo-win", src); waitKey(0); return 0; }
代码比较简单,前面都有相关API使用,不详细介绍。实验结果如下: