標籤:opencv 機器學習
FaceRecognizer類
OpenCV中所有Face Service的模型都是繼承自FaceRecognizer這個基類,這個類提供了Face Service演算法的統一介面。
class FaceRecognizer : public Algorithm{public: //! virtual destructor virtual ~FaceRecognizer() {} // Trains a FaceRecognizer. virtual void train(InputArray src, InputArray labels) = 0; // Updates a FaceRecognizer. virtual void update(InputArrayOfArrays src, InputArray labels); // Gets a prediction from a FaceRecognizer. virtual int predict(InputArray src) const = 0; // Predicts the label and confidence for a given sample. virtual void predict(InputArray src, int &label, double &confidence) const = 0; // Serializes this object to a given filename. virtual void save(const string& filename) const; // Deserializes this object from a given filename. virtual void load(const string& filename); // Serializes this object to a given cv::FileStorage. virtual void save(FileStorage& fs) const = 0; // Deserializes this object from a given cv::FileStorage. virtual void load(const FileStorage& fs) = 0;};
Algorithm類
Algorithm所有的衍生類別都提供了一下功能:
- 虛擬構造器。每個繼承Algorithm的演算法在程式開始時註冊,你可以得到登入演算法的列表,並且根據指定演算法名字來建立一個執行個體。如果你想添加自己的演算法,比較好的方法是在你演算法名上添加一個首碼,以示區別。(詳見Algorithm::create())
- 通過參數名來設定或檢索參數。Algorithm可以通過你指定參數名字串來提供這樣的功能。(詳見Algorithm::set()、Algorithm::get())
- 從XML或YAML檔案中讀寫參數。每個演算法都可以將參數寫到檔案中,並且在需要時讀出參數。
FaceRecognizer支援的介面
- FaceRecognizer::train()用於將人臉映像資料進行訓練
- 根據一張輸入的人臉圖片進行預測
- 從指定XML或YAML檔案中上傳或儲存模型參數
設定閾值
Face Service的一個常用情景是待識別人臉是不是輸入訓練資料集。這個閾值的設定是在具體的FaceRecognizer的構造器中,並通過從Algorithm繼承的set和get方法來使用閾值。
建立模型時設定閾值
// Let‘s say we want to keep 10 Eigenfaces and have a threshold value of 10.0int num_components = 10;double threshold = 10.0;// Then if you want to have a cv::FaceRecognizer with a confidence threshold,// create the concrete implementation with the appropiate parameters:Ptr<FaceRecognizer> model = createEigenFaceRecognizer(num_components, threshold);
運行程式時擷取或設定閾值
// The following line reads the threshold from the Eigenfaces model:double current_threshold = model->getDouble("threshold");// And this line sets the threshold to 0.0:model->set("threshold", 0.0);
將閾值設定為0.0,如果預測類別號為-1,則說明人臉時未知的,沒有在資料庫中記錄
Mat img = imread("person1/3.jpg", CV_LOAD_IMAGE_GRAYSCALE);// Get a prediction from the model. Note: We‘ve set a threshold of 0.0 above,// since the distance is almost always larger than 0.0, you‘ll get -1 as// label, which indicates, this face is unknownint predicted_label = model->predict(img);
FaceRecognizer函數介面FaceRecognizer::train
函數定義:
void FaceRecognizer::train(InputArrayOfArrays src, InputArray labels) = 0
函數參數為訓練的圖片,類型為vector<Mat>;圖片所對應的標籤,類型為vector<int>。
FaceRecognizer::update
函數定義:
void FaceRecognizer::update(InputArrayOfArrays src, InputArray labels)
該方法為更新一個模型(條件是給模型可以被更新,在OpenCV中提供的Face Service演算法中,只有LBP長條圖的方法才可以被更新),更新和訓練介面的區別是,訓練是清空已有的模型,學習一個新的模型,而更新不會刪除之前的模型資料。
FaceRecognizer::predict
函數定義:
int FaceRecognizer::predict(InputArray src) const = 0void FaceRecognizer::predict(InputArray src, int& label, double& confidence) const = 0
第三個參數是對於預測類別的相關信賴度。
const尾碼表示predict函數不會影響模型內部狀態,所以這個方法可以安全被不同線程調用。
下面的小例子是根據訓練模型來進行預測。
using namespace cv;// Do your initialization here (create the cv::FaceRecognizer model) ...// ...Mat img = imread("person1/3.jpg", CV_LOAD_IMAGE_GRAYSCALE);// Some variables for the predicted label and associated confidence (e.g. distance):int predicted_label = -1;double predicted_confidence = 0.0;// Get the prediction and associated confidence from the modelmodel->predict(img, predicted_label, predicted_confidence);
FaceRecognizer::save
函數定義:
void FaceRecognizer::save(const string& filename) constvoid FaceRecognizer::save(FileStorage& fs) const
第一個定義是根據XML或者YAML檔案名稱來儲存模型,第二個定義是將模型存成FileStorage執行個體。
FaceRecognizer::load
函數定義:
void FaceRecognizer::load(const string& filename)void FaceRecognizer::load(const FileStorage& fs) = 0
這裡載入模型參數和save函數的參數意義一樣。
建立模型介面
Ptr<FaceRecognizer> createEigenFaceRecognizer(int num_components=0, double threshold=DBL_MAX);Ptr<FaceRecognizer> createFisherFaceRecognizer(int num_components=0, double threshold=DBL_MAX);Ptr<FaceRecognizer> createLBPHFaceRecognizer(int radius=1, int neighbors=8, int grid_x=8, int grid_y=8, double threshold=DBL_MAX);
這三個介面分別對應OpenCV的三個Face Service演算法,均返回一個智能指標Ptr類的執行個體。
小結
這一小節,介紹了OpenCV中Face Service功能對應的類FaceRecognizer的大體架構,介紹了相關介面和使用方法。在後面的部落格,將具體以LBPH演算法為例,介紹其原理和匹配源碼。
參考資料
OpenCV doc:Algorithm
轉載請註明作者Jason Ding及其出處
Github首頁(http://jasonding1354.github.io/)
CSDN部落格(http://blog.csdn.net/jasonding1354)
簡書首頁(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)
【電腦視覺】OpenCVFace Servicefacerec源碼分析1——FaceRecognizer概述