'eigenface'에 해당되는 글 5건

  1. 2009.12.28 Eigenface (2)
  2. 2009.12.27 Active Shape Model :: Face (1)
  3. 2009.12.25 Active Shape Model (ASM) (2)
  4. 2009.12.14 Similarity Transformation (1)
  5. 2009.12.12 Eigenface

Eigenface (2)

Image Recognition 2009.12.28 23:55

특정한 eigenface를 평균얼굴에 적당한 가중치를 주어서 더하면 그 eigenface가 얼굴에 어떤 변화를 주는지를 알아볼 수 있다. 아래의 결과는 가장 큰 eigenvalue를 갖는 6개의 eigenface들에 대해서

-2 * sqrt(eigenvalue) <=  가중치 <= +2 * sqrt(eigenvalue)

사이의 가중치값을 17단계로 변화시키면서 영상의 변화를 본 것이다.

얼굴영상 = 평균얼굴 + 가중치 * eigenface

일반적인 얼굴영상은 여러 eigenface들의 가중치를 준 조합으로 만들어진다.

아래의 사진을 보면 처음 3개의  eigenface는 영상에서 조명의 변화를 주로 나타내고, 이 후의 3개는 얼굴형의 변화를 주로 표현한다. 실제로 eigenface를 사용할 때는 처음 몇개의 큰 고유치를 갖는 eigenface를 버리고 사용하여서 조명변화에 따른 영상의 변화를 일정정도 보상할 수 있다.
Y.Moses, Y.Adini, S.Ullman, "Face Recognition: The Problem of Compensating for changes in Illumination Direction", 1994


 

 
 
 
 


저작자 표시
신고

'Image Recognition' 카테고리의 다른 글

Isometric Transformation  (0) 2010.01.11
Active Shape Model (3)  (0) 2009.12.30
Eigenface (2)  (0) 2009.12.28
Active Shape Model :: Face  (1) 2009.12.27
Active Shape Model (ASM)  (2) 2009.12.25
Similarity Transformation  (1) 2009.12.14
Posted by helloktk

ASM을 얼굴윤곽선에 적용한 결과이다. Viola-Jones detector가 구지성의 얼굴은 잘 검출하지 못한다. 코드에 plastic surgery에 대한 옵션이 없는데....
저작자 표시
신고

'Image Recognition' 카테고리의 다른 글

Active Shape Model (3)  (0) 2009.12.30
Eigenface (2)  (0) 2009.12.28
Active Shape Model :: Face  (1) 2009.12.27
Active Shape Model (ASM)  (2) 2009.12.25
Similarity Transformation  (1) 2009.12.14
Eigenface  (0) 2009.12.12
Posted by helloktk

영상에 물체의 윤곽선을 찾고자 할 때 active snake 알고리즘을 많이 이용한다. 이것은 물체의 윤곽에서 명암의 차이을 이용하여서 윤곽선을 탄성이 있는 곡선으로 근사시키는 방법이다. 그러나 실제의 영상에는 조명의 영향이나 잡음 아니면 다른 물체에의 한 가려짐으로 인해서 윤곽이 명확하게 나타나지 않거나 가려져서 윤곽선을 제대로 찾지 못하거나 심하게 왜곡된 윤곽선를 낳는 결과를 초래한다.

영상에서 윤곽선을 찾는 경우에 특정한 물체(예를 들면 영상에서 얼굴윤곽, 손모양, 초음파 사진에서 장기의 모양...)를 대상으로 하는 경우가 많다. 이 경우에는 대상물체의 모양은 대략의 형태가 알려져 있고, 실제로 사진에 나타나는 형태는 평균적인 형태에서 많이 벗어난 있지 않는다. 이러한 정보를 이용하면 보다 쉽게 물체의 윤곽선을 찾을 수 있다.

먼저 찾고자 하는 물체의 윤곽선 정보를 훈련을 시켜서 평균적인 윤곽선에 벗어나는 정도를 분류하여서, 몇 가지 mode(=eigen mode=eigen shape)가 있는지를 알아낸다. 이것은 얼굴인식에서 PCA 기법을 이용하여서 평균얼굴영상에서 변화를 주는 eigen modeeigenface를 찾는 기법과 같다. Eigen mode는 평균윤곽에서 아주 미세한 변화는 버리고, 큰 것만 취하면 된다이러한 eigen mode용하면 잡음이나 조명 가려짐등에 의해서 잘못 찾은 윤곽선을 보정하여서 원하는 형태를 유지할 수 있다. , 영상처리에 의해서 찾은 윤곽을 eigen mode로 분해시키어서 각각의 eigen modeweight를 구하고, eigen mode를 이 weight 를 이용해서 더하여서(물론 평균윤곽도 더하고.) 재구성된 윤곽선을 얻는다. 이 재구성된 윤곽선은 잡음등의 영향으로 인한 미세한 왜곡을 없앨 수 있다. 그리고, 윤곽선 찾기를 반복적인 과정으로 구현할 때 이 재구성된 윤곽선에서 출발하여서 다음번의 윤곽선 찾기를 시도한다.

그러나 이 방법은 eigen mode 가 훈련에 사용한 영상에 많이 의존하므로, 훈련된 윤곽과 많이 다른 경우에는 제대로 대처하지 못한다.

 

아래 그림(검정선)은 영상처리에서 찾은 손윤곽으로 잡음으로 인해서 왜곡이 많이 되어 있는 모양이다. 빨간선은 eigen mode를 이용해서 재구성한 윤곽이다.

* 18개의 훈련용 손모양을 가지고 얻은 12개의 eigen mode을 씀.
* data 출처:
ttp://personalpages.manchester.ac.uk/staff/timothy.f.cootes/data/hand_data.html

저작자 표시
신고

'Image Recognition' 카테고리의 다른 글

Eigenface (2)  (0) 2009.12.28
Active Shape Model :: Face  (1) 2009.12.27
Active Shape Model (ASM)  (2) 2009.12.25
Similarity Transformation  (1) 2009.12.14
Eigenface  (0) 2009.12.12
Retinex 알고리즘 관련 자료.  (1) 2009.04.29
Posted by helloktk

2차원 이미지의 기하학적인 변형중에서 일정하게 이동을 시키고, 일정각도 회전 및 전체적인 크기의 변화를 주는 변환이 similarity transformation이다. 이 변화은 두 직선이 이루는 각도를 보존하고 길이비를 변경시키지 않는다. 이 변환보다도 더 일반적인 2차원의 기하학적인 변환은 affine transformation이다. 이것은 한쪽 방향으로의 밀림(sheer)도 허용한다. 그러다 두 직선의 각도는 변환후에도 변하지 않는다.
similarity transformation은 전체적인 크기를 바꾸는 스케일 파리미터(s) 1개와 회전각도(θ) 1개 그리고 x, y축으로의 이동을 나타내는 파라미터 2 (tx, ty)개를 합해서 총 4개의 파라미터가 필요하다. 이 파라미터에 의해서 원본 이미지의 (x,y)점이 변환된 이미지의 (u,v)에 대응한다고 하면, 이들간의 관계는 아래의 식으로 주어진다.

    u =  s*cos(θ)*x - s*sin(θ)*y + tx ;
    v =  s*sin(θ)*y + s*cos(θ)*y + ty;

 이 따라서 원본영상의 2 점에 대응하는 정보만 주어지면 파라미터(s, θ, tx, ty)를 유일하게 결정할 수 있다. 

    (x1, y1) -----> (u1, v1)
    (x2, y2) -----> (u2, v2)

그러나 많은 경우에는 기준점을 잡는데 에러등을 고려하여서 일반적으로 원본 영상의 N(>=2)개의 점에 대응하는 정보를 주게되는데, 이 경우에 변환관계식은 overdetermined되어서 해를 구할 수 없는 경우도 있다. 이 경우에는 최소자승법을 써서 변환점과 변환식에 의해서 의해서 주어지는 값의 차이를 최소화시키는 파라미터를 구해서 쓰면 된다.

L =  ∑ |ui - (s*cos(θ)*xi - s*sin(θ)*yi + tx)|^2 + |vi - (s*sin(θ)*xi + s*cos(θ)*yi + ty)|^2,           (i=1,...,N)

                        (s, θ, tx, ty) = arg min (L)

이 식을 최소화사키는 파라미터는  (a= s*cos(θ), b=s*sin(θ)로 놓으면)  a, b, tx, ty에 대해서 미분하여서 0인 조건을 만족시키면 된다.

a에 대한 미분 :   ∑ (ui - (a*xi - b*yi + tx))*(-xi) + (vi - (b*xi + a*yi + ty))*(-yi) = 0,   
b에 대한 미분 :   ∑ (ui - (a*xi - b*yi + tx))*(yi) + (vi - (b*xi + a*yi + ty))*(-xi) = 0,   
tx에 대한 미분 :  ∑ (ui - (a*xi - b*yi + tx)) = 0.
ty에 대한 미분 :  ∑ (vi - (b*xi + a*yi + ty)) = 0

따라서, Su = ∑ ui, Sv = ∑ vi, Sux = ∑ ui*xi, Suy = ∑ ui*yi, Svx = ∑ vi*xi, Svy = ∑ vi*yi , Sx = ∑ xi, Sy=∑ yi, Sxx = ∑ xi*xi, Sxy = ∑ xi*yi, Syy=∑ yi*yi 라고 하면,

-Sux  + a * Sxx - b * Sxy + tx * Sx - Svy + b*Sxy + a*Syy + ty *Sy = 0; 
  Suy - a * Sxy + b * Syy - tx * Sy -Svx + b*Sxx + a*Sxy + ty*Sx = 0;
  Su - a* Sx + b*Sy - tx * N = 0;
  Sv - b* Sx - a*Sy - ty * N = 0;

의 4개의 식을 얻으므로 4원(a,b,tx,ty) 1차 연립방정식을 풀면 된다. 이식의 답은 쉽게 구할 수 있고, 아래의 코드는 이것을 구현한 것이다. 물론, 점이 2개인 경우에는 파라미터는 유일하게 정해지고, 이보다도 더 간단한 식으로 주어진다.

//dstPt = (ST)(srcPt)
BOOL SimilarTransParams(POINT *srcPts, POINT *dstPts, int n, double ST[4]) {
    double Sx, Sy, Sxx, Syy;
    double Su, Sv, Sxu, Sxv, Syu, Syv ;
    Sx = Sy = Sxx = Syy = 0;
    Su = Sv = Sxu = Sxv = Syu = Syv = 0;
    for (int i = 0; i < n; i++) {
        double x = srcPts[i].x ;
        double y = srcPts[i].y ;
        double u = dstPts[i].x ;
        double v = dstPts[i].y ;
        Sx += x ;
        Sy += y ;
        Sxx += (x*x) ;
        Syy += (y*y) ;
        Su += u ;
        Sv += v ;
        Sxu += (x*u) ;
        Syv += (y*v) ;
    }
    double Z = Sxx + Syy ;
    double C1 = Sxu + Syv ;
    double C2 = Sxv - Syu ;
    double A[16] , invA[16] ;
    A[0]  = Sx; A[1]  = -Sy;  A[2]  =   n; A[3] = 0.;
    A[4]  = Sy; A[5]  =  Sx;  A[6]  =  0.; A[7] = n ;
    A[8]  = Z ; A[9]  =  0.;  A[10] =  Sx; A[11] = Sy;
    A[12] = 0.; A[13] =  Z;   A[14] = -Sy; A[15] = Sx;
    InvertMatrix4x4_d(A, invA) ;
    double R[4] ;
    R[0] = Su ; R[1] = Sv; R[2] = C1; R[3] = C2 ;
    // ax = scale * cos(angle) ;
    double ax = invA[0]*R[0]  + invA[1]*R[1]  + invA[2]*R[2]  + invA[3]*R[3];
    // ay = scale * sin(angle) ;
    double ay = invA[4]*R[0]  + invA[5]*R[1]  + invA[6]*R[2]  + invA[7]*R[3];
    // x-translation ;
    double tx = invA[8]*R[0]  + invA[9]*R[1]  + invA[10]*R[2] + invA[11]*R[3];
    // y-translation ;
    double ty = invA[12]*R[0] + invA[13]*R[1] + invA[14]*R[2] + invA[15]*R[3];
    ST[0] = ax ;
    ST[1] = ay ;
    ST[2] = tx ;
    ST[3] = ty ;

    return TRUE ;
}
InvertMatrix4x4()는 4x4행렬의 역행렬을 구한다(OpenCV에서)

더보기

2개의 대응점만 주어진 경우 (x1,y1), (x2, y2)-->(u1,v1), (u2,v2);
bool SimilarTransParams(double x1, double y1, double x2, double y2,
                                     double u1, double v1, double u2, double v2,
                                     double ST[4])
{
    double x21=x2-x1;
    double y21=y2-y1;
    double u21=u2-u1;
    double v21=v2-v1;
    double det=x21*x21 + y21*y21;
    if(det==0.) return false;
    double a=( x21*u21 + y21 * v21)/det ;
    double b=( x21*v21 - y21 * u21)/det ;
    double tx = u1 - a*x1 + b*y1;
    double ty = v1 - b*x1 - a*y1;
    ST[0]=a; ST[1]=b; ST[2]=tx; ST[3]=ty;
    return true;
};
얼굴인식용 training data set을 만들기위해서 얼굴을 정렬시키는데 사용한 예:
- 양 눈의 위치 변환: (70,93), (114, 84) --> (30,45), (100,45)로 변환( linear interpolation사용)
- 실제로 사용되는 변환은 정해진 dst영역으로 매핑하는 src영역을 찾아야 하므로, 역변환이 필요하다.
- 필요한 역변환은 src와 dst의 역할만 바꾸면 쉽게 구할 수 있다.

신고

'Image Recognition' 카테고리의 다른 글

Active Shape Model :: Face  (1) 2009.12.27
Active Shape Model (ASM)  (2) 2009.12.25
Similarity Transformation  (1) 2009.12.14
Eigenface  (0) 2009.12.12
Retinex 알고리즘 관련 자료.  (1) 2009.04.29
Spline Based Snake  (0) 2008.08.15
Posted by helloktk

Eigenface

Image Recognition 2009.12.12 20:03
평균얼굴:
- 173개의 얼굴영상(130x150)을 가지고 만든 것이다.
- 얼굴영상 출처:http://www.cs.colostate.edu/evalfacerec/data.html(두 눈의 위치정보가 있어서 편리하다)
- 각각의 얼굴영상은 두 눈의 위치가 영상에서 일정한 위치에 있도록 기하학적인 변환(similarity transform)을 한 후에 만든 것이다.


Eigenfaces:
- 173개의 영상에서 평균얼굴을 뺀 후에 Covariance Matrix을 만들었으므로 실제로는 eigenvector는 173-1=172 차원 hyperplane를 형성 . 130x150차원 공간의 subspace)
- 각각의 eigenface는 1로 정규화된 벡터(영상)이나, 이미지로 보이기 위해서 임의로 스케일링한 것이다. 따라서 각각의 eigenface이 밝기는 상대적인 값이다.
- 영상은 eigenvalue의 크기 순서대로 69개만 나열한 것이다( 큰것-->작은것. dimensional reduction)


얼굴의 재구성
원본 얼굴:

69개의 eigenface로 재구성된 얼굴: 상관계수=0.98974171867343186;


훼손된 얼굴(원본):

eigenface을 이용해서 재구성한 얼굴(69개의 eigenface을 이용) : 상관계수=0.87881960779794632;

eigenface를 10개에서 69개로 순차적으로 늘리면서 재구성한 결과(animating gif):


Nonface의 재구성:
원본(원숭이)

재구성된 원숭이 얼굴(69개의 eigenface이용)
- 원본과의 상관계수를 구하여서 얼굴인지 아닌지를 판별할 수 있다.: 상관계수=0.78869719166049590;

신고

'Image Recognition' 카테고리의 다른 글

Active Shape Model (ASM)  (2) 2009.12.25
Similarity Transformation  (1) 2009.12.14
Eigenface  (0) 2009.12.12
Retinex 알고리즘 관련 자료.  (1) 2009.04.29
Spline Based Snake  (0) 2008.08.15
Anisotropic Diffusion Filter  (0) 2008.08.11
Posted by helloktk