开发者认为这是世界上最简单的人脸识别库.....初学,别骗我,姑且相信他...主要用于识别和操作人脸。
这个项目中的人脸识别是基于dlib的,此模型在Labeled Faces in the Wild 上有99.38%的准确度。
正在学习人脸老化方面的知识,需要对人脸图片进行预处理,基于此有了此篇学习博文,感谢Face_Recognition的所有贡献者致敬。
目录
1、face_recognition.api.batch_face_locations(images, number_of_times_to_upsample=1, batch_size=128)
2、face_recognition.api.compare_faces(known_face_encodings, face_encoding_to_check, tolerance=0.6)
3、face_recognition.api.face_distance(face_encodings, face_to_compare)
4、face_recognition.api.face_encodings(face_image, known_face_locations=None, num_jitters=1)
5、face_recognition.api.face_landmarks(face_image, face_locations=None, model='large')
6、face_recognition.api.face_locations(img, number_of_times_to_upsample=1, model='hog')
7、face_recognition.api.load_image_file(file, mode='RGB')
1、face_recognition.api.
batch_face_locations
(images, number_of_times_to_upsample=1, batch_size=128)
def batch_face_locations(images, number_of_times_to_upsample=1, batch_size=128):
"""
Returns an 2d array of bounding boxes of human faces in a image using the cnn face detector
If you are using a GPU, this can give you much faster results since the GPU
can process batches of images at once. If you aren't using a GPU, you don't need this function.
:param img: A list of images (each as a numpy array)
:param number_of_times_to_upsample: How many times to upsample the image looking for faces. Higher numbers find smaller faces.
:param batch_size: How many images to include in each GPU processing batch.
:return: A list of tuples of found face locations in css (top, right, bottom, left) order
"""
def convert_cnn_detections_to_css(detections):
return [_trim_css_to_bounds(_rect_to_css(face.rect), images[0].shape) for face in detections]
raw_detections_batched = _raw_face_locations_batched(images, number_of_times_to_upsample, batch_size)
return list(map(convert_cnn_detections_to_css, raw_detections_batched))
功能描述: (使用GPU时使用此函数)这个函数使用cnn人脸检测,返回一个描述图片中人脸的边界线的2维数组。
参数:
- img:图片的list(每个都是一个numpy数组)。
- number_of_times_to_upsample:对图像进行上采样的倍数,倍数越大,脸部越小。
- batch_size:每个GPU处理批次中包含多少个图像。
返回值:css顺序(上、右、下、左)的一个人脸位置tuples list。
2、face_recognition.api.
compare_faces
(known_face_encodings, face_encoding_to_check, tolerance=0.6)
def compare_faces(known_face_encodings, face_encoding_to_check, tolerance=0.6):
"""
Compare a list of face encodings against a candidate encoding to see if they match.
:param known_face_encodings: A list of known face encodings
:param face_encoding_to_check: A single face encoding to compare against the list
:param tolerance: How much distance between faces to consider it a match. Lower is more strict. 0.6 is typical best performance.
:return: A list of True/False values indicating which known_face_encodings match the face encoding to check
"""
return list(face_distance(known_face_encodings, face_encoding_to_check) <= tolerance)
功能描述:将已知的一些人脸编码与候选的人脸编码进行比对,看他们是否匹配。
参数:
- known_face_encodings:已知的人脸(们)编码list。
- facd_encoding_to_check:一个待比对的人脸编码。
- tolerance:人脸之间匹配的距离。数字越小越严格,0.6具有比较好的表现。
返回值: 一个标志已知的人脸编码与待匹配人脸编码是否匹配的True/False值的list。
3、face_recognition.api.
face_distance
(face_encodings, face_to_compare)
def face_distance(face_encodings, face_to_compare):
"""
Given a list of face encodings, compare them to a known face encoding and get a euclidean distance
for each comparison face. The distance tells you how similar the faces are.
:param faces: List of face encodings to compare
:param face_to_compare: A face encoding to compare against
:return: A numpy ndarray with the distance for each face in the same order as the 'faces' array
"""
if len(face_encodings) == 0:
return np.empty((0))
return np.linalg.norm(face_encodings - face_to_compare, axis=1)
功能描述:将两个人脸编码进行比较,得到一个欧氏距离,以此距离来表示两个人脸的相似度。
参数:
- face_encodings:用来比较的人脸编码list。
- face_to_compare:待比较的一个人脸的编码。
返回值: 一个关于距离的numpy ndarray(其顺序与face_encodings的顺序相同)。
4、face_recognition.api.
face_encodings
(face_image, known_face_locations=None, num_jitters=1)
def face_encodings(face_image, known_face_locations=None, num_jitters=1):
"""
Given an image, return the 128-dimension face encoding for each face in the image.
:param face_image: The image that contains one or more faces
:param known_face_locations: Optional - the bounding boxes of each face if you already know them.
:param num_jitters: How many times to re-sample the face when calculating encoding. Higher is more accurate, but slower (i.e. 100 is 100x slower)
:return: A list of 128-dimensional face encodings (one for each face in the image)
"""
raw_landmarks = _raw_face_landmarks(face_image, known_face_locations, model="small")
return [np.array(face_encoder.compute_face_descriptor(face_image, raw_landmark_set, num_jitters)) for raw_landmark_set in raw_landmarks]
功能描述:对于给定的一张图像,对图像中的每张脸返回128维的人脸编码
参数:
- face_image:包含一张或者多张人脸的图片。
- known_face_location:可选参数,如果已知每个人脸的边界框可用
- num_jitters:在计算编码时对人脸进行重新采样的次数。这个数越高越准确,但是相应速度越慢,如num_jitters=100,这样会慢100倍。
返回值:一个128维人脸编码的list(图像中的每张脸对应一个)
5、face_recognition.api.
face_landmarks
(face_image, face_locations=None, model='large')
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'].")
功能描述:给定一张图,对图像中的每张人脸返回人脸特征(眼睛、鼻子等)的位置dict。
参数:
- face_image:待搜索的图像。
- face_locations:可选,提供一个人脸位置的list供核查
- model:可选,使用哪种模式。“large”是默认的,返回68个特征点,“small”返回5个特征点但是速度更快。
返回值:人脸特征(眼睛、鼻子等)的位置dicts list。
6、face_recognition.api.
face_locations
(img, number_of_times_to_upsample=1, model='hog')
def face_locations(img, number_of_times_to_upsample=1, model="hog"):
"""
Returns an array of bounding boxes of human faces in a image
:param img: An image (as a numpy array)
:param number_of_times_to_upsample: How many times to upsample the image looking for faces. Higher numbers find smaller faces.
:param model: Which face detection model to use. "hog" is less accurate but faster on CPUs. "cnn" is a more accurate
deep-learning model which is GPU/CUDA accelerated (if available). The default is "hog".
:return: A list of tuples of found face locations in css (top, right, bottom, left) order
"""
if model == "cnn":
return [_trim_css_to_bounds(_rect_to_css(face.rect), img.shape) for face in _raw_face_locations(img, number_of_times_to_upsample, "cnn")]
else:
return [_trim_css_to_bounds(_rect_to_css(face), img.shape) for face in _raw_face_locations(img, number_of_times_to_upsample, model)]
功能描述:返回一张图像中的人脸边界框的array。
参数:
- img:一张图片(作为一个numpy array)。
- number_of_times_to_upsample:为了寻找人脸对图片进行上采样的次数。要寻找越小的人脸就要设置更高的数值。
- model:采用哪种人脸检测的模式。“hog”(方向梯度直方图)准确度小一些但是在CPU上的运行速度更快;“cnn”是一个拥有更高准确度的深度学习模式,在GPU/CUDA上速度更快些。默认是“hog”模式。
返回值:一个检测到的人脸的位置(css顺序,上右下左)tuples list。
7、face_recognition.api.
load_image_file
(file, mode='RGB')
def load_image_file(file, mode='RGB'):
"""
Loads an image file (.jpg, .png, etc) into a numpy array
:param file: image file name or file object to load
:param mode: format to convert the image to. Only 'RGB' (8-bit RGB, 3 channels) and 'L' (black and white) are supported.
:return: image contents as numpy array
"""
im = PIL.Image.open(file)
if mode:
im = im.convert(mode)
return np.array(im)
功能描述:加载一个图片文件(.jpg,.png等)成为一个numpy array。
参数:
- file:想要加载的图片文件名字或者文件对象。
- mode:将图像转化成的格式。只支持“RGB”(8位 RGB,3通道),“L”(黑白)两种。
返回值:numpy array形式的图像