久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

OpenCV人臉檢測原理

 mediatv 2020-07-23

效果圖

閑扯:公司鼓勵創(chuàng)新,,做了個皮膚檢測器,本來的想法是用手機外接wifi攝像頭,,用攝像頭來拍攝皮膚圖像的,,后來找了幾個wifi攝像頭的廠家,因價格沒談攏,,就不用wifi攝像頭了,,只用手機自帶的相機來獲取圖像,。

下面我寫了個 demo 測試,如下圖

me

目前實現(xiàn)了皺紋,,油份,,水份的檢測算法,以后還想實現(xiàn)更多功能,,比如痘痘數(shù)量,,色斑檢測,年齡預測等等,。


人臉檢測原理

人臉檢測就是要判斷一張圖像是不是人臉,,以及人臉的位置。
一張大圖像由他的一張很小的子圖像窗口,,以一定的倍數(shù)擴大(比如每次擴大 1.2 倍)暴力搜索,,最終能確定位置。

判斷一張圖像是不是人臉,,先提取圖像的 haar-like 特征值,,交給 adaboost 算法,它能判斷是不是人臉,。

提取圖片的 haar 特征

  • 為什么要提取 haar 特征,?
    因為要用 adaboost 做分類,整張圖塞進去計算量太大,,提取一些主要的特征,,能區(qū)分人臉非人臉就行。

  • 怎么提取 haar 特征,?
    有大牛已經(jīng)給出方法了,,看下面的模板,把模板放在圖像上,,用 白色區(qū)域的灰度和 減去 黑色區(qū)域的灰度和,,得到的數(shù)值就是其中一個 haar 特征,把模板在圖像上滑動,,能計算出一組數(shù)值,,例如(123, 234, -134, ...),這就是圖像的 haar 特征了,。

  • 拓展:
    圖像區(qū)域快速求和,,用積分圖,對原圖像進行一次積分,,就能在O(1)時間算出區(qū)域像素和,,大概寫一下。

假設(shè)積分圖是 F(x, y),,求 Rect(x, y, w, h) 區(qū)域和,。
sum = F(x+w, y+h) - F(x+w, y) - F(x, y+h) + F(x, y)

// F(x, y) 表示 Rect(0, 0, x, y) 的區(qū)域和,,f(x, y) 表示 (x, y) 灰度級
// 后面加上 + F(x, y) 是因為發(fā)現(xiàn) - F(x+w, y) - F(x, y+h) 減多了重疊的區(qū)域,所以就加回來,。
// 生成積分圖的狀態(tài)轉(zhuǎn)移方程:
F(x, y) = f(x, y) + F(x-1, y) + F(x, y-1) - F(x-1, y-1)


AdaBoost 算法

先來一個感性的認識,。

每來一張圖片,提取其特征值 X,,用 AdaBoost 算法能判斷出 X 是不是人臉,。
AdaBoost 里面有很多個分類器對特征值 X 進行打分,分數(shù)有正有負,,每個分類器還有個權(quán)值,,最終把多個分類器給出的分數(shù)乘上他們自身的權(quán)值,全部累加起來,,得到一個數(shù)值,,如果是正數(shù),表示屬于 1 類,,負數(shù)表示屬于 -1 類,。

假設(shè) 1 類是人臉類,-1 類是非人臉類,,就能分出一張圖是不是人臉了,。

分類器可以理解為一個函數(shù) G(x),輸入特征值 x,,返回數(shù)值 G(x)

AdaBoost 里面有多個弱分類器 (假設(shè)3個),,組合成一個強分類器,像這樣

每個弱分類器有權(quán)重

再來個sign(n)函數(shù),,sign 返回 n 前面的正負號,,0和正數(shù)返回 1,負數(shù)返回 -1

拓展到 n,,最終的判斷公式為

輸入一個圖像的特征值 x,,看看返回是 1 還是 -1,就可以判斷出是人臉還是非人臉,。

其他:w1, w2, w3 一開始不知道是多少,,需要訓練數(shù)據(jù)進行多輪的迭代后算出,,訓練過程就是調(diào)整權(quán)值的過程,。訓練完了后,就用這些權(quán)值組成的模型,,對未知的圖像進行分類,。


具體的例子

有8組包含各種情況的特征值,作為訓練數(shù)據(jù),。

特征值 x 1 2 3 4 5 6 7 8
類別 1 1 -1 -1 -1 1 1 1

1.初始化 n 組訓練數(shù)據(jù)的權(quán)值為 D(i) = 1 / n
所以 1 到 8 的權(quán)值為 1 / 8 = 0.125
D = (0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125)

2.多輪迭代
看訓練數(shù)據(jù)
1, 2 屬于 1 類
3, 4, 5 屬于 -1 類
6, 7, 8 屬于 1 類

2 到 3 的時候,,由 1 變?yōu)?-1,,是一個變化的地方,設(shè)定 x = 2.5,,意思是在 2.5 的地方切一刀,。
5 到 6 由 -1 變?yōu)?1,又是一個變化點,,設(shè)定 x = 5.5

下面對 2.5,,5.5 進行迭代

規(guī)則:有一個常數(shù) c,先認為 x <= c 的元素為 1 類,,x > c 的為 -1 類,,然后計算有多少個數(shù)據(jù)被分錯的。
誤差率 e = 分錯的元素的權(quán)值和,。
如果誤差率 e > 0.5,,則反過來,認為 x <= c 的為 -1,,x > c 的為 1,。

誤差率寫成公式有點晦澀了,用文字描述比較直觀,,就是把被分類器分錯的元素的和權(quán)值全部加起來,,就是誤差率了。


  • 第一輪迭代

x = 2.5 時,,先認為 x <= 2.5 為 1 類,,x > 2.5 的為 -1 類
那么 6, 7, 8 三個元素被分錯了,每個元素的權(quán)值為 0.125,。
誤差率為 6, 7, 8 的權(quán)值和:0.125 + 0,125 + 0.125 = 0.375,。

x = 5.5 時,先認為 x <= 5.5 為 1,,x > 5.5 為 -1
那么 3, 4, 5, 6, 7, 8 六個元素被分錯,。
誤差率為 6 乘 0.125 = 0.75 大于 0.5 了。
那么反過來 x <= 5.5 為 -1,,x > 5.5 為 1,,此時只有 1, 2 被分錯。
誤差率為 1, 2 的權(quán)值和:0.125 + 0.125 = 0.25,。

選個誤差小的 0.25,,得出第一個分類器 G1


計算 G1 權(quán)重公式:(e 是誤差率)

該函數(shù)圖像:

由圖像可知誤差率 e 越小,w 權(quán)值越大,。

G1 的誤差率 e1 = 2 / 8 = 0.25
G1 權(quán)重 w1 = 1 / 2 * log (0.75 / 0.25) = 0.23856

w1 就描述了 G1 的重要程度,,或者說對一個特征值被分成哪一類的話語權(quán)的大小。

接下來要更新以下元素權(quán)重:
第一輪:D = (0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125)
假設(shè)第一輪的 D = (d1, d2, d3, ..., dn),,是已知的
下一輪的 D = (k1, k2, k3, ..., kn),,是要計算的

權(quán)重更新公式:

其中常數(shù) Z 是

ki 本輪要計算的元素的權(quán)重
di 上一輪已經(jīng)計算出的權(quán)重
w 上一輪分類器的權(quán)重
G(xi) 上一輪分類器對第 i 個特征的分類結(jié)果
yi 第 i 個元素的類別,,1 或者 -1
e 自然常數(shù),約 2.71828
Z 歸一化用的常數(shù)

按照上面方式,,算出新的權(quán)重為

D = (0.174721, 0.174721, 0.108426, 0.108426, 0.108426, 0.108426, 0.108426, 0.108426)

可以看出 1, 2 被分錯后,,它的權(quán)值增大了,那么如果后面的分類器再把 1, 2 分錯,,產(chǎn)生的誤差率會更大,,因為誤差率根據(jù)權(quán)值和算出的,所以權(quán)值大的,,會被重點考慮,。

  • 第二輪迭代

x = 2.5 時,誤差率為 6, 7, 8 權(quán)值和:0.325278
x = 5.5 時,,誤差率為 1, 2 的權(quán)值和:0.349442

選個誤差率小的,,即 0.325278,x = 2.5 的,,得出第二個分類器 G2

G2 的誤差率 e2 = 0.325278
G2 權(quán)重 w2 = 0.15844

此時,,已經(jīng)得到兩個弱分類器,代入 adaboost 算法的公式中

得到模型:


  • 測試該模型
特征值 x 1 2 3 4 5 6 7 8
類別 1 1 -1 -1 -1 1 1 1
G(x) -1 -1 -1 -1 -1 1 1 1

分析 G(x) 得出的結(jié)果,,發(fā)現(xiàn) 1,,2 被分錯了,還是有誤差,,說明本例子迭代兩次是不夠的,,還需要更多輪的迭代,減小誤差,,直到模型 G(x) 在訓練數(shù)據(jù)上的誤差為0,,再繼續(xù)迭代下去誤差會收斂于一個常數(shù)。(詳見最后的參考文獻)

訓練好了一個誤差很小的模型 G(x),,就可以用該模型去對未知的圖像進行分類,,分為人臉類和非人臉類,即可檢測出一張圖像是不是人臉,。


推薦一個在線公式編輯,,在線函數(shù)繪圖

參考文獻:July 的《Adaboost 算法的原理與推導》

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多