Прежде чем перейти непосредственно к части распознавания лиц, я объясню вам, что такое трансферное обучение.
По сути, всякий раз, когда мы выполняем классификацию изображений с использованием 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
Вот и все, ваш код готов к запуску. Теперь проверьте, как работает ваша модель. Вы также можете настроить гиперпараметры, изменив эпохи и другие гиперпараметры.
Спасибо за чтение. Если вы чувствуете какие-либо проблемы в коде, не стесняйтесь комментировать ниже, я буду рад помочь вам. И, пожалуйста, хлопайте, если вам понравилась статья.