簡體   English   中英

如何使用具有面部特征的openCV訓練支持向量機(svm)分類器?

[英]How to train a Support Vector Machine(svm) classifier with openCV with facial features?

我想使用svm分類器進行面部表情檢測。 我知道opencv有一個svm api,但我不知道應該用什么來訓練分類器。 到目前為止,我已經閱讀了很多論文,所有這些都是在面部特征檢測后訓練分類器時說的。

到目前為止我做了什么,

  1. 人臉檢測,
  2. 每幀中16個面部點計算。 下面是面部特征檢測的輸出![輸入圖像說明
  3. 保持特征的矢量指向像素地址 這里

注意:我知道如何只用正片和負片訓練SVM,我在這里看到了這段代碼,但我不知道如何將面部特征信息與它結合起來。

有人可以幫我開始用svm進行分類。

一個。 什么應該是訓練分類器的樣本輸入?

如何使用此面部特征點訓練分類器?

問候,

opencv中的機器學習算法都帶有類似的界面。 為了訓練它,你傳遞一個NxM Mat offeatures(N行,每個特征一行長度為M)和一個帶有類標簽的Nx1 Mat。 像這樣:

//traindata      //trainlabels

f e a t u r e    1 
f e a t u r e    -1
f e a t u r e    1
f e a t u r e    1
f e a t u r e    -1

對於預測,您以相同的方式填充1行的Mat,它將返回預測的標簽

所以,比方說,你的16個面部點存儲在一個矢量中,你會這樣做:

Mat trainData; // start empty
Mat labels;

for all facial_point_vecs:
{
    for( size_t i=0; i<16; i++ )
    {
        trainData.push_back(point[i]);
    }
    labels.push_back(label); // 1 or -1
}
// now here comes the magic:
// reshape it, so it has N rows, each being a flat float, x,y,x,y,x,y,x,y... 32 element array
trainData = trainData.reshape(1, 16*2); // numpoints*2 for x,y

// we have to convert to float:
trainData.convertTo(trainData,CV_32F);

SVM svm; // params omitted for simplicity (but that's where the *real* work starts..)
svm.train( trainData, labels );


//later predict:
vector<Point> points;
Mat testData = Mat(points).reshape(1,32); // flattened to 1 row
testData.convertTo(testData ,CV_32F);
float p = svm.predict( testData );

面部姿勢識別是一個廣泛研究的問題,通過對現有文獻的深入研究可以找到您需要使用的適當特征。 一旦你擁有了你認為很好的特征描述符,你就可以繼續訓練SVM。 一旦您使用最佳參數(通過交叉驗證找到)訓練SVM,就可以開始在看不見的數據上測試SVM模型,並報告准確性。 總的來說,這就是管道。

現在關於SVM的部分:

SVM是一個二元分類器 - 它可以區分兩個類(盡管它也可以擴展到多個類)。 OpenCV在ML庫中有一個內置的SVM模塊。 SVM類有兩個函數開始: train(..)predict(..) 要訓​​練分類器,您可以在輸入中輸入大量的樣本特征描述符及其類標簽(通常為-1和+1)。 請記住OpenCV支持的格式:每個訓練樣本都必須是行向量。 並且每行在標簽向量中將具有一個對應的類標簽。 因此,如果您有一個長度為n的描述符,並且您有m這樣的樣本描述符,那么您的訓練矩陣將是mxnm行,每個長度為n ),標簽向量的長度為m 還有一個SVMParams對象,其中包含SVM類型等屬性以及您必須指定的C參數值。

一旦經過訓練,您可以從圖像中提取特征,將其轉換為單行格式,並提供predict() ,它將告訴您它屬於哪個類(+1或-1)。

還有一個具有類似參數的train_auto() ,其格式類似,可以為您提供SVM參數的最佳值。

另請查看詳細的SO答案以查看示例。

編輯:假設您有一個返回特征向量的特征描述符,算法將類似於:

Mat trainingMat, labelsMat;
for each image in training database:
  feature = extractFeatures( image[i] );
  Mat feature_row = alignAsRow( feature );
  trainingMat.push_back( feature_row );
  labelsMat.push_back( -1 or 1 );  //depending upon class.
mySvmObject.train( trainingMat, labelsMat, Mat(), Mat(), mySvmParams );

我不認為extractFeatures()alignAsRow()是現有函數,您可能需要自己編寫它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM