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
保護

本類的文件由以下檔案生成