'Face'에 해당되는 글 16건

  1. 2021.11.26 온라인 얼굴고해상도 사이트 online face super-resolution api site
  2. 2020.09.23 State of the art in 3D dense face alignment! For project and code/API/expert r
  3. 2020.01.15 최근에 데이터를 좀더 쉽게 Crawling 할 수 있는 방법이 있지 않을까 생각하다가 OpenCV의 Face Detection 과 dlib의 F
  4. 2019.11.23 What Will Your Child Look Like? DNA-Net: Age and Gender Aware Kin Face Synthesizer https://www.profillic.com/paper/arxiv:1911.07014 They propose a two-stage kin-face generation model to predict the appearance of a child given a pair of parents
  5. 2019.11.22 Surreal high-quality re-enactments of famous figures https://www.profillic.com/paper/arxiv:1911.08139 (outperforms on the identity preservation problem)
  6. 2019.11.22 STATE OF THE ART IN 3D MORPHABLE MODEL OF THE HUMAN HEAD Enormous applications in computer vision, computer graphics, biometrics, and medical imaging. https://www.profillic.com/paper/arxiv:1911.08008
  7. 2019.11.14 matlab기반의 image warping을 통한 얼굴에 mask씌우기 - Code (Matlab) for automatically putting a mask on a face in photographs. The code matches features between the mask and the face in the photo and warps the mask and merges it onto the fac..
  8. 2019.11.14 python 자동 face warping 라이브러리 - PyChubby
  9. 2019.11.06 What is Facial Recognition?
  10. 2019.10.23 5 Machine Learning Papers on Face Recognition
  11. 2019.09.16 State of the art in Face Alignment from ICCV 2019: DeCaFA, an end-to-end deep convolutional cascade architecture for face alignment https://www.profillic.com/paper/arxiv:1904.02549 DeCaFA significantly outperforms existing approaches on 300W, CelebA an..
  12. 2016.09.30 find_face_landmarks_refsites_20160920
  13. 2016.09.30 Emotion Recognition using Facial Landmarks, Python, DLib and OpenCV
  14. 2016.08.18 Face-landmarks-detection-benchmark
  15. 2016.08.09 Face-Resources
  16. 2016.05.18 reference sites

https://deepai.org/machine-learning-model/torch-srgan

 

 

Posted by uniqueone
,

State of the art in 3D dense face alignment!
For project and code/API/expert requests: https://www.catalyzex.com/paper/arxiv:2009.09960

Posted by uniqueone
,

최근에 데이터를 좀더 쉽게 Crawling 할 수 있는 방법이 있지 않을까 생각하다가 OpenCV의 Face Detection 과 dlib의 Face Align 코드를 합쳐보았습니다.

얼굴관련 연구하시는분들에게는 나름 유용하게 쓰일 수 있지 않을까 생각하여, GUI까지 구현하여 깃헙에 올려놨는데, 혹여나 필요하신분 계실까 싶어 링크 올려드립니다.

Usage 항목과 Installation 항목 참고하여 주시기 바랍니다.

[https://github.com/Jaesung-Jun/Cut-And-Save-Faces](https://github.com/Jaesung-Jun/Cut-And-Save-Faces)

Posted by uniqueone
,
What Will Your Child Look Like? DNA-Net: Age and Gender Aware Kin Face Synthesizer
https://www.profillic.com/paper/arxiv:1911.07014

They propose a two-stage kin-face generation model to predict the appearance of a child given a pair of parents
https://www.facebook.com/groups/1738168866424224/permalink/2457239894517114/?sfnsn=mo
Posted by uniqueone
,
Surreal high-quality re-enactments of famous figures

https://www.profillic.com/paper/arxiv:1911.08139

(outperforms on the identity preservation problem)
https://www.facebook.com/groups/DeepNetGroup/permalink/1008865839506298/?sfnsn=mo
Posted by uniqueone
,
STATE OF THE ART IN 3D MORPHABLE MODEL OF THE HUMAN HEAD
Enormous applications in computer vision, computer graphics, biometrics, and medical imaging.
https://www.profillic.com/paper/arxiv:1911.08008
https://www.facebook.com/groups/1738168866424224/permalink/2458983691009401/?sfnsn=mo
Posted by uniqueone
,

https://github.com/orlyliba/face-masker

 

Code for automatically putting a mask on a face in photographs. The code matches features between the mask and the face in the photo and warps the mask and merges it onto the face. Additionally, the code adds ears or a hat onto the photo.

face-masker

Code (Matlab) for automatically putting a mask on a face in photographs. The code matches features between the mask and the face in the photo and warps the mask and merges it onto the face. Additionally, the code adds ears or a hat onto the photo.

In order to detect matching feature points in the faces and masks, a separate algorithm should be used (this repository does not include it). I have tested two feature detectors that worked well:

  1. Face++ (http://www.faceplusplus.com/), in which feature detection is done in the cloud
  2. Clandmark (http://cmp.felk.cvut.cz/~uricamic/clandmark/), an open source landmarking library

Masks should be stored as the basis image, feature points and blending mask (binary or gray scale weights). The masks can also contain ears/hat/wig. The feature points are detected by the same algorithm that you plan on using for photos, and can be shifted manually. The blending masks are best when done manually with simple programs such as paint.

Read the report and look at the poster to learn more about this project.

 

 

Posted by uniqueone
,

[1] document: https://pychubby.readthedocs.io/en/latest/source/basic_example.html

[2] 소스코드: https://github.com/jankrepl/pychubby

[3] 블로그: https://jankrepl.github.io/pychubby/

----------------------------------------------------------------------------------------------------

[1]

Basic Example

To illustrate the simplest use case let us assume that we start with a photo with a single face in it.

pychubby implements a class LandmarkFace which stores all relevant data that enable face warping. Namely it is the image itself and 68 landmark points. To instantiate a LandmarkFace one needs to use a utility class method estimate.

import matplotlib.pyplot as plt from pychubby.detect import LandmarkFace img = plt.imread("path/to/the/image") lf = LandmarkFace.estimate(img) lf.plot()

Note that it might be necessary to upsample the image before the estimation. For convenience the estimate method has an optional parameter n_upsamples.

Once the landmark points are estimated we can move on with performing actions on the face. Let’s try to make the person smile:

from pychubby.actions import Smile a = Smile(scale=0.2) new_lf, df = a.perform(lf) # lf defined above new_lf.plot(show_landmarks=False)

There are 2 important things to note. Firstly the new_lf now contains both the warped version of the original image as well as the transformed landmark points. Secondly, the perform method also returns a df which is an instance of pychubby.base.DisplacementField and represents the pixel by pixel transformation between the old and the new (smiling) image.

To see all currently available actions go to Gallery.

To create an animation of the action we can use the visualization module.

from pychubby.visualization import create_animation ani = create_animation(df, img) # the displacement field and the original image

------------------------------------------------------------------------------------------------------

[2]

PyChubby

Tool for automated face warping

Installation

pip install pychubby

If you get an error FileNotFoundError: [Errno 2] No such file or directory: 'cmake': 'cmake', you need to make sure cmake is installed. If you're on OSX you can install this via Homebrew with:

brew install cmake

For other platforms please consult the Cmake documentation at https://cmake.org/install/

Description

For each face in an image define what actions are to be performed on it, pychubby will do the rest.

Documentation

https://pychubby.readthedocs.io

Minimal Example

import matplotlib.pyplot as plt from pychubby.actions import Chubbify, Multiple, Pipeline, Smile from pychubby.detect import LandmarkFace img_path = 'path/to/your/image' img = plt.imread(img_path) lf = LandmarkFace.estimate(img) a_per_face = Pipeline([Chubbify(), Smile()]) a_all = Multiple(a_per_face) new_lf, _ = a_all.perform(lf) new_lf.plot(show_landmarks=False, show_numbers=False)

CLI

pychubby also comes with a CLI that exposes some of its functionality. You can list the commands with pc --help:

Usage: pc [OPTIONS] COMMAND [ARGS]... Automated face warping tool. Options: --help Show this message and exit. Commands: list List available actions. perform Take an action.

To perform an action (Smile in the example below) and plot the result on the screen

pc perform Smile INPUT_IMG_PATH

or if you want to create a new image and save it

pc perform Smile INPUT_IMG_PATH OUTPUT_IMG_PATH

Development

git clone https://github.com/jankrepl/pychubby.git cd pychubby pip install -e .[dev]

------------------------------------------------------------------------------------------------------

[3]

PyChubby - Automated Face Warping

 2 minute read

Introduction

We all know the story. You ask a random person on a street to take a photo of you and your friends. After a few moments you happily thank them and go on with your life. After some time you finally sit down for a cup of coffee and check your photos. “My god, why is none of us smiling?!”.

First of all, do not panic. It is your lucky day. If you know how to pip install things there might be hope.

pip install pychubby

Once installed, just write something like this:

import matplotlib.pyplot as plt from pychubby.actions import Multiple, Smile from pychubby.detect import LandmarkFace img_path = 'path/to/img.jpg' img = plt.imread(img_path) lf = LandmarkFace.estimate(img) a = Multiple(Smile(0.15)) lf_new, _ = a.perform(lf) lf_new.plot(show_numbers=False)

What is PyChubby

Pychubby is an automated face warping tool. Its main goal is to serve as a specialized augmentation interface for deep learning face related tasks. But it might as well be used as a silly face warping tool (see the introduction).

You might wonder why even bother when one can do similar things with Photoshop and other software. The answer is simple - automation. You do not have to locate any landmarks, move them around and then repeat the procedure on each face in every photo.

Popular image augmentation packages like imgaug are general purpose (any kind of image) and do not provide many options when it comes to geometric transformations. pychubby is specialized on human faces and allows for creation of geometric transformations that are:

  1. Local (on the face)
  2. Smooth (no artifacts)
  3. Realistic (to an extent)

In other words one does not augment the whole image but just the faces. The augmentations are realistic and have no artifacts.

Building blocks

The logic of pychubby can be summarized in three blocks

  1. Landmark Detection
    • Given a photo, a pretrained landmark detection model predicts 68 landmarks on each face.
  2. Reference Space Mapping
    • The landmarks are mapped into a so called reference space. This mapping corrects for possible rotations, translations and scaling in the input image.
  3. Manual Action Definition
    • Majority of pychubby actions are defined in the reference space and therefore should yield consistent warpings across different faces. Go to Gallery to see the predefined ones or feel free to define new ones.

Want to know more?

If you are interested in giving pychubby a try or just want to learn more see below a few useful links:

All potential contributors are more than welcome and any feedback is highly appreciated.

------------------------------------------------------------------------------------------------------

Posted by uniqueone
,
What is Facial Recognition?


https://lionbridge.ai/articles/what-is-facial-recognition/

'Face > Face Recognition' 카테고리의 다른 글

5 Machine Learning Papers on Face Recognition  (0) 2019.10.23
Posted by uniqueone
,
5 Machine Learning Papers on Face Recognition


https://www.facebook.com/groups/TensorFlowKR/permalink/1009977712676620/?sfnsn=mo

'Face > Face Recognition' 카테고리의 다른 글

What is Facial Recognition?  (0) 2019.11.06
Posted by uniqueone
,

https://www.facebook.com/groups/632755063474501/permalink/2379337655482891/?sfnsn=mo

State of the art in Face Alignment from ICCV 2019: DeCaFA, an end-to-end deep convolutional cascade architecture for face alignment https://www.profillic.com/paper/arxiv:1904.02549

DeCaFA significantly outperforms existing approaches on 300W, CelebA and WFLW databases

'Face' 카테고리의 다른 글

온라인 얼굴고해상도 사이트 online face super-resolution api site  (0) 2021.11.26
find_face_landmarks_refsites_20160920  (0) 2016.09.30
Face-Resources  (0) 2016.08.09
Posted by uniqueone
,

https://github.com/YuvalNirkin/find_face_landmarks/blob/master/sequence_face_landmarks/CMakeLists.txt

http://gyeongju.tistory.com/entry/DLIB-C-Library

http://stackoverflow.com/questions/32736149/how-to-load-jpeg-file-using-dlib-libarary


http://stackoverflow.com/questions/24173330/cmake-is-not-able-to-find-boost-libraries

http://stackoverflow.com/questions/13280823/cmake-not-finding-boost

https://github.com/YuvalNirkin/find_face_landmarks/issues/2

https://github.com/YuvalNirkin/motionseg/blob/master/cmake/Finddlib.cmake

https://github.com/dorian3d/DBoW2/pull/3/files

https://github.com/dorian3d/DLib

http://stackoverflow.com/questions/33996361/create-a-shared-library-for-dlib


http://fossies.org/diffs/dlib/18.17_vs_18.18/dlib/CMakeLists.txt-diff.html

http://dlib.net/dlib/CMakeLists.txt.html

https://github.com/dorian3d/DBoW2

https://github.com/dorian3d/DBoW2/blob/master/CMakeLists.txt

https://github.com/YuvalNirkin/motionseg/blob/master/cmake/Finddlib.cmake


https://sourceforge.net/p/dclib/discussion/442518/thread/b441f3a3/

 

 

 

 

 

 

 

 

Posted by uniqueone
,

http://www.paulvangent.com/2016/08/05/emotion-recognition-using-facial-landmarks/

 

 

 

Emotion Recognition using Facial Landmarks, Python, DLib and OpenCV

Banner

Let’s improve on the emotion recognition from a previous article about FisherFace Classifiers. We will be using facial landmarks and a machine learning algorithm, and see how well we can predict emotions in different individuals, rather than on a single individual like in another article about theemotion recognising music player.


Important: The code in this tutorial is licensed under the GNU 3.0 open source license and you are free to modify and redistribute the code, given that you give others you share the code with the same right, and cite my name (use citation format below). You are not free to redistribute or modify the tutorial itself in any way. By reading on you agree to these terms. If you disagree, please navigate away from this page.

Citation format
van Gent, P. (2016). Emotion Recognition Using Facial Landmarks, Python, DLib and OpenCV. A tech blog about fun things with Python and embedded electronics. Retrieved from: http://www.paulvangent.com/2016/08/05/emotion-recognition-using-facial-landmarks/

IE users: I’ve gotten several reports that sometimes the code blocks don’t display correctly or at all on Internet Explorer. Please refresh the page and they should display fine.


Introduction and getting started
Using Facial Landmarks is another approach to detecting emotions, more robust and powerful than the earlier used fisherface classifier, but also requiring some more code and modules. Nothing insurmountable though. We need to do a few things:

  • Get images from a webcam
  • Detect Facial Landmarks
  • Train a machine learning algorithm (we will use a linear SVM)
  • Predict emotions

Those who followed the two previous posts about emotion recognition will know that the first step is already done.

Also we will be using:

  • Python (2.7 or higher is fine, anaconda + jupyter notebook is a nice combo-package)
  • OpenCV (I still use 2.4.9……so lazy, grab here)
  • SKLearn (if you installed anaconda, it is already there, otherwise get it with pip install sklearn)
  • Dlib (a C++ library for extracting the facial landmarks, see below for instructions)
  • Visual Studio 2015 (get the community edition here, also select the Python Tools in the installation dialog).
    • Note that VS is not strictly required, I just build the modules against it. However it is a very nice IDE that also has good Python bindings and allows you to quickly make GUI applications to wrap around your Python scripts. I would recommend you give it a go

Installing and building the required libraries

I am on Windows, and building libraries on Windows always gives many people a bad taste in their mouths. I can understand why, however it’s not all bad and often the problems people run into are either solved by correctly setting PATH variables, providing the right compiler or reading the error messages and installing the right dependencies. I will walk you through the process of compiling and installing Dlib.

First install CMake. This should be straightforward, download the windows installer and install. Make sure to select the option “Add CMake to the system PATH” during the install. Choose whether you want this for all users or just for your account.

Download Boost-Python and extract the package. I extracted it into C:\boost but it can be anything. Fire up a command prompt and navigate to the directory. Then do:

1
2
3
4
5
6
7
bootstrap.bat #First run the bootstrap.bat file supplied with boost-python
#Once it finished invoke the install process of boost-python like this:
b2 install #This can take a while, go get a coffee
#Once this finishes, build the python modules like this
b2 -a --with-python address-model=64 toolset=mscv runtime-link=static #Again, this takes a while, reward yourself and get another coffee.

Once all is done you will find a folder named bin, or bin.v2, or something like this in your boost folder. Now it’s time to build Dlib.

Download Dlib and extract it somewhere. I used C:\Dlib but you can do it anywhere. Go back to your command prompt, or open a new one if you closed it, and navigate to your Dlib folder. Do this sequentially:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Set two flags so that the CMake compiler knows where to find the boost-python libraries 
set BOOST_ROOT=C:\boost #Make sure to set this to the path you extracted boost-python to!
set BOOST_LIBRARYDIR=C:\boost\stage\lib #Same as above
# Create and navigate into a directory to build into
mkdir build
cd build
# Build the dlib tools
cmake ..
#Navigate up one level and run the python setup program
cd ..
python setup.py install #This takes some time as well. GO GET ANOTHER COFFEE TIGER!

Open your Python interpreter and type import dlib”. If you receive no messages, you’re good to go! Nice.

 


Testing the landmark detector
Before diving into much of the coding (which probably won’t be much because we’ll be recycling), let’s test the DLib installation on your webcam. For this you can use the following snippet. If you want to learn how this works, be sure to also compare it with the first script under “Detecting your face on the webcam” in the previous post. Much of the same OpenCV code to talk to your webcam, process the image by converting to grayscale, optimising the contrast with an adaptive histogram equalisation and displaying it is something we did there.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#Import required modules
import cv2
import dlib
#Set up some required objects
video_capture = cv2.VideoCapture(0) #Webcam object
detector = dlib.get_frontal_face_detector() #Face detector
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") #Landmark identifier. Set the filename to whatever you named the downloaded file
while True:
    retframe = video_capture.read()
    gray = cv2.cvtColor(framecv2.COLOR_BGR2GRAY)
    clahe = cv2.createCLAHE(clipLimit=2.0tileGridSize=(8,8))
    clahe_image = clahe.apply(gray)
    detections = detector(clahe_image1) #Detect the faces in the image
    for k,d in enumerate(detections)#For each detected face
        
        shape = predictor(clahe_imaged) #Get coordinates
            for i in range(1,68)#There are 68 landmark points on each face
                cv2.circle(frame(shape.part(i).xshape.part(i).y)1(0,0,255)thickness=2) #For each point, draw a red circle with thickness2 on the original frame
    cv2.imshow("image"frame) #Display the frame
    if cv2.waitKey(1) & 0xFF == ord('q')#Exit program when the user presses 'q'
        break

This will result in your face with a lot of dots outlining the shape and all the “moveable parts”. The latter is of course important because it is what makes emotional expressions possible.

Unknown-3 Unknown-2

Unknown

 

Note if you have no webcam and/or would rather like to try this on a static image, replace line #11 with something like frame = cv2.imread(“filename”) and comment out line #6 where we define the video_capture object. You will get something like:

33

 

my face has dots
people tell me my face has nice dots
experts tell me these are the best dots
I bet I have the best dots

 

 

 


Extracting features from the faces
The first thing to do is find ways to transform these nice dots overlaid on your face into features to feed the classifer. Features are little bits of information that describe the object or object state that we are trying to divide into categories. Is this description a bit abstract? Imagine you are in a room without windows with only a speaker and a microphone. I am outside this room and I need to make you guess whether there is a cat, dog or a horse in front of me. The rule is that I can only use visual characteristics of the animal, no names or comparisons. What do I tell you? Probably if the animal is big or small, that it has fur, that the fur is long or short, that it has claws or hooves, whether it has a tail made of flesh or just from hair, etcetera. Each bit of information I pass you can be considered afeature, and based the same feature set for each animal, you would be pretty accurate if I chose the features well.

How you extract features from your source data is actually where a lot of research is, it’s not just about creating better classifying algorithms but also about finding better ways to collect and describe data. The same classifying algorithm might function tremendously well or not at all depending on how well the information we feed it is able to discriminate between different objects or object states. If, for example, we would extract eye colour and number of freckles on each face, feed it to the classifier, and then expect it to be able to predict what emotion is expressed, we would not get far. However, the facial landmarks from the same image material describe the position of all the “moving parts” of the depicted face, the things you use to express an emotion. This is certainly useful information!

To get started, let’s take the code from the example above and change it so that it fits our current needs, like this:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import cv2
import dlib
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
def get_landmarks(image):
    detections = detector(image1)
    for k,d in enumerate(detections)#For all detected face instances individually
        shape = predictor(imaged) #Draw Facial Landmarks with the predictor class
        xlist = []
        ylist = []
        for i in range(1,68)#Store X and Y coordinates in two lists
            xlist.append(float(shape.part(i).x))
            ylist.append(float(shape.part(i).y))
            
        for xy in zip(xlistylist)#Store all landmarks in one list in the format x1,y1,x2,y2,etc.
            landmarks.append(x)
            landmarks.append(y)
    if len(detections) > 0:
        return landmarks
    else#If no faces are detected, return error message to other function to handle
        landmarks = "error"
        return landmarks

Here we extract the coordinates of all face landmarks. These coordinates are the first collection of features, and this might be the end of the road. You might also continue and try to derive other measures from this that will tell the classifier more about what is happening on the face. Whether this is necessary or not depends. For now let’s assume it is necessary, and look at ways to extract more information from what we have. Feature generation is always a good thing to try, if only because it brings you closer to the data and might give you ideas or alternative views at it because you’re getting your hands dirty. Later on we’ll see if it was really necessary at a classification level.

To start, look at the coordinates. They may change as my face moves to different parts of the frame. I could be expressing the same emotion in the top left of an image as in the bottom right of another image, but the resulting coordinate matrix would express different numerical ranges. However, the relationships between the coordinates will be similar in both matrices so some information is present in a location invariant form, meaning it is the same no matter where in the picture my face is.

Maybe the most straightforward way to remove numerical differences originating from faces in different places of the image would be normalising the coordinates between 0 and 1. This is easily done by: Norm_Formula, or to put it in code:

1
2
xnorm = [(i-min(xlist))/(max(xlist)-min(xlist)) for i in xlist]
ynorm = [(i-min(ylist))/(max(ylist)-min(ylist)) for i in ylist]

However, there is a problem with this approach because it fits the entire face in a square with both axes ranging from 0 to 1. Imagine one face with its eyebrows up high and mouth open, the person could be surprised. Now imagine an angry face with eyebrows down and mouth closed. If we normalise the landmark points on both faces from 0-1 and put them next to each other we might see two very similar faces. Because both distinguishing features lie at the edges of the face, normalising will push both back into a very similar shape. The faces will end up looking very similar. Take a moment to appreciate what we have done; we have thrown away most of the variation that in the first place would have allowed us to tell the two emotions from each other! Probably this will not work. Of course some variation remains from the open mouth, but it would be better not to throw so much away.

A less destructive way could be to calculate the position of all points relative to each other. To do this we calculate the mean of both axes, which results in the point coordinates of the sort-of “centre of gravity” of all face landmarks. We can then get the position of all points relative to this central point. Let me show you what I mean. Here’s my face with landmarks overlaid:

face2

First we add a “centre of gravity”, shown as a blue dot on the image below:

face3

Lastly we draw a line between the centre point and each other facial landmark location:

face4

Note that each line has both a magnitude (distance between both points) and a direction (angle relative to image where horizontal=0°), in other words, a vector.

But, you may ask, why don’t we take for example the tip of the nose as the central point? This would work as well, but would also throw extra variance in the mix due to short, long, high- or low-tipped noses. The “centre point method” also introduces extra variance; the centre of gravity shifts when the head turns away from the camera, but I think this is less than when using the nose-tip method because most faces more or less face the camera in our sets. There are techniques to estimate head pose and then correct for it, but that is beyond this article.

There is one last thing to note. Faces may be tilted, which might confuse the classifier. We can correct for this rotation by assuming that the bridge of the nose in most people is more or less straight, and offset all calculated angles by the angle of the nose bridge. This rotates the entire vector array so that tilted faces become similar to non-tilted faces with the same expression. Below are two images, the left one illustrates what happens in the code when the angles are calculated, the right one shows how we can calculate the face offset correction by taking the tip of the nose and finding the angle the nose makes relative to the image, and thus find the angular offset β we need to apply.

anglecalc

Now let’s look at how to implement what I described above in Python. It’s actually fairly straightforward. We just slightly modify the get_landmarks() function from above.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
def get_landmarks(image):
    detections = detector(image1)
    for k,d in enumerate(detections)#For all detected face instances individually
        shape = predictor(imaged) #Draw Facial Landmarks with the predictor class
        xlist = []
        ylist = []
        for i in range(1,68)#Store X and Y coordinates in two lists
            xlist.append(float(shape.part(i).x))
            ylist.append(float(shape.part(i).y))
            
        xmean = np.mean(xlist) #Find both coordinates of centre of gravity
        ymean = np.mean(ylist)
        xcentral = [(x-xmean) for x in xlist] #Calculate distance centre <-> other points in both axes
        ycentral = [(y-ymean) for y in ylist]
        
        if xlist[26] == xlist[29]#If x-coordinates of the set are the same, the angle is 0, catch to prevent 'divide by 0' error in function
            anglenose = 0
        else:
            anglenose = int(math.atan((ylist[26]-ylist[29])/(xlist[26]-xlist[29]))*180/math.pi) #point 29 is the tip of the nose, point 26 is the top of the nose brigde
        if anglenose < 0#Get offset by finding how the nose brigde should be rotated to become perpendicular to the horizontal plane
            anglenose += 90
        else:
            anglenose -= 90
        landmarks_vectorised = []
        for xywz in zip(xcentralycentralxlistylist):
            landmarks_vectorised.append(x) #Add the coordinates relative to the centre of gravity
            landmarks_vectorised.append(y)
            #Get the euclidean distance between each point and the centre point (the vector length)
            meannp = np.asarray((ymean,xmean))
            coornp = np.asarray((z,w))
            dist = np.linalg.norm(coornp-meannp)
            landmarks_vectorised.append(dist)
            #Get the angle the vector describes relative to the image, corrected for the offset that the nosebrigde has when the face is not perfectly horizontal
            anglerelative = (math.atan((z-ymean)/(w-xmean))*180/math.pi) - anglenose
            landmarks_vectorised.append(anglerelative)
            
    if len(detections) < 1
        landmarks_vestorised = "error" #If no face is detected set the data to value "error" to catch detection errors
    
    return landmarks_vectorised
    

That was actually quite manageable, no? Now it’s time to put all of the above together with some stuff from the first post. The goal is to read the existing dataset into a training and prediction set with corresponding labels, train the classifier (we use Support Vector Machines with linear kernel from SKLearn, but feel free to experiment with other available kernels such as polynomial or rbf, or other classifiers!), and evaluate the result. This evaluation will be done in two steps; first we get an overall accuracy after ten different data segmentation, training and prediction runs, second we will evaluate the predictive probabilities.

 


Déja-Vu All Over Again

The next thing we will be doing is returning to the two datasets from the original post. Let’s see how this approach stacks up.

First let’s write some code. The approach is to first extract facial landmark points from the images, randomly divide 80% of the data into a training set and 20% into a test set, then feed these into the classifier and train it on the training set. Finally we evaluate the resulting model by predicting what is in the test set to see how the model handles the unknown data. Basically a lot of the steps are the same as what we did earlier.

The quick and dirty (I will clean and ‘pythonify’ the code later, when there is time) solution based off of earlier code could be something like:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
import cv2globrandommathnumpy as npdlibitertools
from sklearn.svm import SVC
__author__ = "Paul van Gent, 2016" #Please leave this line in
emotions = ["anger""contempt""disgust""fear""happiness""neutral""sadness""surprise"] #Emotion list
clahe = cv2.createCLAHE(clipLimit=2.0tileGridSize=(8,8))
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") #Or set this to whatever you named the downloaded file
clf = SVC(kernel='linear'probability=Truetol=1e-3)#, verbose = True) #Set the classifier as a support vector machines with polynomial kernel
def get_files(emotion)#Define function to get file list, randomly shuffle it and split 80/20
    files = glob.glob("dataset\\%s\\*" %emotion)
    random.shuffle(files)
    training = files[:int(len(files)*0.9)] #get first 80% of file list
    prediction = files[-int(len(files)*0.1):] #get last 20% of file list
    return trainingprediction
def get_landmarks(image):
    detections = detector(image1)
    for k,d in enumerate(detections)#For all detected face instances individually
        shape = predictor(imaged) #Draw Facial Landmarks with the predictor class
        xlist = []
        ylist = []
        for i in range(1,68)#Store X and Y coordinates in two lists
            xlist.append(float(shape.part(i).x))
            ylist.append(float(shape.part(i).y))
            
        xmean = np.mean(xlist) #Get the mean of both axes to determine centre of gravity
        ymean = np.mean(ylist)
        xcentral = [(x-xmean) for x in xlist] #get distance between each point and the central point in both axes
        ycentral = [(y-ymean) for y in ylist]
        if xlist[26] == xlist[29]#If x-coordinates of the set are the same, the angle is 0, catch to prevent 'divide by 0' error in function
            anglenose = 0
        else:
            anglenose = int(math.atan((ylist[26]-ylist[29])/(xlist[26]-xlist[29]))*180/math.pi)
        if anglenose < 0:
            anglenose += 90
        else:
            anglenose -= 90
        landmarks_vectorised = []
        for xywz in zip(xcentralycentralxlistylist):
            landmarks_vectorised.append(x)
            landmarks_vectorised.append(y)
            meannp = np.asarray((ymean,xmean))
            coornp = np.asarray((z,w))
            dist = np.linalg.norm(coornp-meannp)
            anglerelative = (math.atan((z-ymean)/(w-xmean))*180/math.pi) - anglenose
            landmarks_vectorised.append(dist)
            landmarks_vectorised.append(anglerelative)
    if len(detections) < 1
        landmarks_vectorised = "error"
    return landmarks_vectorised
def make_sets():
    training_data = []
    training_labels = []
    prediction_data = []
    prediction_labels = []
    for emotion in emotions:
        trainingprediction = get_files(emotion)
        #Append data to training and prediction list, and generate labels 0-7
        for item in training:
            image = cv2.imread(item) #open image
            gray = cv2.cvtColor(imagecv2.COLOR_BGR2GRAY) #convert to grayscale
            clahe_image = clahe.apply(gray)
            get_landmarks(clahe_image)
            if landmarks_vectorised == "error":
                pass
            else:
                training_data.append(landmarks_vectorised) #append image array to training data list
                training_labels.append(emotions.index(emotion))
    
        for item in prediction:
            image = cv2.imread(item)
            gray = cv2.cvtColor(imagecv2.COLOR_BGR2GRAY)
            clahe_image = clahe.apply(gray)
            get_landmarks(clahe_image)
            if landmarks_vectorised == "error":
                pass
            else:
                prediction_data.append(landmarks_vectorised)
                prediction_labels.append(emotions.index(emotion))
    return training_datatraining_labelsprediction_dataprediction_labels   
accur_lin = []
for i in range(0,10):
    print("Making sets %s" %i) #Make sets by random sampling 80/20%
    training_datatraining_labelsprediction_dataprediction_labels = make_sets()
    npar_train = np.array(training_data) #Turn the training set into a numpy array for the classifier
    npar_trainlabs = np.array(training_labels)
    print("training SVM linear %s" %i) #train SVM
    clf.fit(npar_traintraining_labels)
    print("getting accuracies %s" %i) #Use score() function to get accuracy
    npar_pred = np.array(prediction_data)
    pred_lin = clf.score(npar_predprediction_labels)
    print "linear: "pred_lin
    accur_lin.append(pred_lin) #Store accuracy in a list
print("Mean value lin svm: %.3f" %np.mean(accur_lin)) #Get mean accuracy of the 10 runs

Remember that in the previous post, for the standard set at 8 categories we managed to get 69.3% accuracy with the FisherFace classifier. This approach yields 84.1% on the same data, a lot better!

We then reduced the set to 5 emotions (leaving out contempt, fear and sadness), because the 3 categories had very few images, and got 82.5% correct. This approach gives 92.6%, also much improvement.

After adding the less standardised and more difficult images from google, we got 61.6% correct when predicting 7 emotions (the contempt category remained very small so we left that out). This is now 78.2%, also quite an improvement. This remains the lowest accuracy, showing that for a more diverse dataset the problem is also more difficult. Keep in mind that the dataset I use is still quite small in machine learning terms, containing about 1000 images spread over 8 categories.

 


Looking at features
So we derived different features from the data, but weren’t sure whether this was strictly necessary. So was this necessary? It depends! It depends on if doing so adds more unique variance related to what you’re trying to predict, it depends on what classifier you use, etc.

Let’s run different feature combinations as inputs through different classifiers and see what happens. I’ve run all iterations on the same slice of data with 4 emotion categories of comparable size (so that running the same settings again yields the same predictive value).

 

Using all of the features described so far leads to:
Linear SVM: 93.9%
Polynomial SVM: 83.7%
Random Forest Classifier: 87.8%

Now using just the vector length and angle:
Linear SVM: 87.8%
Polynomial SVM: 87.8%
Random Forest Classifier: 79.6%

Now using just the raw coordinates:
Linear SVM: 91.8%
Polynomial SVM: 89.8%
Random Forest Classifier: 59.2%

Now replacing all training data with zeros:
Linear SVM: 32.7%
Polynomial SVM: 32.7%
Random Forest Classifier: 32.7%

 

Now this is interesting! First note that there isn’t much difference in the accuracy of the support vector machine classifiers when using the extra features we generate. This type of classifier already preprocesses the data quite extensively. The extra data we generate does not contain much if any extra information to this classifier, so it only marginally improves the performance of the linear kernel, and actually hurts the polynomial kernel because data with a lot of overlapping variance can also make a classification task more difficult. By the way, this is a nice 2D visualisation of what an SVC tries to achieve, complexity escalates when adding one dimension. Now remember that the SVC operates in an N-dimensional space and try to imagine what a set of hyperplanes in 4, 8, 12, 36 or more dimensions would look like. Don’t drive yourself crazy.

Random Forest Classifiers do things a lot differently. Essentially they are a forest of decision trees. Simplified, each tree is a long list of yes/no questions, and answering all questions leads to a conclusion. In the forest the correlation between each tree is kept as low as possible, which ensures every tree brings something unique to the table when explaining patterns in the data. Each tree then votes on what it thinks the answer is, and most votes win. This approach benefits extensively from the new features we generated, jumping from 59.2% to 87.8% accuracy as we combine all derived features with the raw coordinates.

So you see, the answer you likely get when you ask any scientist a direct question holds true here as well: it depends. Check your data, think twice and try a few things.

The last that may be noticed is that, when not adding any data at all and in stead presenting the classifiers with a matrix of zeros, they still perform slightly above the expected chance level of 25%. This is because the categories are not identically sized.

 


Looking at mistakes
Lastly, let’s take a look at where the model goes wrong. Often this is where you can learn a lot, for example this is where you might find that a single category just doesn’t work at all, which can lead you to look critically at the training material again.

One advantage of the SVM classifier we use is that it is probabilistic. This means that it assigns probabilities to each category it has been trained for (and you can get these probabilities if you set the ‘probability’ flag to True). So, for example, a single image might be “happy” with 85% probability, “angry” with “10% probability, etc.

To get the classifier to return these things you can use its predict_proba() function. You give this function either a single data row to predict or feed it your entire dataset. It will return a matrix where each row corresponds to one prediction, and each column represents a category. I wrote these probabilities to a table and included the source image and label. Looking at some mistakes, here are some notable things that were classified incorrectly (note there are only images from my google set, the CK+ set’s terms prohibit me from publishing images for privacy reasons):

 

google_140

anger: 0.03239878
contempt: 0.13635423
disgust: 0.0117559
fear: 0.00202098
neutral: 0.7560004
happy: 0.00382895
sadness: 0.04207027
surprise: 0.0155695

The correct answer is contempt. To be honest I would agree with the classifier, because the expression really is subtle. Note that contempt is the second most likely according to the classifier.

 

 

google_048

anger: 0.0726657
contempt: 0.24655082
disgust: 0.06427896
fear: 0.02427595
neutral: 0.20176133
happy: 0.03169822
sadness: 0.34911036
surprise: 0.00965867

The correct answer is disgust. Again I can definitely understand the mistake the classifier makes here (I might make the same mistake..). Disgust would be my second guess, but not the classifier’s. I have removed this image from the dataset because it can be ambiguous.

 

google_020

anger: 0.00304093
contempt: 0.01715202
disgust: 0.74954754
fear: 0.04916257
neutral: 0.00806644
happy: 0.13546932
sadness: 0.02680473
surprise: 0.01075646

The correct answer is obviously happy. This is a mistake that is less understandable but still the model is quite sure (~75%). There definitely is no hint of disgust in her face. Do note however, that happiness would be the classifier’s second guess. More training material might rectify this situation.

 

 

google_168

anger: 0.0372873
contempt: 0.08705531
disgust: 0.12282577
fear: 0.16857784
neutral: 0.09523397
happy: 0.26552763
sadness: 0.20521671
surprise: 0.01827547

The correct answer is sadness. Here the classifier is not sure at all (~27%)! Like in the previous image, the second guess (~20%) is the correct answer. This may very well be fixed by having more (and more diverse) training data.

 

 

google_034

anger: 0.01440529
contempt: 0.15626157
disgust: 0.01007962
fear: 0.00466321
neutral: 0.378776
happy: 0.00554828
sadness: 0.07485257
surprise: 0.35541345

The correct answer is surprise. Again a near miss (~38% vs ~36%)! Also note that this is particularly difficult because there are few baby faces in the dataset. When I said earlier that the extra google images are very challenging for a classifier, I meant it!

 

 

 

 


Upping the game – the ultimate challenge
Although the small google dataset I put together is more challenging than the lab-conditions of the CK/CK+ dataset, it is still somewhat controlled. For example I filtered out faces that were more sideways than frontal-facing, where the emotion was very mixed (happily surprised for example), and also where the emotion was so subtle that even I had trouble identifying it.

A far greater (and more realistic still) challenge is the SFEW/AFEW dataset, put together from a large collection of movie scenes. Read more about it here. The set is not publicly available but the author was generous enough to share the set with me so that I could evaluate the taken approach further.

Guess what, it fails miserably! It attained about 44.2% on the images when training on 90% and validating on 10% of the set. Although this is on par with what is mentioned in the paper, it shows there is still a long way to go before computers can recognize emotions with a high enough accuracy in real-life settings. There are also video clips included on which we will spend another post together with convolutional neural nets at a later time.

This set is particularly difficult because it contains different expressions and facial poses and rotations for similar emotions. This was the purpose of the authors; techniques by now are good enough to recognise emotions on controlled datasets with images taken in lab-like conditions, approaching upper 90% accuracy in many recent works (even our relatively simple approach reached early 90). However these sets do not represent real life settings very much, except maybe when using laptop webcams, because you always more or less face this device and sit at a comparable distance when using the laptop. This means for applications in marketing and similar fields the technology is already usable, albeit with much room for improvement still available and requiring some expertise to implement it correctly.

 


Final reflections
Before concluding I want you to take a moment, relax and sit back and think. Take for example the SFEW set with real-life examples, accurate classification of which quickly gets terribly difficult. We humans perform this recognition task remarkably well thanks to our highly complex visual system, which has zero problems with object rotation in all planes, different face sizes, different facial characteristics, extreme changes in lighting conditions or even partial occlusion of a face. Your first response might be “but that’s easy, I do it all the time!”, but it’s really, really, really not. Think for a moment about what an enormously complex problem this really is. I can show you a mouth and you would already be quite good at seeing an emotion. I can show you about 5% of a car and you could recognize it as a car easily, I can even warp and destroy the image and your brain would laugh at me and tell me “easy, that’s a car bro”. This is a task that you solve constantly and in real-time, without conscious effort, with virtually 100% accuracy and while only using the equivalent of ~20 watts for yourentire brain (not just the visual system). The average still-not-so-good-at-object-recognition CPU+GPU home computer uses 350-450 watts when computing. Then there’s supercomputers like theTaihuLight, which require about 15.300.000 watts (using in one hour what the average Dutch household uses in 5.1 years). At least at visual tasks, you still outperform these things by quite a large margin with only 0.00013% of their energy budget. Well done, brain!

Anyway, to try and tackle this problem digitally we need another approach. In another post we will look at various forms of neural nets (modeled after your brain) and how these may or may not solve the problem, and also at some other feature extraction techniques.

 


The CK+ dataset was used for validating and training of the classifier in this article, references to the set are:

  • Kanade, T., Cohn, J. F., & Tian, Y. (2000). Comprehensive database for facial expression analysis. Proceedings of the Fourth IEEE International Conference on Automatic Face and Gesture Recognition (FG’00), Grenoble, France, 46-53.
  • Lucey, P., Cohn, J. F., Kanade, T., Saragih, J., Ambadar, Z., & Matthews, I. (2010). The Extended Cohn-Kanade Dataset (CK+): A complete expression dataset for action unit and emotion-specified expression. Proceedings of the Third International Workshop on CVPR for Human Communicative Behavior Analysis (CVPR4HB 2010), San Francisco, USA, 94-101.

The SFEW/AFEW dataset used for evaluation is authored by and described in:

  • A. Dhall, R. Goecke, S. Lucey and T. Gedeon, “Collecting Large, Richly Annotated Facial- Expression Databases from Movies”, IEEE MultiMedia 19 (2012) 34-41.
  • A. Dhall, R. Goecke, J. Joshi, K. Sikka and T. Gedeon, “ Emotion Recognition In The Wild Challenge 2014: Baseline, Data and Protocol”, ACM ICMI 2014.
Posted by uniqueone
,

https://github.com/mrgloom/Face-landmarks-detection-benchmark

 

 

Kaggle Facial Keypoints Detection
https://github.com/mrgloom/Kaggle-Facial-Keypoints-Detection-Solutions



Explicit shape regression
https://github.com/delphifirst/FaceX
https://github.com/soundsilence/FaceAlignment
http://phg1024.github.io/CSCE625/

https://github.com/ci2cv/face-analysis-sdk  (http://face.ci2cv.net/)
https://github.com/uricamic/flandmark
http://cmp.felk.cvut.cz/~uricamic/flandmark/
http://cmp.felk.cvut.cz/~uricamic/clandmark/
https://github.com/uricamic/clandmark
https://github.com/dnouri/kfkd-tutorial
https://github.com/FaceDetect/jointCascade_py
https://github.com/zhusz/CVPR15-CFSS
http://ibug.doc.ic.ac.uk/resources/fiducial-facial-point-detector-20052007/
http://ibug.doc.ic.ac.uk/resources/facial-point-detector-2010/
https://github.com/kylemcdonald/FaceTracker
http://www.cl.cam.ac.uk/research/rainbow/projects/clmz/
Coarse-to-Fine Auto-Encoder Networks (CFAN) for Real-Time Face Alignment
http://vipl.ict.ac.cn/resources/codes
http://ibug.doc.ic.ac.uk/resources/drmf-matlab-code-cvpr-2013/


ASM/AAM
http://www.milbo.users.sonic.net/stasm/
https://github.com/cxcxcxcx/asmlib-opencv
http://uomasm.sourceforge.net/
https://github.com/greatyao/aamlibrary
https://github.com/greatyao/asmlibrary

constrained local models
https://github.com/TadasBaltrusaitis/CLM-framework

"One Millisecond Face Alignment with an Ensemble of Regression Trees"
http://blog.dlib.net/2014/08/real-time-face-pose-estimation.html
http://www.csc.kth.se/~vahidk/face_ert.html

http://www.ics.uci.edu/~xzhu/face/
https://github.com/TadasBaltrusaitis/CLM-framework


https://github.com/yulequan/face-alignment-in-3000fps
https://github.com/jwyang/face-alignment
https://github.com/jwyang/face-alignment-cpp

https://github.com/AndrejMaris/facefit

http://www.vision.caltech.edu/xpburgos/ICCV13/

Joint Cascade Face Detection and Alignment
https://github.com/luoyetx/JDA

https://github.com/ChrisYang/RCPR
http://www.vision.caltech.edu/xpburgos/ICCV13/

https://github.com/TadasBaltrusaitis/OpenFace

Supervised Descent Method (SDM) for Face Alignment
https://github.com/tntrung/impSDM
https://github.com/patrikhuber/superviseddescent

Not sure
https://github.com/elador/FeatureDetection
https://github.com/t0nyren/kbdetect

Deep learning:
http://mmlab.ie.cuhk.edu.hk/projects/TCDCN.html
http://mmlab.ie.cuhk.edu.hk/archive/CNN_FacePoint.htm
https://github.com/zhzhanp/TCDCN-face-alignment
https://github.com/RiweiChen/DeepFace
Recombinator Networks (in theano)
https://github.com/SinaHonari/RCN
Caffe
https://github.com/ishay2b/VanillaCNN (http://www.openu.ac.il/home/hassner/projects/tcnn_landmarks/)
https://github.com/luoyetx/deep-landmark
https://github.com/qiexing/caffe-regression
https://github.com/pminmin/caffe_landmark
https://github.com/feixuan090803/CNN-Face-Point-Detection
MatConvNet - maybe regression can be applyed to landmard detection task.
https://github.com/bazilas/matconvnet-deepReg




FANN:
https://github.com/olddocks/facialkeypoints

Javascript:
https://github.com/auduno/clmtrackr

Seems to be commercialized, closed source and not publicly available to download, not worth considering it:
http://www.humansensing.cs.cmu.edu/intraface/

Too simple algorithm, not worth considering it:
https://github.com/sdcoca/facex

Posted by uniqueone
,

Face-Resources

Face 2016. 8. 9. 10:41

https://github.com/betars/Face-Resources

 

Face-Resources

Following is a growing list of some of the materials I found on the web for research on face recognition algorithm.

Papers

  1. DeepFace.A work from Facebook.
  2. FaceNet.A work from Google.
  3. One Millisecond Face Alignment with an Ensemble of Regression Trees. Dlib implements the algorithm.
  4. DeepID
  5. DeepID2
  6. DeepID3
  7. Learning Face Representation from Scratch
  8. Face Search at Scale: 80 Million Gallery

Datasets

  1. CASIA WebFace Database. 10,575 subjects and 494,414 images
  2. Labeled Faces in the Wild.13,000 images and 5749 subjects
  3. Large-scale CelebFaces Attributes (CelebA) Dataset 202,599 images and 10,177 subjects. 5 landmark locations, 40 binary attributes.
  4. MSRA-CFW. 202,792 images and 1,583 subjects.
  5. MegaFace Dataset 1 Million Faces for Recognition at Scale 690,572 unique people
  6. FaceScrub. A Dataset With Over 100,000 Face Images of 530 People.
  7. FDDB.Face Detection and Data Set Benchmark. 5k images.
  8. AFLW.Annotated Facial Landmarks in the Wild: A Large-scale, Real-world Database for Facial Landmark Localization. 25k images.
  9. AFW. Annotated Faces in the Wild. ~1k images. 10.3D Mask Attack Dataset. 76500 frames of 17 persons using Kinect RGBD with eye positions (Sebastien Marcel)
  10. Audio-visual database for face and speaker recognition.Mobile Biometry MOBIO http://www.mobioproject.org/
  11. BANCA face and voice database. Univ of Surrey
  12. Binghampton Univ 3D static and dynamic facial expression database. (Lijun Yin, Peter Gerhardstein and teammates)
  13. The BioID Face Database. BioID group
  14. Biwi 3D Audiovisual Corpus of Affective Communication. 1000 high quality, dynamic 3D scans of faces, recorded while pronouncing a set of English sentences.
  15. Cohn-Kanade AU-Coded Expression Database. 500+ expression sequences of 100+ subjects, coded by activated Action Units (Affect Analysis Group, Univ. of Pittsburgh.
  16. CMU/MIT Frontal Faces . Training set: 2,429 faces, 4,548 non-faces; Test set: 472 faces, 23,573 non-faces.

Trained Model

  1. openface. Face recognition with Google's FaceNet deep neural network using Torch.
  2. VGG-Face. VGG-Face CNN descriptor. Impressed embedding loss.

Tutorial

  1. Deep Learning for Face Recognition. Shiguan Shan, Xiaogang Wang, and Ming yang.

Software

  1. OpenCV. With some trained face detector models.
  2. dlib. Dlib implements a state-of-the-art of face Alignment algorithm.
  3. ccv. With a state-of-the-art frontal face detector
  4. libfacedetection. A binary library for face detection in images.

Frameworks

  1. Caffe
  2. Torch7
  3. Theano
  4. cuda-convnet
  5. MXNET
  6. Tensorflow

Miscellaneous

  1. faceswap Face swapping with Python, dlib, and OpenCV
  2. Facial Keypoints Detection Competition on Kaggle.
  3. An implementation of Face Alignment at 3000fps via Local Binary Features

 

Posted by uniqueone
,
Posted by uniqueone
,