Прежде чем перейти непосредственно к части распознавания лиц, я объясню вам, что такое трансферное обучение.

По сути, всякий раз, когда мы выполняем классификацию изображений с использованием CNN, у нас есть два метода: либо вы создаете свою собственную модель глубокого обучения, либо используете трансферное обучение. Но создание нашей собственной модели требует много времени на обучение и больших вычислительных мощностей, если вы хотите повысить точность.

Поэтому вместо этого подхода мы будем использовать трансферное обучение. В трансферном обучении используется предварительно обученная модель, здесь мы используем модель, которая уже обучена на большом количестве данных, и мы можем напрямую использовать их веса для нашего прогноза.

Некоторые из предварительно обученных моделей, которые должен знать каждый специалист по данным, — это Alexnet , Resnet50 , Vgg16 , Mobilenet и т. д.

Для моей системы распознавания лиц мы будем использовать Mobilenet.

Архитектура мобильной сети

Распознавание лица

Прежде чем тратить время, давайте сразу перейдем к делу.

Шаг 1 — Сбор данных

Вы можете собирать любые наборы данных, такие как ваши любимые знаменитости или спортсмены. Но я научу вас, как вы можете собирать свои собственные изображения прямо с веб-камеры, а затем вы можете собирать изображения своих друзей или членов вашей семьи.

Убедитесь, что вы храните набор данных для обучения и проверки в разных папках.

Мы будем собирать набор данных с помощью алгоритма opencv и haarcascade для сбора только изображений лиц. Haarcascade — это алгоритм, используемый для обнаружения лиц.

import cv2
import numpy as np
# Load HAAR face classifier
face_classifier = cv2.CascadeClassifier(‘haarcascade_frontalface_default (1).xml’)
# Load functions
def face_extractor(img):
 # Function detects faces and returns the cropped face
 # If no face detected, it returns the input image
 
 faces = face_classifier.detectMultiScale(img, 1.3, 5)
 
 if faces is ():
 return None
 
 # Crop all faces found
 for (x,y,w,h) in faces:
 cropped_face = img[y:y+h, x:x+w]
return cropped_face
# Initialize Webcam
cap = cv2.VideoCapture(0)
count = 0
# Collect 100 samples of your face from webcam input
while True:
ret, frame = cap.read()
 if face_extractor(frame) is not None:
 count += 1
 face = cv2.resize(face_extractor(frame), (200, 200))
# Save file in specified directory with unique name
 file_name_path = ‘C://Users//ASUS//mlops//Adv CNN//Face Recognition Using VGG16//Face_data//train//n4/’ + str(count) + ‘.jpg’
 cv2.imwrite(file_name_path, face)
# Put count on images and display live count
 cv2.putText(face, str(count), (50, 50), cv2.FONT_HERSHEY_COMPLEX, 1, (0,255,0), 2)
 cv2.imshow(‘Face Cropper’, face)
 
 else:
 print(“Face not found”)
 pass
if cv2.waitKey(1) == 13 or count == 100: #13 is the Enter Key
 break
 
cap.release()
cv2.destroyAllWindows() 
print(“Collecting Samples Complete”)

В приведенном выше коде вы можете изменить имя файла в соответствии с вашим вариантом использования.

Я бы порекомендовал собрать не менее 100 изображений каждого образца. Это все, что касается сбора данных. Перейдем к части обучения модели.

Шаг 2

Загрузка нашего набора данных изображений

from keras.preprocessing.image import ImageDataGenerator
train_data_dir = ‘Face_data/train/’
validation_data_dir = ‘Face_data/validation/’
# Let’s use some data augmentaiton 
train_datagen = ImageDataGenerator(
 rescale=1./255,
 rotation_range=45,
 width_shift_range=0.3,
 height_shift_range=0.3,
 horizontal_flip=True,
 fill_mode=’nearest’)
 
validation_datagen = ImageDataGenerator(rescale=1./255)
 
# set our batch size (typically on most mid tier systems we’ll use 16–32)
batch_size = 32
 
train_generator = train_datagen.flow_from_directory(
 train_data_dir,
 target_size=(img_rows, img_cols),
 batch_size=batch_size,
 class_mode=’categorical’)
 
validation_generator = validation_datagen.flow_from_directory(
 validation_data_dir,
 target_size=(img_rows, img_cols),
 batch_size=batch_size,
 class_mode=’categorical’)

Обучение нашей модели

from keras.optimizers import RMSprop
from keras.callbacks import ModelCheckpoint, EarlyStopping
checkpoint = ModelCheckpoint(“Family_face_recognition.h5”,
 monitor=”val_loss”,
 mode=”min”,
 save_best_only = True,
 verbose=1)
earlystop = EarlyStopping(monitor = ‘val_loss’, 
 min_delta = 0, 
 patience = 3,
 verbose = 1,
 restore_best_weights = True)
# we put our call backs into a callback list
callbacks = [earlystop, checkpoint]
# We use a very small learning rate 
model.compile(loss = ‘categorical_crossentropy’,
 optimizer = RMSprop(lr = 0.001),
 metrics = [‘accuracy’])
# Enter the number of training and validation samples here
#earlier 1097
nb_train_samples = 500
nb_validation_samples = 124
# We only train 5 EPOCHS 
epochs = 5
batch_size = 32
history = model.fit_generator(
 train_generator,
 steps_per_epoch = nb_train_samples // batch_size,
 epochs = epochs,
 callbacks = callbacks,
 validation_data = validation_generator,
 validation_steps = nb_validation_samples // batch_size)

Загрузка нашего классификатора

from keras.models import load_model
classifier = load_model(‘Family_face_recognition.h5’)

Тестирование нашего классификатора на некоторых тестовых изображениях

import os
import cv2
import numpy as np
from os import listdir
from os.path import isfile, join
family_face_dict = {“[0]”: “Milind”, 
 “[1]”: “Vasu”,
 “[2]”: “Mom”,
 “[3]”: “Dad”,
 “[4]”: “Grandmother “,
 }
family_face_dict_n = {“n0”: “Milind”, 
 “n1”: “Vasu”,
 “n2”: “Mom”,
 “n3”: “Dad”,
 “n4”: “Grandmother”,
 }
def draw_test(name, pred, im):
 monkey = family_face_dict[str(pred)]
 BLACK = [0,0,0]
 expanded_image = cv2.copyMakeBorder(im, 80, 0, 0, 100 ,cv2.BORDER_CONSTANT,value=BLACK)
 cv2.putText(expanded_image, monkey, (20, 60) , cv2.FONT_HERSHEY_SIMPLEX,1, (0,0,255), 2)
 cv2.imshow(name, expanded_image)
def getRandomImage(path):
 “””function loads a random images from a random folder in our test path “””
 folders = list(filter(lambda x: os.path.isdir(os.path.join(path, x)), os.listdir(path)))
 random_directory = np.random.randint(0,len(folders))
 path_class = folders[random_directory]
 print(“Class — “ + family_face_dict_n[str(path_class)])
 file_path = path + path_class
 file_names = [f for f in listdir(file_path) if isfile(join(file_path, f))]
 random_file_index = np.random.randint(0,len(file_names))
 image_name = file_names[random_file_index]
 return cv2.imread(file_path+”/”+image_name)
for i in range(0,10):
 input_im = getRandomImage(“Face_data/validation/”)
 input_original = input_im.copy()
 input_original = cv2.resize(input_original, None, fx=0.5, fy=0.5, interpolation = cv2.INTER_LINEAR)
 
 input_im = cv2.resize(input_im, (224, 224), interpolation = cv2.INTER_LINEAR)
 input_im = input_im / 255.
 input_im = input_im.reshape(1,224,224,3) 
 
 # Get Prediction
 res = np.argmax(classifier.predict(input_im, 1, verbose = 0), axis=1)
 
 # Show image with predicted class
 draw_test(“Prediction”, res, input_original) 
 cv2.waitKey(0)
cv2.destroyAllWindows()

Вот моя ссылка на репозиторий github https://github.com/MilindRastogi/Face-Recognition-using-Transfer-Learning.git

Вот и все, ваш код готов к запуску. Теперь проверьте, как работает ваша модель. Вы также можете настроить гиперпараметры, изменив эпохи и другие гиперпараметры.

Спасибо за чтение. Если вы чувствуете какие-либо проблемы в коде, не стесняйтесь комментировать ниже, я буду рад помочь вам. И, пожалуйста, хлопайте, если вам понравилась статья.