Pages

2009年7月28日 星期二

其它膚色模型

  除了之前介紹的 Bayesian膚色模型(YCbCr),其實還有許多不同色彩空間的膚色模型,如:RGB、YUV、YCbCr、HSV、HSL、Normalize RGB 等等,底下再秀兩個膚色模型。

● YCbCr
Y = 0.299*data[2] + 0.587*data[1] + 0.114*data[0];
Cb = -0.1687*data[2] - 0.3312*data[1] + 0.5*data[0];
Cr = 0.5*data[2] - 0.4183*data[1] - 0.0816*data[0];

if(60 < Y && Y < 255)
{
if(-25 < Cb && Cb < 0)
{
if(10 < Cr && Cr < 45)
{
// skin
}
else
{
// non-skin
}
}
else
{
// non-skin
}
}
else
{
// non-skin
}
● Normal RGB
double r;
double g;
double b;
double F1;
double F2;
double w;
int size = 320*240;
Byte* data = (Byte*)scan0.ToPointer();

for(int i = 0; i < size; ++i, data += 3)
{
if(data[0] == 0 && data[1] == 0 && data[2] == 0)
{
r = g = b = 0;
}
else
{
r = (double)data[2]/(data[2]+data[1]+data[0]);
g = (double)data[1]/(data[2]+data[1]+data[0]);
}

F1 = -1.3767*r*r + 1.0743*r + 0.1452;

F2 = -0.776*r*r + 0.5601*r + 0.1766;

w = (r-0.33)*(r-0.33) + (g-0.33)*(g-0.33);


if((g < F1) && (g > F2) &&
(w > 0.0004) &&
(data[2] > data[1]) &&

(data[1] > data[0]) &&
(data[2] - data[1] >= 16))

{
// skin
}
else
{
// non-skin
}
}

  後者是我目前用過效果最好的膚色模型,在白光或者黃光的環境都表現得不錯。但是,不論多麼好的膚色模型,想要應付各種外在因素的影響,還是顯得不足,畢竟拿到的影像,顏色都被干擾了。

相關閱讀:

2009年7月16日 星期四

Baysian 膚色模型

  在做人臉、手勢辨識時,最直覺的做法就是先找膚色,這裡就介紹一下 Bayes 膚色模型。這篇論文是利用條件機率,將每對 (Cb,Cr) 都賦予一個「是否為膚色」的標籤,待訓練完後,每給定一個 (R,G,B),只要轉換到 YCbCr 就可以知道是否為膚色。

  論文中所提及的一些式子,如式 (3)、式 (4),是用成本的概念來說明,如樣本 X 判斷成膚色的成本小於判斷成非膚色的成本,就把樣本 X 決定成膚色。至於其它係數就不用管他,只要知道最後一個實驗出來的結果值:Alpha = 2,剩下就是條件機率的使用了。

  至於要如何訓練,首先要收集一堆 training data,並且把每一張圖片都一分為二:膚色 & 非膚色,也就是說針對某一張圖片,把膚色以外的區域弄成白色,產生一筆 skin data;非膚色以外的區域弄成白色,產生一筆 non-skin data,這裡需要的是人工篩選的動作。接著,開始一一統計以下四個變量:
  1. 膚色點的總數。
  2. 非膚色點的總數。
  3. 每對 (Cb,Cr) 膚色點的數量。
  4. 每對 (Cb,Cr) 非膚色點的數量。
  然後根據論文的式 (10) 與式 (11) 計算每對 (Cb,Cr) 膚色和非膚色的機率,歸類完即可產生一個 225x225 的 training model 了。

  Bayes 條件機率是不錯的觀念,不少演算法以此為核心發展出來,如:Bayes Classifier,甚至有寫成一個函式庫,裡頭都是用條件機率去做的。不過,用條件機率,很大的問題會取決於所收集的資料特性,甚至當正反兩個結果的機率差不多時,準確度就會大大下降。

程式碼下載

相關閱讀:
 
Blogger Templates