Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

About LFW annotation #59

Open
xvbw opened this issue Jul 7, 2016 · 3 comments
Open

About LFW annotation #59

xvbw opened this issue Jul 7, 2016 · 3 comments
Labels

Comments

@xvbw
Copy link

xvbw commented Jul 7, 2016

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
Copy link
Owner

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
Copy link
Author

xvbw commented Jul 11, 2016

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
Copy link
Owner

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;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants