ИСПОЛЬЗОВАНИЕ МОБИЛЬНОЙ СЕТИ
Распознавание лиц – это задача компьютерного зрения, позволяющая идентифицировать и верифицировать человека по фотографии его лица. Если вы создаете модель для распознавания лиц, вам потребуется много ресурсов, например, хороший процессор и оперативная память или большой GPU для эффективного обучения вашей модели, а хорошая и эффективно обученная модель означает высокую стоимость. В противном случае скорость будет очень низкой и на тренировку уйдет много времени.
По этой причине вы можете использовать предварительно обученную модель и добавить к ней свои собственные требования, чтобы модель обучалась только в соответствии с вашими требованиями, и для обучения вашей модели использовалось меньше времени и памяти. MobileNet — одна из таких предварительно обученных моделей, в которую вы можете добавить свои требования, и модель не займет много времени для обучения и даст вам требуемые результаты. Это добавление ваших требований к предварительно обученной модели, а затем ее обучение называется Перенос обучения.
ПЕРЕДАЧА ОБУЧЕНИЯ
При трансферном обучении знания уже обученной модели машинного обучения применяются к другой, но связанной проблеме. При трансферном обучении мы в основном пытаемся использовать то, что было изучено в одной задаче, для улучшения обобщения в другой. Мы переносим веса, полученные сетью в «задаче А», на новую «задачу Б».
В компьютерном зрении трансферное обучение обычно выражается в использовании предварительно обученных моделей, таких как VGG16, Inception, MobileNet и т. д. Мы используем MobileNet в качестве предварительно обученной модели для нашего набора данных классификации изображений.
МОБИЛЬНАЯ СЕТЬ
MobileNet — это модель архитектуры CNN для классификации изображений и мобильного зрения. Существуют и другие модели, но что делает MobileNet особенным, так это то, что она требует очень мало вычислительной мощности для запуска или применения трансферного обучения.
- Загрузите набор данных и разархивируйте его (в моем случае это заархивированные данные). Используйте следующую команду →
!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
Большое спасибо, что прочитали!!