opencv 人臉識別 (二)訓練和識別
上一篇中我們對訓練資料做了一些預處理,檢測出人臉並儲存在\pic\color\x資料夾下(x=1,2,3,...類別號),本文做訓練和識別。為了識別,首先將人臉訓練資料 轉為灰度、對齊、歸一化,再放入分類器(EigenFaceRecognizer),最後用訓練出的model進行predict。
-----------------------------------------
環境:vs2010+opencv 2.4.6.0
特徵:eigenface
Input:一個人臉資料庫,15個人,每人20個樣本(左右)。
Output:人臉檢測,並識別出每張檢測到的人臉。
-----------------------------------------
1. 為訓練資料預處理( 轉為灰度、對齊、歸一化 )
- 轉為灰度和對齊是後面做訓練時EigenFaceRecognizer的要求;
- 歸一化是防止光照帶來的影響
在上一篇的 2.2 Prehelper.cpp檔案中加入函式
void resizeandtogray(char* dir,int k, vector<Mat> &images, vector<int> &labels,
vector<Mat> &testimages, vector<int> &testlabels);
void resizeandtogray(char* dir,int K, vector<Mat> &images, vector<int> &labels, vector<Mat> &testimages, vector<int> &testlabels) { IplImage* standard = cvLoadImage("D:\\privacy\\picture\\photo\\2.jpg",CV_LOAD_IMAGE_GRAYSCALE); string cur_dir; char id[5]; int i,j; for(int i=1; i<=K; i++) { cur_dir = dir; cur_dir.append("gray\\"); _itoa(i,id,10); cur_dir.append(id); const char* dd = cur_dir.c_str(); CStatDir statdir; if (!statdir.SetInitDir(dd)) { puts("Dir not exist"); return; } cout<<"Processing samples in Class "<<i<<endl; vector<char*>file_vec = statdir.BeginBrowseFilenames("*.*"); for (j=0;j<file_vec.size();j++) { IplImage* cur_img = cvLoadImage(file_vec[j],CV_LOAD_IMAGE_GRAYSCALE); cvResize(cur_img,standard,CV_INTER_AREA); Mat cur_mat = cvarrToMat(standard,true),des_mat; cv::normalize(cur_mat,des_mat,0, 255, NORM_MINMAX, CV_8UC1); cvSaveImage(file_vec[j],cvCloneImage(&(IplImage) des_mat)); if(j!=file_vec.size()) { images.push_back(des_mat); labels.push_back(i); } else { testimages.push_back(des_mat); testlabels.push_back(i); } } cout<<file_vec.size()<<" images."<<endl; } }
並在main中呼叫:
int main( ) { CvCapture* capture = 0; Mat frame, frameCopy, image; string inputName; int mode; char dir[256] = "D:\\Courses\\CV\\Face_recognition\\pic\\"; //preprocess_trainingdata(dir,K); //face_detection and extract to file vector<Mat> images,testimages; vector<int> labels,testlabels; resizeandtogray(dir,K,images,labels,testimages,testlabels); //togray, normalize and resize system("pause"); return 0; }
2. 訓練
有了vector<Mat> images,testimages;vector<int> labels,testlabels; 可以開始訓練了,我們採用EigenFaceRecognizer建模。
在Prehelper.cpp中加入函式
Ptr<FaceRecognizer> Recognition(vector<Mat> images, vector<int> labels,vector<Mat> testimages, vector<int> testlabels);
Ptr<FaceRecognizer> Recognition(vector<Mat> images, vector<int> labels,
vector<Mat> testimages, vector<int> testlabels)
{
Ptr<FaceRecognizer> model = createEigenFaceRecognizer(10);//10 Principal components
cout<<"train"<<endl;
model->train(images,labels);
int i,acc=0,predict_l;
for (i=0;i<testimages.size();i++)
{
predict_l = model->predict(testimages[i]);
if(predict_l != testlabels[i])
{
cout<<"An error in recognition: sample "<<i+1<<", predict "<<
predict_l<<", groundtruth "<<testlabels[i]<<endl;
imshow("error 1",testimages[i]);
waitKey();
}
else
acc++;
}
cout<<"Recognition Rate: "<<acc*1.0/testimages.size()<<endl;
return model;
}
Recognization()輸出分錯的樣本和正確率,最後返回建模結果Ptr<FaceRecognizer> model
主函式改為:
int main( )
{
CvCapture* capture = 0;
Mat frame, frameCopy, image;
string inputName;
int mode;
char dir[256] = "D:\\Courses\\CV\\Face_recognition\\pic\\";
//preprocess_trainingdata(dir,K); //face_detection and extract to file
vector<Mat> images,testimages;
vector<int> labels,testlabels;
//togray, normalize and resize; load to images,labels,testimages,testlabels
resizeandtogray(dir,K,images,labels,testimages,testlabels);
//recognition
Ptr<FaceRecognizer> model = Recognition(images,labels,testimages,testlabels);
char* dirmodel = new char [256];
strcpy(dirmodel,dir); strcat(dirmodel,"model.out");
FILE* f = fopen(dirmodel,"w");
fwrite(model,sizeof(model),1,f);
system("pause");
return 0;
}
最終結果:一個錯分樣本,正確率93.3%
關於Computer Vision更多的學習資料將繼續更新,敬請關注本部落格和新浪微博Rachel Zhang。
相關推薦
opencv 人臉識別 (二)訓練和識別
上一篇中我們對訓練資料做了一些預處理,檢測出人臉並儲存在\pic\color\x資料夾下(x=1,2,3,...類別號),本文做訓練和識別。為了識別,首先將人臉訓練資料 轉為灰度、對齊、歸一化,再放入分類器(EigenFaceRecognizer),最後用訓練出的model進
人臉識別(二)——訓練分類器
上一篇簡單整理了下人臉識別的相關基礎知識,這一篇將著重介紹利用pencv(2.4.9)已有的模型進行分類器訓練。 一、關於ORL人臉資料庫 ORL是一個40個人,每人採取10張人臉頭像構成的一
CTC學習筆記(二) 訓練和公式推導
整體思路 訓練流程和傳統的神經網路類似,構建loss function,然後根據BP演算法進行訓練,不同之處在於傳統的神經網路的訓練準則是針對每幀資料,即每幀資料的訓練誤差最小,而CTC的訓練準則是基於序列(比如語音識別的一整句話)的,比如最大化p(z|x
OpenCV學習記錄(二):自己訓練haar特徵的adaboost分類器進行人臉識別
上一篇文章中介紹瞭如何使用OpenCV自帶的haar分類器進行人臉識別(點我開啟)。 這次我試著自己去訓練一個haar分類器,前後花了兩天,最後總算是訓練完了。不過效果並不是特別理想,由於我是在自己的筆記本上進行訓練,為減少訓練時間我的樣本量不是很大,最後也只是勉強看看效果了
java實現opencv人臉識別(二)
Java下使用opencv進行人臉檢測 工作需要,研究下人臉識別,發現opencv比較常用,儘管能檢測人臉,但識別率不高,多數是用來獲取攝像頭的視訊流的,提取裡面的視訊幀,實現人臉識別時通常會和其他框架搭配使用,比如face_recognition、SeetaFace En
opencv 人臉識別 (一)訓練樣本的處理
本文實現基於eigenface的人臉檢測與識別。給定一個影象資料庫,進行以下步驟:進行人臉檢測,將檢測出的人臉存入資料庫2對資料庫2進行人臉建模在測試集上進行recognition本篇實現第一步:進行人臉檢測,將檢測出的人臉存入資料庫2環境:vs2010+opencv 2.4
人臉識別之人臉檢測(二)--人臉識別樣本製作及訓練測試
閒得沒事,折騰下opencv 人臉識別,從樣本製作到評估。 1.直接copy opencv裡的原始碼,建立工程,新增opencv庫,可以直接cmake原始碼,但我之所以自己建立工程,是想多學習,並且降低與原始碼框架的耦合度。 這裡如果出現_imp__CreateToo
人臉檢測(二)--人臉識別樣本製作及訓練測試
閒得沒事,折騰下opencv 人臉識別,從樣本製作到評估。 1.直接copy opencv裡的原始碼,建立工程,新增opencv庫,可以直接cmake原始碼,但我之所以自己建立工程,是想多學習,並且降低與原始碼框架的耦合度。 這裡如果出現_imp__CreateToolb
OpenCV儀表資料識別(二):數字區域自動定位
下載和配置Opencv在網上和書上有很多的講解,這裡不再贅述。 此處附上Opencv的下載連結。 想要對圖片中的數字資訊進行識別首先要對圖片進行預處理,排除干擾的因素,只留下有價值的資訊。 這裡需要兩張圖,一張為有資料的圖片,一張為儀表關閉時沒有資料的圖
opencv學習筆記(二)-對xml和yaml檔案的讀寫操作
一.xml和yaml的簡單介紹 所謂的xml,就是eXtensible Markup Language, 翻譯成中文就是“可擴充套件標識語言“。首先XML是一種元標記語言,所謂“元標記”就是開發者可以根據自己的需要定義自己的標記,比如開發者可以定義如下標記&
百度大腦人臉識別深度驗證與思考(二)之年齡識別
環境 win7 32位 VisualStudio2017 python3.6.3 opencv3.3.1 pyQt5.9 baidu-AIP 1.6.9.0 特別宣告 所有圖片均來自網路
人臉識別(二)呼叫face++api實現人臉對比
上次部落格簡單講了一下呼叫face++的api來檢測人臉。當然,生產環境中要實現複雜的需求光靠這麼簡單的呼叫一下api肯定是不行的。這次先來講一講face++中實現人臉對比的api並實現一些相對較為複雜的需求。 首先來看一看呼叫的人臉對比的api需要的東西:
OpenCV+kinect1.0手語識別(二)手部區域的摳圖與跟蹤
上一篇文章中我們學習了深度流和骨骼流的處理。我們的終極目標是手語識別,因此首先需要手部區域的跟蹤與摳圖(所謂摳圖就是背景分割) 思路:從骨骼流中提取手心結點的座標,以此座標為中心確定手掌所在區域;其中跟蹤的實現依託於骨骼流的結點跟蹤(體會到了kinect的方便),摳圖依託
OpenCV 學習日記(二)---牛刀小試:輸入輸出影象和視訊
作者:teeyohuang 本文系交流學習使用,轉載請註明出處,謝謝 於 2016/6/15 Visual studio2010 + openCV 2.4.9 這一部分主要是舉了幾個簡單的例子,以便大家對openCV有個初步的瞭解。宣告一下,這幾個例子,包
mybatis強化(二)Parameters和Result
pan har java onf 關系 throws efault type throw 本文通過一個簡單例子簡單記錄下參數的映射。轉載註明出處:http://www.cnblogs.com/wdfwolf3/p/6804243.html,謝謝。文件目錄如下, 1.配置文
SSM項目搭建(二)mybatis和spring的集成
刪除 internal code odi 自動獲取 over 初級 character upload 上一篇文章大概搭建了一下ssm的框架,其實還是不完整,我們往項目中添加了spring和mybatis的配置文件,還差一個spring mvc的配置文件,在resource中
OpenCV入門筆記(二) 圖片的文件操作
strong asc nump str destroy type convert 代碼 creat 以下介紹一下重要的幾個,設計基本 圖片處理 的函數,依次來了解OpenCV的入門知識。具體的具體使用方法還是以官方的API【Official Tutori
node.js後臺快速搭建在阿裏雲(二)(pm2和nginx篇)
logs down key version c-c 6.2 文檔 實例 gin 前期準備 阿裏雲服務器 node.js pm2 express nginx linux(推薦教程:鳥哥的私房菜) 簡介 嗯……我只是
【計算機網絡】詳解網絡層(二)ARP和RARP
博文 拆分 detail 動態 再次 tcp 將在 ont 關於 ARP ARP(Address Resolution Protocol,地址解析協議)是將IP地址解析為以太網MAC地址(物理地址)的協議。在局域網中,當主機或其他網絡設備有數據要發送給另一個主機或設備時,它
C# Stream篇(二) -- TextReader 和StreamReader
ros 開頭 設置 block 哪些 {0} 實例 adt 一點 TextReader 和StreamReader 目錄: 為什麽要介紹 TextReader? TextReader的常用屬性和方法 TextReader 示例 從StreamReader想到多態 簡單介紹下