(face_image, face_locations=None, model="large")
Given an image, returns a dict of face feature locations (eyes, nose, etc) for each face in the image

    :param face_image: image to search
    :param face_locations: Optionally provide a list of face locations to check.
    :param model: Optional - which model to use. "large" (default) or "small" which only returns 5 points but is faster.
    :return: A list of dicts of face feature locations (eyes, nose, etc)
Given an image, returns a dict of face feature locations (eyes, nose, etc) for each face in the image
Given an image returns a dict of face feature locations ( eyes nose etc ) for each face in the image
def face_landmarks(face_image, face_locations=None, model="large"):
    """
    Given an image, returns a dict of face feature locations (eyes, nose, etc) for each face in the image

    :param face_image: image to search
    :param face_locations: Optionally provide a list of face locations to check.
    :param model: Optional - which model to use. "large" (default) or "small" which only returns 5 points but is faster.
    :return: A list of dicts of face feature locations (eyes, nose, etc)
    """
    landmarks = _raw_face_landmarks(face_image, face_locations, model)
    landmarks_as_tuples = [[(p.x, p.y) for p in landmark.parts()] for landmark in landmarks]

    # For a definition of each point index, see https://cdn-images-1.medium.com/max/1600/1*AbEg31EgkbXSQehuNJBlWg.png
    if model == 'large':
        return [{
            "chin": points[0:17],
            "left_eyebrow": points[17:22],
            "right_eyebrow": points[22:27],
            "nose_bridge": points[27:31],
            "nose_tip": points[31:36],
            "left_eye": points[36:42],
            "right_eye": points[42:48],
            "top_lip": points[48:55] + [points[64]] + [points[63]] + [points[62]] + [points[61]] + [points[60]],
            "bottom_lip": points[54:60] + [points[48]] + [points[60]] + [points[67]] + [points[66]] + [points[65]] + [points[64]]
        } for points in landmarks_as_tuples]
    elif model == 'small':
        return [{
            "nose_tip": [points[4]],
            "left_eye": points[2:4],
            "right_eye": points[0:2],
        } for points in landmarks_as_tuples]
    else:
        raise ValueError("Invalid landmarks model type. Supported models are ['small', 'large'].")
def face_landmarks ( face_image , face_locations = None , model = "large" ) : landmarks = _raw_face_landmarks ( face_image , face_locations , model ) landmarks_as_tuples = [ [ ( p . x , p . y ) for p in landmark . parts ( ) ] for landmark in landmarks ] # For a definition of each point index, see https://cdn-images-1.medium.com/max/1600/1*AbEg31EgkbXSQehuNJBlWg.png if model == 'large' : return [ { "chin" : points [ 0 : 17 ] , "left_eyebrow" : points [ 17 : 22 ] , "right_eyebrow" : points [ 22 : 27 ] , "nose_bridge" : points [ 27 : 31 ] , "nose_tip" : points [ 31 : 36 ] , "left_eye" : points [ 36 : 42 ] , "right_eye" : points [ 42 : 48 ] , "top_lip" : points [ 48 : 55 ] + [ points [ 64 ] ] + [ points [ 63 ] ] + [ points [ 62 ] ] + [ points [ 61 ] ] + [ points [ 60 ] ] , "bottom_lip" : points [ 54 : 60 ] + [ points [ 48 ] ] + [ points [ 60 ] ] + [ points [ 67 ] ] + [ points [ 66 ] ] + [ points [ 65 ] ] + [ points [ 64 ] ] } for points in landmarks_as_tuples ] elif model == 'small' : return [ { "nose_tip" : [ points [ 4 ] ] , "left_eye" : points [ 2 : 4 ] , "right_eye" : points [ 0 : 2 ] , } for points in landmarks_as_tuples ] else : raise ValueError ( "Invalid landmarks model type. Supported models are ['small', 'large']." )