uricamic / clandmark

Open Source Landmarking Library
http://cmp.felk.cvut.cz/~uricamic/clandmark
GNU General Public License v3.0
199 stars 111 forks source link

About LFW annotation #59

Open xvbw opened 8 years ago

xvbw commented 8 years ago

Hi, while looking through LFW annotation from flandmark github page, it contains 7 landmarks. However, provided flandmark_model.xml model contains 8 landmarks. What kind of model is used in LFW_annotation.txt?

uricamic commented 8 years ago

Hi @xvbw,

the 8th landmark used in the model is artificial (computed from the 7 landmarks) and represents the center of the face. It serves as the root node of the underlying tree graph. If I remember correctly, the MATLAB script computing the 8th landmark is somewhere in the flandmark. If you need it, I can also paste the code here.

xvbw commented 8 years ago

Yes, paste the code here please. That could be really helpful.

Thanks.

+plus, Is LFW annotation corrected by hand after flandmark algorithm performs its landmark detection or is it just an output of the flandmark algorithm? I just wonder how much it's accurate

uricamic commented 8 years ago

Hi @xvbw,

the LFW annotation is manual and actually it was used to train the flandmark model.

The MATLAB code to compute the center of the face is here:

function [ s0 ] = prepareS0gt( points )

    eyer = points(:, 1);
    eyel = points(:, 2);
    m1 = points(:, 7);

    % centeroid of eyes
    c1 = (eyer + eyel)/2;
    % line between eyel and eyer
    e = crossprod([eyer; 1], [eyel; 1]);
    % shift centeroid of eyes (c1) along line perpendicular to e
    c2 = c1 + e(1:2);
    % create line perpendicular to e trough c1 (and c2 also)
    p = crossprod([c1; 1], [c2; 1]);
    % shift mouth along normal vector of p
    m2 = m1 + p(1:2);
    % create line m passing trough m1 and m2
    m = crossprod([m1; 1], [m2; 1]);
    % compute intersection of lines m and p and normalize
    m3 = crossprod(m, p); m3 = m3./m3(3);

    % S0 is centeroid of c1 and m3
    s0 = round( (c1 + m3(1:2))/2 );

end;

where crossprod function is defined like this:

function [ res ] = crossprod( a, b )

    Ax = [  0,   -a(3),   a(2); 
           a(3),     0,  -a(1);
          -a(2),  a(1),      0;];

   res = Ax * b(:);

end;