【電腦視覺】OpenCVFace Servicefacerec源碼分析1——FaceRecognizer概述

來源:互聯網
上載者:User

標籤: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概述

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.