基于AdaBoost的人脸检测 含源码
需要完整源碼 聯(lián)系我QQ 1752744377@qq.com
基于AdaBoost的人臉檢測
一 、實(shí)驗(yàn)?zāi)康?br /> ? 掌握利用AdaBoost及級聯(lián)分類器進(jìn)行人臉檢測的基本方法,通過實(shí)驗(yàn)加深對基本概念的理解。
二 實(shí)驗(yàn)原理
人臉檢測是指對于任意一幅給定的圖像,采用一定的策略對其進(jìn)行搜索以確定其中是否含有人臉,如果是則返回人臉的位置、大小和姿態(tài)。
Adaboost核心思想是通過訓(xùn)練分類器得到檢測的目的,不僅僅是人臉,人的眼睛,人上身都可以作為檢測的對象,在Matlab以及OpenCV中都有相應(yīng)的訓(xùn)練結(jié)果可以調(diào)用,
大部分運(yùn)行效率較高的只能算法都是通過提取高效以及利于識別和處理的特征實(shí)現(xiàn)的,而Adaboost算法也是一樣的。Adaboost(Adaptive Boosting)是Freund和Schapire在PAC(ProbablyApproximately Correct)模型基礎(chǔ)上提出的一種學(xué)習(xí)模型,它的算法思想是:通過對大量正樣本和負(fù)樣本的學(xué)習(xí),通過學(xué)習(xí)的反饋,弱分類器在不知道先驗(yàn)的訓(xùn)練誤差的前提下,自適應(yīng)的調(diào)整錯誤率以及相應(yīng)的權(quán)重,直到強(qiáng)分類器達(dá)到預(yù)定的性能。
Viola等人將Adaboost算法應(yīng)用于人臉檢測,同時將Haar特征和Cascade算法和Adaboost算法結(jié)合,大大提高了檢測的速度和檢測的精確率,其論文的主要工作是:①引入了一種計(jì)算簡單卻十分有效的矩形特征(Haar特征),用來描述人臉圖片的灰度分布情況,同時提出了積分圖的概念,矩形特征和積分圖的結(jié)合有助于檢測速度的提高。②利用 Adaboost優(yōu)秀的數(shù)據(jù)挖掘能力從海量的Haar特征中,挑選出若干個具有最佳樣本分類能力的 Haar特征,將Haar特征轉(zhuǎn)化為弱分類器,最后以線性組合的方式得到最終的強(qiáng)分類器;③提出了一種由粗到精的檢測思路,構(gòu)造了一個級聯(lián)人臉檢測器:先用簡單的強(qiáng)分類器的把圖片中大部分的背景區(qū)域剔除,再逐步遞增強(qiáng)分類器的復(fù)雜度(即構(gòu)成它的弱分類器數(shù)量),不斷地過濾掉剩余的背景區(qū)域,最后通過所有強(qiáng)分類器的則為人臉窗口。這種檢測思路有效的提升了檢測速度。進(jìn)行Adaboost算法之前,必須要得到的是Haar特征,從而得到提高計(jì)算效率的積分圖:
①trainCascadeObjectDetector函數(shù)可以使用Haar特征、梯度方向直方圖(Histograms of Oriented Gradients,HOG)、局部二進(jìn)制模式(Local Binary Pattern,LBP)等實(shí)現(xiàn)目標(biāo)檢測器的訓(xùn)練,最后以xml格式的文件返回目標(biāo)檢測器的結(jié)果。
②CascadeObjectDetector,該函數(shù)可以創(chuàng)建一個目標(biāo)檢測器,它是通過Viola-Jones算法訓(xùn)練實(shí)現(xiàn)的,通過對1中訓(xùn)練得到的結(jié)果來實(shí)現(xiàn)對目標(biāo)檢測器的創(chuàng)建,同時也可以使用工具箱中已經(jīng)訓(xùn)練好的文件實(shí)現(xiàn)檢測器的創(chuàng)建。還可以通過制定目標(biāo)檢測模型指定生成的目標(biāo)檢測器的模型,這里的模型實(shí)質(zhì)目標(biāo)檢測器具體適用的檢測目標(biāo),比如眼睛、耳朵、臉等,默認(rèn)檢測目標(biāo)是臉。
③檢測器的模型通過CasacdeObjectDetector(Model)指定,其中Model是通過輸入一行字符串得到的,Model的類型包括FrontalFace(CART)、Frontal Face(LBP)、Upper Body等,默認(rèn)為FrontalFaceCART。
④BBOX = step(detector, I)可以返回的矩陣BBOX,其中矩陣的每一行可以指定檢測到目標(biāo)的矩形區(qū)域,通過矩形左上角橫、縱坐標(biāo)的以及矩形長、寬4個參數(shù)確定矩形區(qū)域。代表檢測到的目標(biāo)個數(shù)
三 實(shí)驗(yàn)步驟及程序
?1 實(shí)驗(yàn)步驟
(1)創(chuàng)建一個人臉檢測系統(tǒng)對象
(2)讀入視頻的每一幀
(3)對每一幀視頻進(jìn)行人臉檢測
(4)將檢測出的人臉在圖像上標(biāo)出并顯示
(5)對每一幀視頻進(jìn)行人臉檢測
(6)將檢測出的人臉在圖像上標(biāo)出并顯示
(7) 對每一幀視頻進(jìn)行人臉檢測
(8) 將檢測出的人臉在圖像上標(biāo)出并顯示
?2 實(shí)驗(yàn)流程圖
?
圖3-1 人臉檢測流程圖
3 實(shí)驗(yàn)程序
%創(chuàng)建一個人臉檢測系統(tǒng)對象(system object)
faceDetector=vision.CascadeObjectDetector();
%讀入視頻的每一幀
videoFileReader=vision.VideoFileReader('C:\Users\mimos\Downloads\馬云.jpg');
videoFrame=step(videoFileReader);
%對每一幀視頻進(jìn)行人臉檢測
bbox=step(faceDetector,videoFrame);
%將檢測出的人臉在圖像上標(biāo)出并顯示
boxInserter =vision.ShapeInserter('BorderColor','Custom',...
? ? 'CustomBorderColor',[255 255 0]);
videoOut=step(boxInserter,videoFrame,bbox);
figure,imshow(videoOut),title('馬云');
videoFileReader=vision.VideoFileReader('C:\Users\mimos\Downloads\老詹.jpg');
videoFrame=step(videoFileReader);
%對每一幀視頻進(jìn)行人臉檢測
bbox=step(faceDetector,videoFrame);
%將檢測出的人臉在圖像上標(biāo)出并顯示
boxInserter =vision.ShapeInserter('BorderColor','Custom',...
? ? 'CustomBorderColor',[255 255 0]);
videoOut=step(boxInserter,videoFrame,bbox);
figure,imshow(videoOut),title('老詹');
videoFileReader=vision.VideoFileReader('C:\Users\mimos\Downloads\C羅.jpg');
videoFrame=step(videoFileReader);
%對每一幀視頻進(jìn)行人臉檢測
bbox=step(faceDetector,videoFrame);
%將檢測出的人臉在圖像上標(biāo)出并顯示
boxInserter =vision.ShapeInserter('BorderColor','Custom',...
? ? 'CustomBorderColor',[255 255 0]);
videoOut=step(boxInserter,videoFrame,bbox);
figure,imshow(videoOut),title('C羅');
videoFileReader=vision.VideoFileReader('C:\Users\mimos\Downloads\喬幫主.jpg');
videoFrame=step(videoFileReader);
%對每一幀視頻進(jìn)行人臉檢測
bbox=step(faceDetector,videoFrame);
%將檢測出的人臉在圖像上標(biāo)出并顯示
boxInserter =vision.ShapeInserter('BorderColor','Custom',...
? ? 'CustomBorderColor',[255 255 0]);
videoOut=step(boxInserter,videoFrame,bbox);
figure,imshow(videoOut),title('喬幫主');
videoFileReader=vision.VideoFileReader('C:\Users\mimos\Downloads\梅西.jpg');
videoFrame=step(videoFileReader);
%對每一幀視頻進(jìn)行人臉檢測
bbox=step(faceDetector,videoFrame);
%將檢測出的人臉在圖像上標(biāo)出并顯示
boxInserter =vision.ShapeInserter('BorderColor','Custom',...
? ? 'CustomBorderColor',[255 255 0]);
videoOut=step(boxInserter,videoFrame,bbox);
figure,imshow(videoOut),title('梅西');
videoFileReader=vision.VideoFileReader('C:\Users\mimos\Downloads\張國榮.jpg');
videoFrame=step(videoFileReader);
%對每一幀視頻進(jìn)行人臉檢測
bbox=step(faceDetector,videoFrame);
%將檢測出的人臉在圖像上標(biāo)出并顯示
boxInserter =vision.ShapeInserter('BorderColor','Custom',...
? ? 'CustomBorderColor',[255 255 0]);
videoOut=step(boxInserter,videoFrame,bbox);
figure,imshow(videoOut),title('張國榮');
videoFileReader=vision.VideoFileReader('C:\Users\mimos\Downloads\鳳姐.jpg');
videoFrame=step(videoFileReader);
%對每一幀視頻進(jìn)行人臉檢測
bbox=step(faceDetector,videoFrame);
%將檢測出的人臉在圖像上標(biāo)出并顯示
boxInserter =vision.ShapeInserter('BorderColor','Custom',...
? ? 'CustomBorderColor',[255 255 0]);
videoOut=step(boxInserter,videoFrame,bbox);
figure,imshow(videoOut),title('鳳姐 face');
videoFileReader=vision.VideoFileReader('C:\Users\mimos\Downloads\周立波.jpg');
videoFrame=step(videoFileReader);
%對每一幀視頻進(jìn)行人臉檢測
bbox=step(faceDetector,videoFrame);
%將檢測出的人臉在圖像上標(biāo)出并顯示
boxInserter =vision.ShapeInserter('BorderColor','Custom',...
? ? 'CustomBorderColor',[255 255 0]);
videoOut=step(boxInserter,videoFrame,bbox);
figure,imshow(videoOut),title('周立波');
videoFileReader=vision.VideoFileReader('C:\Users\mimos\Downloads\達(dá)康書記.jpg');
videoFrame=step(videoFileReader);
%對每一幀視頻進(jìn)行人臉檢測
bbox=step(faceDetector,videoFrame);
%將檢測出的人臉在圖像上標(biāo)出并顯示
boxInserter =vision.ShapeInserter('BorderColor','Custom',...
? ? 'CustomBorderColor',[255 255 0]);
videoOut=step(boxInserter,videoFrame,bbox);
figure,imshow(videoOut),title('達(dá)康書記');
videoFileReader=vision.VideoFileReader('C:\Users\mimos\Downloads\白百合.jpg');
videoFrame=step(videoFileReader);
%對每一幀視頻進(jìn)行人臉檢測
bbox=step(faceDetector,videoFrame);
%將檢測出的人臉在圖像上標(biāo)出并顯示
boxInserter =vision.ShapeInserter('BorderColor','Custom',...
? ? 'CustomBorderColor',[255 255 0]);
videoOut=step(boxInserter,videoFrame,bbox);
figure,imshow(videoOut),title('白百合');
videoFileReader=vision.VideoFileReader('C:\Users\mimos\Downloads\王思聰.jpg');
videoFrame=step(videoFileReader);
%對每一幀視頻進(jìn)行人臉檢測
bbox=step(faceDetector,videoFrame);
%將檢測出的人臉在圖像上標(biāo)出并顯示
boxInserter =vision.ShapeInserter('BorderColor','Custom',...
? ? 'CustomBorderColor',[255 255 0]);
videoOut=step(boxInserter,videoFrame,bbox);
figure,imshow(videoOut),title('王思聰');}
四 實(shí)驗(yàn)結(jié)果與分析
運(yùn)用AdoBoost算法對含有不同人不同場景的檢測如下圖所示。
?
圖4-1 多人臉圖像識別
? ? ? ?
圖4-2單人臉圖像檢測結(jié)果
?
從檢測結(jié)果可以看出,運(yùn)用AdoBoost算法進(jìn)行不同人不同場景下的人臉識別效果很好。但依舊存在一些問題,有時也會出現(xiàn)一些識別錯誤,比如多人識別時識別側(cè)臉時或有問題。此時我們需要處理好弱分類器閾值、特征值相差程度等,以降低區(qū)間率而同時達(dá)到較高的檢測率。 ??
基于圖像的人臉檢測方法具有很強(qiáng)的適應(yīng)能力和魯棒性,但由于需要對所有
可能的檢測窗口進(jìn)行窮舉搜索,因此計(jì)算復(fù)雜度高;而且這類方法需要消耗大量的時間和精力收集和訓(xùn)練樣本,特別是非人臉樣本的選取仍存在很大的困難。
綜上所述,人們在人臉檢測領(lǐng)域做了大量工作,提出了許多方法,但現(xiàn)有的系統(tǒng)仍存在對限制條件要求較嚴(yán)格、魯棒性較差、誤檢率過高等缺點(diǎn),這些也限制了人臉識別系統(tǒng)的應(yīng)用范圍。所以進(jìn)一步利用人臉的灰度分布、幾何形狀、膚色、紋理、運(yùn)動等知識研究適應(yīng)性強(qiáng)、分割精度高的快速算法仍是人們未來的工作,因而人臉檢測方法的發(fā)展方向是建立更有效的人臉描述和搜索計(jì)算策略模型。
總結(jié)
以上是生活随笔為你收集整理的基于AdaBoost的人脸检测 含源码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android版局域网限速,局域网手机W
- 下一篇: linux tc 限速,TC限速