使用opencv训练自己的级联分类器&python人脸识别
本文中简单介绍使用opencv的createsamples和traincascade生成自己的分类器以及借用python的opencv库实现人脸图像采集、人脸识别
使用opencv训练自己的级联分类器&python人脸识别
训练级联分类器
- 首先需要在自己的电脑或服务器上安装
opencv
,这里需要用到opencv_createsamples
和opencv_traincascade
,opencv版本我这里安装的是stable 3.4.14版本,据说是4之后的版本不会内置这两个工具,所以选择的V3。 - opencv_haartraining属于旧版本程序,仅支持Haar特征,而opencv_traincascade同时支持Haar和LBP特征,且LBP属于整数特征,速度更快。(当然了,默认的opencv_traincascade仅使用的是多线程来处理的,如果想进一步使用多进程来提高速度,可以使用TBB来重新编译traincascade)。
- 至于为什么是整数特征,这里只简单的介绍一下:此模式是通过找到图像的局部特征,通过每个像素与相邻像素比较来实现(他会用一个3*3的窗口在图片上进行移动,每次移动时将周边元素的像素值和中心元素的像素值进行比较,小于等于中心值的记为1,反之则为0,然后在这个窗口内进行顺时针读取,得到0101的二进制数,以此来代表并区分不同的特征)。
我这里使用的brew
安装的
- brew search opencv
- brew install opencv@3
- echo ’export PATH="/opt/homebrew/opt/opencv@3/bin:$PATH"’ » ~/.zshrc
至此完成opencv的安装,之后就可以继续后面的工作了。
准备样例
- 这里我们需要分别准备正向与反向样例(为了分类器的准确性,条件允许的话可以设置尽可能多的正向样例,以及多倍于正向的反向样例,以提高识别的准确性) 项目结构如下
.
├── neg.txt
├── pos.dat
├── pos.vec
├── to_gray.py
├── to_jpg.py
├── training-files
│ ├── neg
│ ├── neg_gray
│ ├── neg_jpg
│ ├── pos
│ └── pos_gray
└── xml
├── cascade.xml
├── params.xml
...
└── stage9.xml
- neg和pos里分别为正向与反向的样例文件,这里全部转化为灰度图来使用,转灰度图可使用以下代码来实现
|
|
-
pos.dat为正向样例描述文件,内容如下,包括文件名,目标个数,以及目标的(x,y,w,h),以图片左上角为零点,目标起始位置的x与y的坐标,目标宽度和高度
-
反向样例的描述文件只需列出文件名(包含文件路径)即可
-
usage
|
|
- 生成vec文件
opencv_createsamples -vec pos.vec -info pos.dat -num 17 -w 40 -h 40
,这里的参数分别为输出的文件名、描述文件名、样例数量、输出宽以及高 - 接下来可以使用
opencv_createsamples -vec pos.vec -w 40 -h 40
查看输出的样例 - 最后使用以下命令生成分类器的xml文件
|
|
- 至此,就可以生成自己的分类器了!
测试分类器
采集人脸数据
- 这里需要用到cv2和numpy库, 可以使用pip安装
|
|
图像校验
|
|