1. 程式人生 > >opencv 人臉識別 (二)訓練和識別

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學習筆記-對xmlyaml檔案的讀寫操作

一.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強化ParametersResult

pan har java onf 關系 throws efault type throw 本文通過一個簡單例子簡單記錄下參數的映射。轉載註明出處:http://www.cnblogs.com/wdfwolf3/p/6804243.html,謝謝。文件目錄如下, 1.配置文

SSM項目搭建mybatisspring的集成

刪除 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後臺快速搭建在阿裏雲(pm2nginx篇)

logs down key version c-c 6.2 文檔 實例 gin 前期準備 阿裏雲服務器 node.js pm2 express nginx linux(推薦教程:鳥哥的私房菜) 簡介 嗯……我只是

【計算機網絡】詳解網絡層ARPRARP

博文 拆分 detail 動態 再次 tcp 將在 ont 關於 ARP ARP(Address Resolution Protocol,地址解析協議)是將IP地址解析為以太網MAC地址(物理地址)的協議。在局域網中,當主機或其他網絡設備有數據要發送給另一個主機或設備時,它

C# Stream篇 -- TextReader StreamReader

ros 開頭 設置 block 哪些 {0} 實例 adt 一點 TextReader 和StreamReader 目錄: 為什麽要介紹 TextReader? TextReader的常用屬性和方法 TextReader 示例 從StreamReader想到多態 簡單介紹下