ИСПОЛЬЗОВАНИЕ МОБИЛЬНОЙ СЕТИ

Распознавание лиц – это задача компьютерного зрения, позволяющая идентифицировать и верифицировать человека по фотографии его лица. Если вы создаете модель для распознавания лиц, вам потребуется много ресурсов, например, хороший процессор и оперативная память или большой GPU для эффективного обучения вашей модели, а хорошая и эффективно обученная модель означает высокую стоимость. В противном случае скорость будет очень низкой и на тренировку уйдет много времени.

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

ПЕРЕДАЧА ОБУЧЕНИЯ

При трансферном обучении знания уже обученной модели машинного обучения применяются к другой, но связанной проблеме. При трансферном обучении мы в основном пытаемся использовать то, что было изучено в одной задаче, для улучшения обобщения в другой. Мы переносим веса, полученные сетью в «задаче А», на новую «задачу Б».

В компьютерном зрении трансферное обучение обычно выражается в использовании предварительно обученных моделей, таких как VGG16, Inception, MobileNet и т. д. Мы используем MobileNet в качестве предварительно обученной модели для нашего набора данных классификации изображений.

МОБИЛЬНАЯ СЕТЬ

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

  1. Загрузите набор данных и разархивируйте его (в моем случае это заархивированные данные). Используйте следующую команду →
!unzip /content/ACTORS.zip

Проверьте текущий рабочий каталог набора данных (в моем случае это ACTORS) с помощью следующей команды →

!pwd

2. Загрузка данных MobileNet→

from keras.applications import MobileNet
# MobileNet was designed to work on 224 x 224 pixel input images sizes:-
img_rows, img_cols = 224, 224 
 
# Re-loads the MobileNet model without the top or FC layers
MobileNet = MobileNet(weights = 'imagenet',                  
            include_top = False,                  
            input_shape = (img_rows, img_cols, 3)) 
# Here we freeze the last 4 layers 
# Layers are set to trainable as True by default
for layer in MobileNet.layers:    
layer.trainable = False    
# Let's print our layers 
for (i,layer) in enumerate(MobileNet.layers):    
print(str(i) + " "+ layer.__class__.__name__, layer.trainable)

3. Создайте функцию, которая возвращает голову нашего FC →

def lw(bottom_model, num_classes):    
    """creates the top or head of the model that will be placed           ontop of the bottom layers"""     
    top_model = bottom_model.output    
    top_model = GlobalAveragePooling2D()(top_model)    
    top_model = Dense(1024,activation='relu')(top_model)    
    top_model = Dense(1024,activation='relu')(top_model)    
    top_model = Dense(512,activation='relu')(top_model)    
    top_model = Dense(num_classes,activation='softmax')(top_model)                          return top_model

4. Добавьте нашу головку FC обратно в MobileNet →

from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten, GlobalAveragePooling2D
from keras.layers import Conv2D, MaxPooling2D, ZeroPaddig2D
from keras.layers.normalization import BatchNormalization
from keras.models import Model
# Set our class number to 3 (Young, Middle, Old)
num_classes = 4
FC_Head = lw(MobileNet, num_classes)
model = Model(inputs = MobileNet.input, outputs = FC_Head)
print(model.summary())

5. Загрузка нашего набора данных распознавания лиц→

from keras.preprocessing.image import ImageDataGenerator
train_data_dir ='/content/ACTORS/training_data'
validation_data_dir ='/content/ACTORS/testing_data'
# 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 = 16
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')

6. Обучение модели→

from keras.optimizers import RMSprop
from keras.callbacks import ModelCheckpoint, EarlyStopping
checkpoint = ModelCheckpoint("hero_mobileNet.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
nb_train_samples = 229
nb_validation_samples = 22
epochs = 5
batch_size = 16
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)

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

from keras.models import load_model
classifier = load_model('hero_mobileNet.h5')

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

import os
import cv2
import numpy as np
from os import listdir
from os.path import isfile, join
from google.colab.patches import cv2_imshow
ACTOR_dict = {"[0]": "Akshay_Kumar ",
"[1]": "Amitabh_Bacchan",
"[2]": "Ranbir_Kapoor",
"[3]": "Salman_Khan"}
ACTOR_dict_n = {"Akshay_Kumar": "Akshay_Kumar ",
"Amitabh_Bacchan": "Amitabh_Bacchan",
"Ranbir_Kapoor": "Ranbir_Kapoor",
"Salman_Khan": "Salman_Khan"}
def draw_test(name, pred, im):
ACTOR = ACTOR_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, ACTOR, (20, 60) , cv2.FONT_HERSHEY_SIMPLEX,1, (0,0,255), 2)
cv2_imshow(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 - " + ACTOR_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("/content/ACTORS/testing_data/")
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/VermaNikita/FaceRecognition

Большое спасибо, что прочитали!!