OpenCV 4.12.0
开源计算机视觉
加载中...
搜索中...
无匹配项
cv::face::FaceRecognizer 类参考抽象

所有人脸识别模型的抽象基类。更多...

#include <opencv2/face.hpp>

cv::face::FaceRecognizer 的协作图

公共成员函数

virtual bool empty () const CV_OVERRIDE=0
 
virtual String getLabelInfo (int label) const
 按标签获取字符串信息。
 
virtual std::vector< int > getLabelsByString (const String &str) const
 按字符串获取标签向量。
 
virtual double getThreshold () const =0
 阈值参数访问器 - 默认 BestMinDist 收集器所需
 
int predict (InputArray src) const
 
void predict (InputArray src, int &label, double &confidence) const
 为给定输入图像预测标签和相关置信度(例如,距离)。
 
virtual void predict (InputArray src, Ptr< PredictCollector > collector) const =0
 
  • 如果已实现 - 将所有预测结果发送到收集器,可用于某种自定义结果处理

 
virtual void read (const FileNode &fn) CV_OVERRIDE=0
 
virtual void read (const String &filename)
 加载一个 FaceRecognizer 及其模型状态。
 
virtual void setLabelInfo (int label, const String &strInfo)
 为指定模型的标签设置字符串信息。
 
virtual void setThreshold (double val)=0
 设置模型的阈值。
 
virtual void train (InputArrayOfArrays src, InputArray labels)=0
 使用给定数据和相关标签训练一个 FaceRecognizer
 
virtual void update (InputArrayOfArrays src, InputArray labels)
 使用给定数据和相关标签更新一个 FaceRecognizer
 
virtual void write (const String &filename) const
 保存一个 FaceRecognizer 及其模型状态。
 
virtual void write (FileStorage &fs) const CV_OVERRIDE=0
 
- 从 cv::Algorithm 继承的公共成员函数
 Algorithm ()
 
virtual ~Algorithm ()
 
virtual void clear ()
 清除算法状态。
 
virtual String getDefaultName () const
 
virtual void save (const String &filename) const
 
void write (const Ptr< FileStorage > &fs, const String &name=String()) const
 
void write (FileStorage &fs, const String &name) const
 

保护属性

std::map< int, String_labelsInfo
 

额外继承成员

- 从 cv::Algorithm 继承的静态公共成员函数
template<typename _Tp >
static Ptr< _Tpload (const String &filename, const String &objname=String())
 从文件中加载算法。
 
template<typename _Tp >
static Ptr< _TploadFromString (const String &strModel, const String &objname=String())
 从字符串加载算法。
 
template<typename _Tp >
static Ptr< _Tpread (const FileNode &fn)
 从文件节点读取算法。
 
- 从 cv::Algorithm 继承的保护成员函数
void writeFormat (FileStorage &fs) const
 

详细描述

所有人脸识别模型的抽象基类。

OpenCV 中的所有人脸识别模型都派生自抽象基类 FaceRecognizer,它提供了对 OpenCV 中所有人脸识别算法的统一访问。

描述

我将更详细地解释 FaceRecognizer,因为它乍一看并不像一个强大的接口。但是:每个 FaceRecognizer 都是一个 Algorithm,因此您可以轻松地获取/设置所有模型内部信息(如果实现允许)。Algorithm 是一个相对较新的 OpenCV 概念,自 2.4 版本以来可用。我建议您查看其描述。

Algorithm 为所有派生类提供以下功能

  • 所谓的“虚拟构造函数”。也就是说,每个 Algorithm 派生类都在程序启动时注册,您可以获取已注册算法的列表,并通过其名称创建特定算法的实例(参见 Algorithm::create)。如果您计划添加自己的算法,最好为您的算法添加一个唯一的​​前缀,以区分它们与其他算法。
  • 按名称设置/检索算法参数。如果您使用过 OpenCV highgui 模块的视频捕获功能,您可能熟悉 cv::cvSetCaptureProperty、ocvcvGetCaptureProperty、VideoCapture::setVideoCapture::getAlgorithm 提供了类似的方法,您可以使用文本字符串指定参数名称,而不是整数 ID。有关详细信息,请参阅 Algorithm::set 和 Algorithm::get。
  • 从 XML 或 YAML 文件读取和写入参数。每个 Algorithm 派生类都可以存储其所有参数,然后再将其读回。无需每次都重新实现它。

此外,每个 FaceRecognizer 都支持

  • 使用 FaceRecognizer::train 在给定图像集(您的人脸数据库!)上训练一个 FaceRecognizer
  • 给定样本图像(即人脸)的预测。图像以 Mat 形式给出。
  • 从/向给定 XML 或 YAML 加载/保存模型状态。
  • 设置/获取标签信息,这些信息以字符串形式存储。字符串标签信息对于保存识别出的人员姓名很有用。
注意
FaceRecognizer 接口与 Python 结合使用时,请坚持使用 Python 2。一些底层脚本(如 create_csv)在其他版本(如 Python 3)中将无法工作。设置阈值 +++++++++++++++++++++++

有时您会遇到这样的情况:您希望对预测应用阈值。人脸识别中的常见场景是判断一张人脸是否属于训练数据集,或者是否是未知人脸。您可能想知道,为什么 FaceRecognizer 中没有公共 API 来设置预测阈值,但请放心:它是受支持的。这只是意味着在抽象类中没有通用的方法来为每种可能FaceRecognizer 算法提供设置/获取阈值的接口。设置阈值的合适位置是在特定 FaceRecognizer 的构造函数中,并且由于每个 FaceRecognizer 都是一个 Algorithm(如上所述),您可以在运行时获取/设置阈值!

下面是在创建模型时为 Eigenfaces 方法设置阈值的示例

// 假设我们想保留 10 个 Eigenfaces,并设置阈值为 10.0
int num_components = 10;
double threshold = 10.0;
// 那么如果你想使用带置信度阈值的 cv::FaceRecognizer,
// 使用合适的参数创建具体实现
static Ptr< EigenFaceRecognizer > create(int num_components=0, double threshold=DBL_MAX)
std::shared_ptr< _Tp > Ptr
Definition cvstd_wrapper.hpp:23
double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)
对每个数组元素应用固定级别的阈值。

有时不可能训练模型,只是为了实验阈值。多亏了 Algorithm,可以在运行时设置内部模型阈值。让我们看看如何为上面创建的 Eigenface 模型设置/获取预测阈值

// 下面这行代码从 Eigenfaces 模型中读取阈值
double current_threshold = model->getDouble("threshold");
// 这行代码将阈值设置为 0.0
model->set("threshold", 0.0);

如果您像上面那样将阈值设置为 0.0,那么

//
Mat img = imread("person1/3.jpg", IMREAD_GRAYSCALE);
// 从模型获取预测。注意:我们上面设置的阈值为 0.0,
// 因为距离几乎总是大于 0.0,所以您将得到 -1 作为
// 标签,表示这张人脸是未知的
int predicted_label = model->predict(img);
// ...
n 维密集数组类
定义 mat.hpp:830
@ IMREAD_GRAYSCALE
如果设置,始终将图像转换为单通道灰度图像(编解码器内部转换)。
定义 imgcodecs.hpp:71
CV_EXPORTS_W Mat imread(const String &filename, int flags=IMREAD_COLOR_BGR)
从文件加载图像。

将产生 -1 作为预测标签,表示这张人脸是未知的。

获取 FaceRecognizer 的名称

由于每个 FaceRecognizer 都是一个 Algorithm,您可以使用 Algorithm::name 来获取 FaceRecognizer 的名称

// 创建一个 FaceRecognizer
// 这就是如何获取其名称
String name = model->name();
std::string String
定义 cvstd.hpp:151

成员函数文档

◆ empty()

virtual bool cv::face::FaceRecognizer::empty ( ) const
纯虚函数

这是一个重载成员函数,为方便起见而提供。它与上述函数的唯一区别在于其接受的参数。

重新实现自 cv::Algorithm

实现在 cv::face::BasicFaceRecognizer 中。

◆ getLabelInfo()

virtual String cv::face::FaceRecognizer::getLabelInfo ( int label) const
virtual
Python
cv.face.FaceRecognizer.getLabelInfo(label) -> retval

按标签获取字符串信息。

如果提供了未知的标签 ID 或没有与指定标签 ID 关联的标签信息,则该方法返回一个空字符串。

◆ getLabelsByString()

virtual std::vector< int > cv::face::FaceRecognizer::getLabelsByString ( const String & ◆ toUpperCase()) const
virtual
Python
cv.face.FaceRecognizer.getLabelsByString(◆ toUpperCase()) -> retval

按字符串获取标签向量。

该函数在关联的字符串信息中搜索包含指定子字符串的标签。

◆ getThreshold()

virtual double cv::face::FaceRecognizer::getThreshold ( ) const
纯虚函数

阈值参数访问器 - 默认 BestMinDist 收集器所需

实现在 cv::face::BasicFaceRecognizercv::face::LBPHFaceRecognizer 中。

◆ predict() [1/3]

int cv::face::FaceRecognizer::predict ( InputArray src) const
Python
cv.face.FaceRecognizer.predict(src) -> label, confidence
cv.face.FaceRecognizer.predict_collect(src, collector) ->
cv.face.FaceRecognizer.predict_label(src) -> retval

这是一个重载成员函数,为方便起见而提供。它与上述函数的唯一区别在于其接受的参数。

◆ predict() [2/3]

void cv::face::FaceRecognizer::predict ( InputArray src,
int & label,
double & confidence ) const
Python
cv.face.FaceRecognizer.predict(src) -> label, confidence
cv.face.FaceRecognizer.predict_collect(src, collector) ->
cv.face.FaceRecognizer.predict_label(src) -> retval

为给定输入图像预测标签和相关置信度(例如,距离)。

参数
src用于获取预测的样本图像。
label给定图像的预测标签。
confidence与预测标签相关的置信度(例如,距离)。

后缀 const 表示预测不影响内部模型状态,因此该方法可以安全地从不同线程中调用。

以下示例展示了如何从训练好的模型中获取预测结果

using namespace cv;
// 在此处进行初始化(创建 cv::FaceRecognizer 模型)...
// ...
// 读取样本图像
Mat img = imread("person1/3.jpg", IMREAD_GRAYSCALE);
// 并从 cv::FaceRecognizer 获取预测结果
int predicted = model->predict(img);
定义 core.hpp:107

或者获取预测结果和相关置信度(例如,距离)

using namespace cv;
// 在此处进行初始化(创建 cv::FaceRecognizer 模型)...
// ...
Mat img = imread("person1/3.jpg", IMREAD_GRAYSCALE);
// 预测标签和相关置信度(例如,距离)的一些变量
int predicted_label = -1;
double predicted_confidence = 0.0;
// 从模型获取预测结果和相关置信度
model->predict(img, predicted_label, predicted_confidence);

◆ predict() [3/3]

virtual void cv::face::FaceRecognizer::predict ( InputArray src,
Ptr< PredictCollector > collector ) const
纯虚函数
Python
cv.face.FaceRecognizer.predict(src) -> label, confidence
cv.face.FaceRecognizer.predict_collect(src, collector) ->
cv.face.FaceRecognizer.predict_label(src) -> retval

  • 如果已实现 - 将所有预测结果发送到收集器,可用于某种自定义结果处理

参数
src用于获取预测的样本图像。
collector接受所有结果的用户定义收集器对象

要实现此方法,您只需执行与 predict(InputArray src, CV_OUT int &label, CV_OUT double &confidence) 相同的内部循环,但不要尝试获取“最佳”结果,只需将其通过给定收集器重新发送到调用方

◆ read() [1/2]

virtual void cv::face::FaceRecognizer::read ( const FileNode & fn)
纯虚函数
Python
cv.face.FaceRecognizer.read(filename) ->

这是一个重载成员函数,为方便起见而提供。它与上述函数的唯一区别在于其接受的参数。

重新实现自 cv::Algorithm

实现在 cv::face::BasicFaceRecognizer 中。

◆ read() [2/2]

virtual void cv::face::FaceRecognizer::read ( const String & filename)
virtual
Python
cv.face.FaceRecognizer.read(filename) ->

加载一个 FaceRecognizer 及其模型状态。

从给定的 XML 或 YAML 文件加载持久化模型和状态。每个 FaceRecognizer 都必须重写 FaceRecognizer::load(FileStorage& fs) 以启用模型状态加载。FaceRecognizer::load(const String& filename) 又会调用 FaceRecognizer::load(FileStorage& fs),以简化模型保存。

重新实现于 cv::face::BasicFaceRecognizer

◆ setLabelInfo()

virtual void cv::face::FaceRecognizer::setLabelInfo ( int label,
const String & strInfo )
virtual
Python
cv.face.FaceRecognizer.setLabelInfo(label, strInfo) ->

为指定模型的标签设置字符串信息。

如果先前为指定标签设置了字符串信息,则该字符串信息将被提供的值替换。

◆ setThreshold()

virtual void cv::face::FaceRecognizer::setThreshold ( double val)
纯虚函数

设置模型的阈值。

实现在 cv::face::BasicFaceRecognizercv::face::LBPHFaceRecognizer 中。

◆ train()

virtual void cv::face::FaceRecognizer::train ( InputArrayOfArrays src,
InputArray labels )
纯虚函数
Python
cv.face.FaceRecognizer.train(src, labels) ->

使用给定数据和相关标签训练一个 FaceRecognizer

参数
src训练图像,即您想要学习的人脸。数据必须以 vector<Mat> 的形式给出。
labels与图像对应的标签必须以 vector<int> 或类型为 CV_32SC1 的 Mat 形式给出。

以下源代码片段展示了如何在一给定图像集上学习 Fisherfaces 模型。图像通过 imread 读取并推入 std::vector<Mat>。每幅图像的标签存储在 std::vector<int> 中(您也可以使用类型为 CV_32SC1 的 Mat)。将标签视为此图像所属的主体(人物),因此相同的主体(人物)应具有相同的标签。对于可用的 FaceRecognizer,您无需关注标签的顺序,只需确保相同的人具有相同的标签即可

// 存储图像和标签
vector<Mat> images;
vector<int> labels;
// 使用 CV_32SC1 类型的 Mat
// Mat labels(number_of_samples, 1, CV_32SC1);
// 第一个人脸图像
images.push_back(imread("person0/0.jpg", IMREAD_GRAYSCALE)); labels.push_back(0);
images.push_back(imread("person0/1.jpg", IMREAD_GRAYSCALE)); labels.push_back(0);
images.push_back(imread("person0/2.jpg", IMREAD_GRAYSCALE)); labels.push_back(0);
// 第二个人脸图像
images.push_back(imread("person1/0.jpg", IMREAD_GRAYSCALE)); labels.push_back(1);
images.push_back(imread("person1/1.jpg", IMREAD_GRAYSCALE)); labels.push_back(1);
images.push_back(imread("person1/2.jpg", IMREAD_GRAYSCALE)); labels.push_back(1);

现在您已经读取了一些图像,我们可以创建一个新的 FaceRecognizer。在此示例中,我将创建一个 Fisherfaces 模型并决定保留所有可能的 Fisherfaces

// 创建一个新的 Fisherfaces 模型并保留所有可用的 Fisherfaces,
// 这是此特定 FaceRecognizer 最常见的用法
//
static Ptr< FisherFaceRecognizer > create(int num_components=0, double threshold=DBL_MAX)

最后,在给定数据集(人脸图像和标签)上训练它

// 这是训练所有可用 cv::FaceRecognizer 的通用接口
// 实现
//
model->train(images, labels);

◆ update()

virtual void cv::face::FaceRecognizer::update ( InputArrayOfArrays src,
InputArray labels )
virtual
Python
cv.face.FaceRecognizer.update(src, labels) ->

使用给定数据和相关标签更新一个 FaceRecognizer

参数
src训练图像,即您想要学习的人脸。数据必须以 vector<Mat> 的形式给出。
labels与图像对应的标签必须以 vector<int> 或类型为 CV_32SC1 的 Mat 形式给出。

此方法更新一个(可能已训练的)FaceRecognizer,但仅当算法支持时。局部二值模式直方图(LBPH)识别器(参见 createLBPHFaceRecognizer)可以更新。对于 Eigenfaces 和 Fisherfaces 方法,这在算法上是不可能的,您必须使用 FaceRecognizer::train 重新估计模型。无论如何,调用 train 会清空现有模型并学习一个新模型,而 update 不会删除任何模型数据。

// 创建一个新的 LBPH 模型(它可以更新)并使用默认参数,
// 这是此特定 FaceRecognizer 最常见的用法
//
// 这是训练所有可用 cv::FaceRecognizer 的通用接口
// 实现
//
model->train(images, labels);
// 用于存储新图像的一些容器
vector<Mat> newImages;
vector<int> newLabels;
// 您应该向容器中添加一些图像
//
// ...
//
// 现在更新模型就像调用一样简单
model->update(newImages,newLabels);
// 这将保留旧模型数据并扩展现有模型
// 使用从 newImages 中提取的新特征!
static Ptr< LBPHFaceRecognizer > create(int radius=1, int neighbors=8, int grid_x=8, int grid_y=8, double threshold=DBL_MAX)

在不支持更新的 Eigenfaces 模型上调用 update(参见 EigenFaceRecognizer::create)将抛出类似如下的错误

OpenCV 错误:函数/功能未实现(此 FaceRecognizer (FaceRecognizer.Eigenfaces) 不支持更新,您必须使用 FaceRecognizer::trainupdate 它。)在文件 /home/philipp/git/opencv/modules/contrib/src/facerec.cpp 的 line 305
terminate called after throwing an instance of 'cv::Exception'
所有人脸识别模型的抽象基类。
定义 face.hpp:158
virtual void update(InputArrayOfArrays src, InputArray labels)
使用给定数据和相关标签更新 FaceRecognizer。
virtual void train(InputArrayOfArrays src, InputArray labels)=0
使用给定数据和相关标签训练 FaceRecognizer。
void terminate(int code, const String &err, const char *func, const char *file, int line) CV_NOEXCEPT
发出错误信号并终止应用程序。
void line(InputOutputArray img, Point pt1, Point pt2, const Scalar &color, int thickness=1, int lineType=LINE_8, int shift=0)
绘制连接两点的线段。
注意
FaceRecognizer 不存储您的训练图像,因为这将消耗大量内存,并且这不是 FaceRecognizer 的职责。调用者负责维护他想要处理的数据集。

◆ write() [1/2]

virtual void cv::face::FaceRecognizer::write ( const String & filename) const
virtual
Python
cv.face.FaceRecognizer.write(filename) ->

保存一个 FaceRecognizer 及其模型状态。

将此模型保存到给定文件名,可以是 XML 或 YAML 格式。

参数
filename用于存储此 FaceRecognizer 的文件名(XML/YAML 均可)。

每个 FaceRecognizer 都重写 FaceRecognizer::save(FileStorage& fs) 以保存内部模型状态。FaceRecognizer::save(const String& filename) 将模型状态保存到给定的文件名。

后缀 const 表示预测不影响内部模型状态,因此该方法可以安全地从不同线程中调用。

重新实现于 cv::face::BasicFaceRecognizer

◆ write() [2/2]

virtual void cv::face::FaceRecognizer::write ( FileStorage & fs) const
纯虚函数
Python
cv.face.FaceRecognizer.write(filename) ->

这是一个重载成员函数,为方便起见而提供。它与上述函数的唯一区别在于其接受的参数。将此模型保存到给定的 FileStorage

参数
fs用于存储此 FaceRecognizerFileStorage

重新实现自 cv::Algorithm

实现在 cv::face::BasicFaceRecognizer 中。

成员数据文档

◆ _labelsInfo

std::map<int, String> cv::face::FaceRecognizer::_labelsInfo
保护

本类的文档由以下文件生成