![](/img/trans.png)
[英]error /usr/include/opencv2/nonfree/features2d.hpp error vector in opencv on ubuntu
[英]How to train a Support Vector Machine(svm) classifier with openCV with facial features?
我想使用svm分類器進行面部表情檢測。 我知道opencv有一個svm api,但我不知道應該用什么來訓練分類器。 到目前為止,我已經閱讀了很多論文,所有這些都是在面部特征檢測后訓練分類器時說的。
到目前為止我做了什么,
注意:我知道如何只用正片和負片訓練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
這樣的樣本描述符,那么您的訓練矩陣將是mxn
( m
行,每個長度為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.