Java机器学习库(OpenCV)(级联分类器实现人脸识别)
级联分类器
这里简单的介绍一下级联分类器的概念。
以人脸识别为例,为了提高人脸检测的速度和精度,最终的分类器是通过几个强分类器级联得到,这就是所说的级联分类器。在一个级联分类系统中,对于每一个输入图片,顺序通过每个强分类器,前面的强分类器相对简单,其包含的弱分类器也相对较少,后面的强分类器逐级复杂,只有通过前面的强分类检测后的图片才能送入后面的强分类器检测,比较靠前的几级分类器可以过滤掉大部分的不合格图片,只有通过了所有强分类器检测的图片区域才是有效人脸区域。
级联分类训练过程
- 预先选定每一层的最大可接受误检率fpr(maximum acceptable rate of fpr) 和每一层最小可接受的检测率(minimum acceptable detection rate)
- 设定系统整体的可接受误检率
- 初始化. FPR=1, TPR = 1(检测率)
- 循环. 如果当前
,添加一层adaboost分类器,如果该分类器训练过程中没有达到该层最大误检率就继续添加新特征,添加新特征时降低阈值,使分类器的检测率大于给定值,然后更新
- 每一级分类器使用的训练集是上一级分类器判定正确的样本,而其中的错分的被当作负样本。这使得下一级的分类器更关注那些更难区分的样本。
OPENCV
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也提供了大量的Python、Java and MATLAB/OCTAVE(版本2.5)的接口。这些语言的API接口函数可以通过在线文档获得。如今也提供对于C#、Ch、Ruby,GO的支持。人脸识别级联分类器文件
级联分类器文件所在路径如下
面部定位识别文件:haarcascade_frontalface_alt.xml
眼睛定位识别文件:haarcascade_eye.xml
微笑定位识别文件:haarcascade_smile.xml
上面所提到的级联分类器文件均是OpenCV官方开发保重自带的,如果想自己训练级联分类器文件,笔者将会在后续文章中详细介绍,本文则着重介绍OpenCV级联分类器在Java中的使用。
Java中实现人脸识别
笔者使用OpenCV 4.2.0开发包来进行接下来的介绍与代码编写。
创建级联分类器
读取待识别图像
此处对待识别图片进行了一些简单的处理(主要是大小),以提高识别的速率。
输入图像如下(7.jpg):
面部定位识别
CascadeClassifier提供了很多定位识别方法,这里我们只介绍我们示例中用到的一个方法。
image:待识别图像;
objects:用于存储检测到对象的矩形向量;
scaleFactor:指定在每个图像的缩放比;
minNeighbors:每个候选矩形必须保留多少个邻居;
flags:对于旧的级联,其含义与函数cvHaarDetectObjects中的含义相同。它不用于新的级联。
minSize:最小可能的对象大小。小于该值的对象将被忽略。
maxSize:最大可能的对象大小。大于该值的对象将被忽略。
眼睛与微笑识别
为了使得眼睛与微笑识别更加准确我们这里在面部定位的基础上进行识别。
识别结果如下: