Deep Learning Face Recognition

Thực hiện Face Identification và Verification với VGGFace2

Thực hiện Face Identification và Verification với VGGFace2

1. Nhắc lại bài toán Face Recognition

Face Recognition là bài toán nhận diện người dựa vào khuôn mặt của họ trong hình ảnh hoặc video. Hai trong số các bài toán của Face Recognition là:

  • Face Verification: Ánh xạ 1-1, giữa khuôn mặt của một người đưa vào hệ thống nhận diện với một người đã biết trước. Face Verification trả lời câu hỏi: Đây có phải là anh/chị/ông/bà A không?
  • Face Identification: Ánh xạ 1-nhiều, giữa giữa khuôn mặt của một người đưa vào hệ thống nhận diện với một tập những người đã biết trước trong CSDL. Face Identification trả lời câu hỏi: Đây là ai?

Trong bài này, chúng ta sẽ sử dụng VGGFace2 model (đã được Trained trên tập dữ liệu MS-Celeb-1M) để thực hiện bài toán Face Recognition.

2. VGGFace model.

VGG model được tạo ra bởi các nhà khoa học trong nhóm Visual Geometry Group (VGG) thuộc trường đại học Oxford. Đến thời điểm hiện tại, nó có 2 phiên bản: VGGFace và VGGFace2.

2.1 VGGFace

VGGFace model được công bố vào năm 2015 trong bài báo Deep Face Recognition bởi Omkar Parkhi và đồng nghiệp. Đóng góp lớn nhất của bài báo là miêu tả cách thức thu thập một số lượng lớn dữ liệu để huấn luyện một CNN model (2.6M images, 2.6K people). Tập dữ liệu này sau đó được sử dụng làm cơ sở để phát triển các model CNN cho các nhiệm vụ Face Recognition như Face Identification và Face Verification. Cụ thể, các models được đào tạo trên tập dữ liệu rất lớn, sau đó được định giá trên tập dữ liệu nhận dạng khuôn mặt điểm chuẩn, chứng tỏ rằng mô hình có hiệu quả trong việc tạo ra các đặc điểm tổng quát từ khuôn mặt.

Bài báo cũng mô tả quá trình đào tạo một bộ phân loại khuôn mặt. Trước tiên sử dụng hàm kích hoạt Softmax trong lớp đầu của CNN model ra để phân loại khuôn mặt theo từng người. Lớp này sau đó được loại bỏ để đầu ra của mạng CNN là một biểu diễn đặc trưng Vector của khuôn mặt, được gọi là Face Embedding. Sau đó, model được đào tạo thêm, thông qua tinh chỉnh, để khoảng cách Euclid giữa các Vectos của cùng một người nhỏ nhất có thể và các Vectos của 2 người khác nhau lớn nhất có thể. Điều này đạt được bằng cách sử dụng Triplet Loss.

Mạng CNN ở đây sử dụng theo kiểu kiến trúc của VGG, với các khối lớp có kích thước Kernel nhỏ, hàm kích hoạt ReLU. Tiếp theo là các lớp Max Pooling và cuối cùng là các lớp Fully Connected làm nhiệm vụ phân loại tại phần cuối của mạng. Chính vì sử dụng kiến trúc của họ VGG nên model này có tên là VGGFace.

2.2 VGGFace 2

Qiong Cao và đồng nghiệp đã cho ra đời VGGFace2 trong bài báo có tiêu đề VGGFace2: A Dataset For Recognizing Faces Across Pose And Age. Vẫn là ý tưởng sử dụng lượng lớn dữ liệu như VGGFace, nhưng kích thước dữ liệu của VGGFace2 lớn hơn rất nhiều. Cụ thể, có tổng số 3.31 triệu ảnh của 9131 người khác nhau, tức trung bình mỗi người có 362.6 ảnh trong bộ dataset của VGGFace2. Phần lớn những ảnh này được thu thập từ Google Image Search với sự đa dạng về giới tính, tuổi tác, màu da, tư thế, sắc tộc, điều kiện môi trường, … Có một điều khác so với VGGFace, đó là VGGFace2 không sử dụng kiến trúc của họ VGG, thay vào đó, nó sử dụng ResNet-50 hoặc SqueezeNet-ResNet-50. Những models này đều được đánh giá trên tập dữ liệu chuẩn, và đều đạt được state-of-the-art. Tuy nhiên, có lẽ vì chung ý tưởng là sử dụng lượng dữ liệu lớn như VGGFace nên nó vẫn lấy cái tên VGGFace2.

3. Cài đặt thư viện keras-vggface

Các tác giả của VGGFace/VGFFace2 cung cấp mã nguồn cho các models của họ, cũng như các Pre-trained models mà chúng ta có thể tải xuống và sử dụng được. Các Pre-trained models này được viết bằng Caffe và PyTorch, không có cho TensorFlow hoặc Keras. Mặc dù vậy, chúng ta hoàn toàn có thể chuyển đổi từ Caffe/Pytorch sang Tensorflow/Keras một cách dễ dàng. Và thực tế là có khá nhiều người đã làm sẵn việc này cho chúng ta. Nổi bật trong số đó là dự án keras-vggface của tác giả Refik Can Malli1. Thư viện này có thể được cài đặt thông qua pip:

$ pip install git+https://github.com/rcmalli/keras-vggface.git

Nếu cài đặt thành công, bạn sẽ nhận được thông báo:

Successfully installed keras-2.4.3 keras-vggface-0.6 pyyaml-5.4.1

Kiểm tra lại bằng cách import vào trong code python:

# check version of keras_vggface
import keras_vggface
# print version
print(keras_vggface.__version__)

Output:

0.6

4. Detect Faces

Trước khi có thể thực hiện nhận dạng khuôn mặt, chúng ta cần phát hiện khuôn mặt. Đó là quá trình tự động định vị các khuôn mặt trong một bức ảnh và khoanh vùng chúng bằng cách vẽ một hộp giới hạn xung quanh phạm vi của chúng. Trong bài viêt này, chúng ta sẽ sử dụng Multi-Task Cascaded Convolutional Neural Network, để phát hiện khuôn mặt. Đây là một mô hình học sâu hiện đại để phát hiện khuôn mặt, được mô tả trong bài báo năm 2016 có tiêu đề Joint Face Detection and Alignment Using Multitask Cascaded Convolutional Networks.

Cài đặt MTCNN từ dự án ipazc/mtcnn của Ivan de Paz:

$  pip install mtcnn

Kiểm tra cài đặt:

# confirm mtcnn was installed correctly
import mtcnn
# print version
print(mtcnn.__version__)

Kết quả thực thi:

0.1.0

Chúng ta sẽ sử dụng thư viện mtcnn để tạo phát hiện khuôn mặt, sau đó trích xuất khuôn mặt bằng VGGFace model trong các phần tiếp theo.

Trước tiên, mở một hình ảnh dưới dạng một mảng NumPy, sử dụng hàm Matplotlib imread():

...
# load image from file
pixels = pyplot.imread(filename)

Tiếp theo, gọi thư viện MTCNN và sử dụng nó để phát hiện tất cả các khuôn mặt trong ảnh đã mở:

...
# create the detector, using default weights
detector = MTCNN()
# detect faces in the image
results = detector.detect_faces(pixels)

Kết quả là danh sách các hộp giới hạn khuôn mặt, trong đó mỗi hộp xác định góc dưới bên trái của hộp giới hạn, cũng như chiều rộng và chiều cao. Giả sử chỉ có một khuôn mặt trong ảnh cho thí nghiệm lần này, chúng ta có thể xác định tọa độ pixel của hộp giới hạn như sau.

...
# extract the bounding box from the first face
x1, y1, width, height = results[0]['box']
x2, y2 = x1 + width, y1 + height

Sử dụng kết quả bên trên để cắt ra hình ảnh khuôn mặt:

...
# extract the face
face = pixels[y1:y2, x1:x2]

VGGFace model yêu cầu mỗi khuôn mặt có kích thước 224x224. Vì thế, chúng ta sẽ resize lại hình ảnh khuôn mặt, sử dụng thư viện PIL:

...
# resize pixels to the model size
image = Image.fromarray(face)
image = image.resize((224, 224))
face_array = asarray(image)

Code đầy đủ, bắt đầu từ việc mở hình ảnh, phát hiện khuôn mặt và hiển thị kết quả như bên dưới (file face_detection.py):

import argparse
from matplotlib import pyplot
from PIL import Image
from numpy import asarray
from mtcnn.mtcnn import MTCNN

import tensorflow as tf
from tensorflow.compat.v1.keras.backend import set_session
config = tf.compat.v1.ConfigProto()
config.gpu_options.allow_growth = True  # dynamically grow the memory used on the GPU
config.log_device_placement = True  # to log device placement (on which device the operation ran)
sess = tf.compat.v1.Session(config=config)
set_session(sess)

# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="path to the image")
args = vars(ap.parse_args())

# extract a single face from a given photograph
def extract_face(filename, required_size=(224, 224)):
	# load image from file
	pixels = pyplot.imread(filename)
	# create the detector, using default weights
	detector = MTCNN()
	# detect faces in the image
	results = detector.detect_faces(pixels)
	# extract the bounding box from the first face
	x1, y1, width, height = results[0]['box']
	x2, y2 = x1 + width, y1 + height
	# extract the face
	face = pixels[y1:y2, x1:x2]
	# resize pixels to the model size
	image = Image.fromarray(face)
	image = image.resize(required_size)
	face_array = asarray(image)
	return face_array

# load the photo and extract the face
pixels = extract_face(args['image'])
# plot the extracted face
pyplot.imshow(pixels)
# show the plot
pyplot.show()

Chạy code trên:

$ python face_detection.py --image sharon_stone1.jpg

Kết quả:

5. Face Recognition

Trong phần này, chúng ta sẽ sử dụng mô hình VGGFace2 để thực hiện Face Recognition với ảnh của những người nổi tiếng từ Wikipedia. Một mô hình VGGFace có thể được tạo ra bằng cách sử dụng hàm tạo VGGFace() và chỉ định loại mô hình cần tạo thông qua đối số mô hình.

...
model = VGGFace(model=...)

Thư viện keras-vggface cung cấp ba Pre-trained VGGModel models, model VGGFace1 sử dụng kiến trúc vgg16 (mặc định) và model VGGFace2 sử dụng kiến trúc resnet50 hoặc senet50. Ví dụ dưới đây tạo VGGFace2 model với kiến trúc resnet50:

# example of creating a face embedding
from keras_vggface.vggface import VGGFace
# create a vggface2 model
model = VGGFace(model='resnet50')
# summarize input and output shape
print('Inputs: %s' % model.inputs)
print('Outputs: %s' % model.outputs)

Lần đầu tiên khi model được tạo, thư viện sẽ tải xuống các trọng số của mô hình và lưu chúng trong thư mục ./keras/models/vggface/ trong thư mục /home/. Kích thước của weights cho kiểu resnet50 là khoảng 158MB, vì vậy quá trình tải xuống có thể mất vài phút tùy thuộc vào tốc độ kết nối internet của bạn. Chạy ví dụ trên sẽ in ra kích thước của đầu vào và đầu ra của mô hình. Chúng ta có thể thấy rằng mô hình mong đợi đầu vào là hình ảnh của khuôn mặt có kích thước 244 × 244 và kết quả đầu ra sẽ là một dự đoán của lớp là 8.631 người. Điều này là bởi vì mô hình đã được huấn luyện với 8.631 người trong tập dữ liệu MS-Celeb-1M.

Inputs: [<tf.Tensor input_1:0 shape=(?, 224, 224, 3) dtype=float32>]
Outputs: [<tf.Tensor classifier/Softmax:0 shape=(?, 8631) dtype=float32>]

Mô hình Keras này có thể được sử dụng trực tiếp để dự đoán xác suất của một khuôn mặt nhất định thuộc về một hoặc nhiều hơn tám nghìn người nổi tiếng được biết đến; ví dụ:

...
# perform prediction
yhat = model.predict(samples)

Sau khi dự đoán được đưa ra, các chỉ số của các phần tử với xác suất lớn nhất có thể được ánh xạ với tên của những người nổi tiếng và có thể lấy ra năm tên hàng đầu có xác suất cao nhất. Hành vi này được cung cấp bởi hàm decode predictions() trong thư viện keras-vggface:

...
# convert prediction into names
results = decode_predictions(yhat)
# display most likely results
for result in results[0]:
print('%s: %.3f%%' % (result[0], result[1]*100))

Trước khi chúng ta có thể đưa ra dự đoán với một khuôn mặt, các giá trị pixel phải được chia tỷ lệ giống như cách mà dữ liệu đã được chuẩn bị khi mô hình VGGFace được huấn luyện. Điều này có thể đạt được bằng cách sử dụng hàm prerocess_input() được cung cấp trong thư viện keras-vggface và chỉ định version=2 để phù hợp với VGGFace2 model. (version=1 dành cho VGGFace).

...
# convert one face into samples
pixels = pixels.astype(float32)
samples = expand_dims(pixels, axis=0)
# prepare the face for the model, e.g. center pixels
samples = preprocess_input(samples, version=2)

Kết hợp tất cả những điều này lại với nhau ta được code đầy đủ:

import argparse
from numpy import expand_dims
from matplotlib import pyplot
from PIL import Image
from numpy import asarray
from mtcnn.mtcnn import MTCNN
from keras_vggface.vggface import VGGFace
from keras_vggface.utils import preprocess_input
from keras_vggface.utils import decode_predictions

import tensorflow as tf
from tensorflow.compat.v1.keras.backend import set_session
config = tf.compat.v1.ConfigProto()
config.gpu_options.allow_growth = True  # dynamically grow the memory used on the GPU
config.log_device_placement = True  # to log device placement (on which device the operation ran)
sess = tf.compat.v1.Session(config=config)
set_session(sess)

# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="path to the image")
args = vars(ap.parse_args())


# extract a single face from a given photograph
def extract_face(filename, required_size=(224, 224)):
    # load image from file
    pixels = pyplot.imread(filename)
    # create the detector, using default weights
    detector = MTCNN()
    # detect faces in the image
    results = detector.detect_faces(pixels)
    # extract the bounding box from the first face
    x1, y1, width, height = results[0]['box']
    x2, y2 = x1 + width, y1 + height
    # extract the face
    face = pixels[y1:y2, x1:x2]
    # resize pixels to the model size
    image = Image.fromarray(face)
    image = image.resize(required_size)
    face_array = asarray(image)
    return face_array

# load the photo and extract the face
pixels = extract_face(args['image'])
# convert one face into samples
pixels = pixels.astype('float32')
samples = expand_dims(pixels, axis=0)
# prepare the face for the model, e.g. center pixels
samples = preprocess_input(samples, version=2)
# create a vggface model
model = VGGFace(model='resnet50')
# perform prediction
yhat = model.predict(samples)
# convert prediction into names
results = decode_predictions(yhat)
# display most likely results
for result in results[0]:
    print('%s: %.3f%%' % (result[0][3:-1], result[1]*100))

Chạy code:

$ python face_recognition.py --image sharon_stone1.jpg 

Một cách tuần tự, đầu tiên khuôn mặt được phát hiện và trích xuất, sau đó VGGFace2 sẽ dự đoán danh tính của khuôn mặt. Năm cái tên có xác suất cao nhất sẽ được hiển thị. Chúng ta có thể thấy rằng mô hình xác định chính xác khuôn mặt thuộc về Sharon Stone với khả năng là 99,618%:

Sharon_Stone: 99.618%
Noelle_Reno: 0.096%
Anita_Lipnicka: 0.021%
Elisabeth_R\xc3\xb6hm: 0.017%
Tina_Maze: 0.017%

Thử kiểm tra với một người khác, lần này là Channing Tatum:

$ python face_recognition.py --image Channing_Tatum_by_Gage_Skidmore_3.jpg 

Kết quả:

Channing_Tatum: 90.526%
Les_Miles: 0.238%
Eoghan_Quigg: 0.212%
Nico_Rosberg: 0.153%
Venke_Knutson: 0.136%

Chúng ta có thể thấy rằng mô hình VGGFace2 xác định chính xác khuôn mặt là của Channing Tatum với độ xác suất là 90,526%.

Bạn có thể thử nhận diện với các bức ảnh khác của những người nổi tiếng được lấy từ Wikipedia, bao gồm nhiều giới tính, chủng tộc và độ tuổi khác nhau. Bạn sẽ phát hiện ra rằng mô hình này không hoàn hảo, thi thoảng vẫn có sự nhầm lẫn hoặc xác suất không cao. Bạn cũng có thể thử các phiên bản khác của mô hình, chẳng hạn như vgg16senet50, sau đó so sánh kết quả. Ví dụ: mình thấy rằng với một bức ảnh của Oscar Isaac, vgg16 có hiệu quả, nhưng với các kiểu của VGGFace2 thì không. Mô hình còn có thể được sử dụng để xác định các khuôn mặt mới. Một cách tiếp cận sẽ là huấn luyện lại mô hình ở phần phân loại khuôn mặt, với một tập dữ liệu khuôn mặt mới. Chúng ta sẽ áp dụng cách tiếp cận này trong bài viết về FaceNet model.

6. Face Verification

Mô hình VGGFace2 có thể được sử dụng để thực hiện Face Verification. Điều này liên quan đến việc tính toán và so sánh khoảng cách giữa Face Embedding vector của một khuôn mặt đưa vào với Face Embedding vector của một khuôn mặt đã biết trong hê thống. Nếu 2 vectors có khoảng cách gần nhau thì có thể kết luận 2 khuôn mặt là của cùng 1 người, và ngược lại.

Các phép đo khoảng cách giữa 2 vectors thường dùng là khoảng cách Euclide và khoảng cách Cosine. Giá trị ngưỡng để xác định thế nào là gần hay xa cần được điều chỉnh cho mỗi tập dữ liệu hoặc ứng dụng cụ thể.

Để tạo ra Face Embedding vector, đầu tiên, chúng ta có thể gọi mô hình VGGFace mà không cần bộ phân loại bằng cách đặt đối số include_top=False, chỉ định kích thước của dữ liệu đầu vào, và gán đối số pooling=‘avg’ để bộ lọc ánh xạ đầu ra của mô hình được thành một vector, sử dụng global average pooling.

...
# create a vggface model
model = VGGFace(model='resnet50', include_top=False, input_shape=(224, 224, 3), pooling='avg')

Mô hình này, sau đó được sử dụng để đưa ra dự đoán, kết quả trả về là một Face Embedding vector của khuôn mặt.

...
# perform prediction
yhat = model.predict(samples)   

Chúng ta sẽ tổng hợp lại những thứ trình bày ở trên thành 1 hàm, tham số truyền vào là danh sách các file ảnh có khuôn mặt. Hàm này sẽ tìm và trích xuất các khuôn mặt từ mỗi ảnh thông qua hàm extract_face() đã sử dụng trong phần trước. Mỗi khuôn mặt cần phải được tiền xử lý trước khi đưa vào mô hình VGGFace2 bằng cách hàm preprocess_input(). Kết quả cuối cùng trả về là một mảng chứa toàn bộ Face Embedding vectors của tất các các khuôn mặt có trong các ảnh truyền vào cho hàm số:

# extract faces and calculate face embeddings for a list of photo files
def get_embeddings(filenames):
    # extract faces
    faces = [extract_face(f) for f in filenames]
    # convert into an array of samples
    samples = asarray(faces, 'float32')
    # prepare the face for the model, e.g. center pixels
    samples = preprocess_input(samples, version=2)
    # create a vggface model
    model = VGGFace(model='resnet50', include_top=False, input_shape=(224, 224, 3),
    pooling='avg')
    # perform prediction
    yhat = model.predict(samples)
    return yhat

Mình sẽ lấy ảnh của Sharon Stone - sharon stone1.jpg (đã được sử dụng trước đây) để làm tiêu chuẩn. Sau đó, mình lấy một ảnh khác cũng của Sharon Stone và một ảnh không phải là Sharon Stone để so sánh:

Face Verification có thể được thực hiện bằng cách tính toán khoảng cách Cosine giữa Face Embedding vector của ảnh tiêu chuẩn và Face Embedding vector của ảnh cần Verrify. Để làm điều này, ta sẽ sử dụng hàm cosine() trong thư viện SciPy. Khoảng cách lớn nhất giữa 2 vectors là 1.0 (hai vectors trùng nhau hoàn toàn), và khoảng cách tối thiểu là 0.0 (hai vectors khác nhau hoàn toàn). Giá trị khoảng cách giới hạn phổ biến thường được sử dụng cho Face Recognition là từ 0.4 đến 0.6. Ban đầu, sử dụng giá trị 0.5 rồi sau đó dựa trên thực tế để điểu chỉnh dần. Hàm is_match() bên dưới sẽ thực hiện điều này:

# determine if a candidate face is a match for a known face
def is_match(known_embedding, candidate_embedding, thresh=0.5):
    # calculate distance between embeddings
    score = cosine(known_embedding, candidate_embedding)
    if score <= thresh:
        print('>face is a Match (%.3f <= %.3f)' % (score, thresh))
    else:
        print('>face is NOT a Match (%.3f > %.3f)' % (score, thresh))

Code đầy đủ cho chức năng Face Verification như sau:

from matplotlib import pyplot
from PIL import Image
from numpy import asarray
from scipy.spatial.distance import cosine
from mtcnn.mtcnn import MTCNN
from keras_vggface.vggface import VGGFace
from keras_vggface.utils import preprocess_input

import tensorflow as tf
from tensorflow.compat.v1.keras.backend import set_session
config = tf.compat.v1.ConfigProto()
config.gpu_options.allow_growth = True  # dynamically grow the memory used on the GPU
config.log_device_placement = True  # to log device placement (on which device the operation ran)
sess = tf.compat.v1.Session(config=config)
set_session(sess)

# extract a single face from a given photograph
def extract_face(filename, required_size=(224, 224)):
	# load image from file
	pixels = pyplot.imread(filename)
	# create the detector, using default weights
	detector = MTCNN()
	# detect faces in the image
	results = detector.detect_faces(pixels)
	# extract the bounding box from the first face
	x1, y1, width, height = results[0]['box']
	x2, y2 = x1 + width, y1 + height
	# extract the face
	face = pixels[y1:y2, x1:x2]
	# resize pixels to the model size
	image = Image.fromarray(face)
	image = image.resize(required_size)
	face_array = asarray(image)
	return face_array

# extract faces and calculate face embeddings for a list of photo files
def get_embeddings(filenames):
	# extract faces
	faces = [extract_face(f) for f in filenames]
	# convert into an array of samples
	samples = asarray(faces, 'float32')
	# prepare the face for the model, e.g. center pixels
	samples = preprocess_input(samples, version=2)
	# create a vggface model
	model = VGGFace(model='resnet50', include_top=False, input_shape=(224, 224, 3), pooling='avg')
	# perform prediction
	yhat = model.predict(samples)
	return yhat

# determine if a candidate face is a match for a known face
def is_match(known_embedding, candidate_embedding, thresh=0.5):
	# calculate distance between embeddings
	score = cosine(known_embedding, candidate_embedding)
	if score <= thresh:
		print('>face is a Match (%.3f <= %.3f)' % (score, thresh))
	else:
		print('>face is NOT a Match (%.3f > %.3f)' % (score, thresh))

# define filenames
filenames = ['sharon_stone1.jpg', 'sharon_stone2.jpg', 'sharon_stone3.jpg', 'channing_tatum.jpg']
# get embeddings file filenames
embeddings = get_embeddings(filenames)
# define sharon stone
sharon_id = embeddings[0]
# verify known photos of sharon
print('Positive Tests')
is_match(embeddings[0], embeddings[1])
is_match(embeddings[0], embeddings[2])
# verify known photos of other people
print('Negative Tests')
is_match(embeddings[0], embeddings[3])

Chúng ta có thể kiểm tra một số hình ảnh ví dụ bằng cách tải thêm ảnh về Sharon StoneChanning Tatum từ Wikipedia.

Bức ảnh đầu tiên được lấy làm tiêu bản cho Sharon Stone và những bức ảnh còn lại trong danh sách là để Verify. Chạy ví dụ:

$ python face_verification.py

Kết quả:

Positive Tests
>face is a Match (0.460 <= 0.500)
>face is a Match (0.311 <= 0.500)
Negative Tests
>face is NOT a Match (0.701 > 0.500)

Chúng ta có thể thấy rằng hệ thống đã xác minh chính xác hai bức ảnh về Sharon Stone, còn ảnh của Channing Tatum được xác minh chính xác không phải là Sharon Stone.

7. Kết luận

Trong bài viết này, chúng ta đã cùng nhau khám phá cách phát triển hệ thống Face Recognition để nhận dạng và xác minh khuôn mặt bằng mô hình VGGFace2. Cụ thể:

  • Giới thiệu về VGGFace và VGGFace2
  • Cách cài đặt thư viện Keras VGGFace để sử dụng các mô hình này bằng Python với Keras.
  • Cách phát triển hệ thống nhận dạng khuôn mặt để dự đoán tên của những người nổi tiếng trong các bức ảnh.
  • Cách phát triển hệ thống xác minh khuôn mặt để xác nhận danh tính của một người được từ bức ảnh khuôn mặt của họ.

Toàn bộ source code của bài này, các bạn có thể tham khảo tại đây.

Trong bài tiếp theo, chúng ta sẽ khám phá cách thực hiện bài toán Face Recongition bằng mô hình FaceNet. Mời các bạn đón đọc.

8. Tham khảo