日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人工智能 > pytorch >内容正文

pytorch

Viola-Jones人脸检测详解

發(fā)布時(shí)間:2024/7/23 pytorch 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Viola-Jones人脸检测详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在人臉檢測(cè)中,Viola-Jones算法是一種非常經(jīng)典的算法,該算法在2001年的CVPR上提出,因其高效快速的檢測(cè)而被廣泛使用。

這個(gè)算法用來(lái)檢測(cè)正面的人臉圖像,對(duì)于側(cè)臉圖像的檢測(cè)不是很穩(wěn)健。

算法可以被分為以下幾個(gè)部分:

  • 利用Haar特征描述人臉特征
  • 建立積分圖像,利用該圖像快速獲取幾種不同的矩形特征
  • 利用Adaboost算法進(jìn)行訓(xùn)練
  • 建立層級(jí)分類器
  • 非極大值抑制

1?利用Haar特征描述人臉特征

人臉有一些特征,一張正臉圖像中,人眼睛區(qū)域會(huì)比臉頰區(qū)域暗,嘴唇區(qū)域也會(huì)比四周的區(qū)域暗,但鼻子區(qū)域會(huì)比兩邊臉頰要亮。

基于這些特征,VJ使用了四種矩形特征,如下圖所示

其中A,B為邊界特征,C為細(xì)線特征,D為對(duì)角線特征

那么,Haar特征是如何作用于正臉圖像的呢?

如上圖所示,Haar特征分別對(duì)白色區(qū)域和黑色區(qū)域的像素求和,然后求這兩種和的差;

這可以通過(guò)圖像卷積實(shí)現(xiàn)。

?

2 積分圖像

對(duì)于積分圖像中的任何一點(diǎn),該點(diǎn)的積分圖像值等于位于該點(diǎn)左上角所有像素之和

表達(dá)式如下:

積分圖像滿足如下公式:

積分圖像同時(shí)還滿足:

上圖為一張?jiān)紙D像,其標(biāo)示了四個(gè)區(qū)域:A, B , C ,D

1 處像素點(diǎn)對(duì)應(yīng)的在積分圖像中的值為:sum(A);

2 處像素點(diǎn)對(duì)應(yīng)的在積分圖像中的值為:sum(A+B);

3 處像素點(diǎn)對(duì)應(yīng)的在積分圖像中的值為:sum(A+C);

4 處像素點(diǎn)對(duì)應(yīng)的在積分圖像中的值為:sum(A+B+C+D);

則:

區(qū)域D所有的像素點(diǎn)灰度值之和為:

sum(A+B+C+D) - sum(A+C) -?sum(A+B) +?sum(A)
?

3 獲取圖像特征

VJ在論文中提到,24*24大小的圖像可以產(chǎn)生約160000個(gè)矩形特征,那么160000是怎么得到的呢?

VJ使用的矩形特征可以歸為三類:

二鄰接矩形,橫豎兩種情況,如矩形特征A,B,最少需要2個(gè)像素點(diǎn)表示

三鄰接矩形,如矩形特征C,最少需要3個(gè)像素點(diǎn)表示,也有橫豎兩種情況

四鄰接矩形,如矩形特征D,最少需要4個(gè)像素點(diǎn)表示,只有一種情況

對(duì)于24*24大小的圖像,每種鄰接矩形可能的大小為:

二鄰接矩形(最小1*2):長(zhǎng)度每次加2,寬度加1

1*2,1*4,1*6,...1*24

2*2,2*4,2*6,...,2*24

...

24*24

三鄰接矩形(最小1*3):長(zhǎng)度加3,寬度加1

1*3,1*6,1*9,...1*24

2*3,2*6,2*9,...,2*24

...

24*24

四鄰接矩形(最小2*2):長(zhǎng)度加2,寬度加2

2*2,2*4,2*6,...1*24

4*2,4*4,4*6,...4*24

...

24*24

根據(jù)圖像卷積,一個(gè)W*H的圖像與m*n的filter卷積,得到的圖像大小為:(W-m+1)*(H-n+1)(默認(rèn)stride為1)

新圖像的每一個(gè)像素點(diǎn)的值就是原圖一個(gè)m*n的local patch 與m*n的filter的乘積和。

新圖像有多少個(gè)像素點(diǎn),原圖就有多少個(gè)m*n的矩形。

這么多矩形,可以通過(guò)編程算出,借用未雨綢繆的代碼。

這段代碼中,橫豎矩形窗口的數(shù)量是一樣的,代碼里只計(jì)算一種,然后乘以2就行了。

import numpy as npa = np.zeros((3, 2), dtype=int) Count = np.zeros(3, dtype=int) a[0, :] = [1, 2] a[1, :] = [1, 3] a[2, :] = [2, 2] Img_size = 24for ii in range(3):rec_h = a[ii, 0]rec_w = a[ii, 1]for xx in range(rec_h, Img_size+1, rec_h):for yy in range(rec_w, Img_size+1, rec_w):Count[ii] = Count[ii]+(Img_size-xx+1)*(Img_size-yy+1)print Count[ii]Total = Count[0]*2+Count[1]*2+Count[2] print ("Total: ", Total)

最后可以得到:

二鄰接矩形:43200

三鄰接矩形:27600

四鄰接矩形:20736

最終總的矩形特征為:43200×2+27600×2+20736=162336

所以一個(gè)24*24的圖像最終可以產(chǎn)生162336個(gè)矩形特征。

并不是所有特征都是有用的,那么如何提取出有用的特征呢?

AdaBoost特征分類器具有特征選擇的能力。

?

4?利用AdaBoost算法進(jìn)行訓(xùn)練

4.1 AdaBoost分類器

AdaBoost 將一系列的弱分類器通過(guò)線性組合,構(gòu)成一個(gè)強(qiáng)分類器,如下所示:

是一個(gè)強(qiáng)分類器,是一個(gè)弱分類器,其為一個(gè)簡(jiǎn)單的閾值函數(shù):

為閾值,,為系數(shù)。

4.2 訓(xùn)練弱分類器

計(jì)算所有訓(xùn)練樣本的特征值,并將其從小到大排序,隨機(jī)選取一個(gè)特征值作為閾值,

把所有元素分為兩部分,小于閾值的一部分分類為人臉,大于閾值的一部分分類為非人臉。

如下圖所示,紅色表示人臉,藍(lán)色表示非人臉。

假如有5個(gè)樣本,前兩個(gè)為人臉,后三個(gè)為非人臉,用11000表示。

如果閾值在第一個(gè)之前,通過(guò)弱分類器判定為:00000,有兩個(gè)誤差,

如果閾值在第一個(gè)和第二個(gè)之間,通過(guò)弱分類器判定為:10000,有1個(gè)誤差,

如果閾值在第二個(gè)和第三個(gè)之間,通過(guò)弱分類器判定為:11000,有0個(gè)誤差,

依次類推,這樣共有6個(gè)誤差,然后從中找到一個(gè)誤差最小的當(dāng)成閾值,

這樣就訓(xùn)練好了一個(gè)最優(yōu)的弱分類器。

4.3?訓(xùn)練強(qiáng)分類器

假設(shè)有N個(gè)訓(xùn)練樣本,其中有個(gè)正樣本,個(gè)負(fù)樣本,如果是人臉圖像,

則, 否則

其步驟如下:

每一級(jí)分類器使用的訓(xùn)練集中的負(fù)樣本,都是上一級(jí)被錯(cuò)分的,即false?positive,誤檢率或假陽(yáng)性。

這使得下一級(jí)分類器更加關(guān)注那些更難的(容易被錯(cuò)分的)樣本。

?

5 級(jí)聯(lián)分類器(cascade of classifiers)

在正常的圖像中,人臉區(qū)域只是占了很小的一部分,如果使用所有的特征進(jìn)行訓(xùn)練的話,運(yùn)算量非常大。

級(jí)為了簡(jiǎn)化任務(wù),把若干個(gè)adaboost 分類器級(jí)聯(lián)起來(lái),一開始使用少量的特征將大部分的非人臉區(qū)域剔除掉,后面再利用更復(fù)雜的特征將更復(fù)雜的非人臉區(qū)域剔除掉。

如果級(jí)聯(lián)分類器的識(shí)別率(true positive rate)為D,誤識(shí)率(false positive rate)為F,?

第? 層的分類器的識(shí)別率為, 誤識(shí)率為,

則:

其中: K 為分類器的個(gè)數(shù)

假如每一級(jí)的分類器,都具有非常高的檢測(cè)率(99.9%),

同時(shí)誤檢率也保持相當(dāng)高(50%)。

那么,如果級(jí)聯(lián)20個(gè)這樣的小adaboost分類器,

人臉的識(shí)別率有:

但是誤檢率有:

5.1 級(jí)聯(lián)分類器的訓(xùn)練

論文中給出了一種很有效的方法

  • 設(shè)定每一層最大的可接受誤檢率?f, 和每一層最小的檢測(cè)率 d.
  • 設(shè)定級(jí)聯(lián)分類器的總體誤檢率
  • 初始化總體誤檢率為,識(shí)別率,循環(huán)計(jì)數(shù)器 i=0
  • 循環(huán),如果當(dāng)前 F 大于??時(shí),繼續(xù)增加一層adaboost分類器
  • 在訓(xùn)練每一層分類器時(shí),如果目前該層的特征沒(méi)有達(dá)到該層的??標(biāo)準(zhǔn),繼續(xù)添加新的特征。添加新特征時(shí),持續(xù)降低該特征的閾值(一般而言,高閾值的分類器的檢測(cè)率和誤檢率都會(huì)比較低),直到該層分類器的檢測(cè)率,然后更新

在論文中,VJ分類器一共有38層,含有6060個(gè)特征,前7層的特征數(shù)為:2->10->25->25->50->50->50

?

6 非極大值抑制(NMS)

在人臉識(shí)別中,一張臉會(huì)出現(xiàn)非常多的窗口,如下圖所示:

假設(shè)有N個(gè)窗口,根據(jù)分類器的分類概率從小到大排序,概率最大的框記為Z

非極大值抑制的工作步驟如下:

  • 從最大概率矩形框Z開始,分別判斷其它框與X框的重疊度是否大于設(shè)定的閾值
  • 假設(shè)其中的B,C框超過(guò)了閾值,就扔掉B,C,并保留Z框
  • 從剩下的矩形框中,選擇概率最大的(假設(shè)為Y),然后判斷其它框與X框的重疊度是否大于設(shè)定的閾值,大于扔掉,并保留框Y
  • 一直重復(fù)這個(gè)過(guò)程,直到最后一個(gè)框

論文中有些地方不夠詳細(xì),可能比較符合微軟研究院的風(fēng)格吧。

相關(guān)鏈接

論文傳送門:Viola-Jones人臉檢測(cè)

AdaBoost算法:集成算法-AdaBoost

?

本文參考了論文原文和網(wǎng)上的資料,是筆者自己對(duì)Viola-Jones算法的理解,可能會(huì)有些偏差,請(qǐng)讀者指正。

總結(jié)

以上是生活随笔為你收集整理的Viola-Jones人脸检测详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。