Я создал модель распознавания лиц, используя Transfer Learning с VGG. Что такое VGG? Обычно это относится к нейронной сети с глубокой сверткой для распознавания объектов, разработанной и обученной известной оксфордской группой Visual Geometry Group (VGG), которая достигла очень хорошей производительности в наборе данных ImageNet.
Что такое трансферное обучение?
Трансферное обучение - это метод повторного использования предварительно обученных модельных знаний для другой аналогичной задачи.
Архитектура VGG
Вход в слой cov1 представляет собой изображение RGB фиксированного размера 224 x 224. Изображение проходит через стопку сверточных (сверточных) слоев, где использовались фильтры с очень маленьким воспринимающим полем: 3 × 3 (что является наименьшим размером, чтобы уловить понятие левого / правого, верхнего / нижнего, центрального ). В одной из конфигураций он также использует фильтры свертки 1 × 1, которые можно рассматривать как линейное преобразование входных каналов (с последующей нелинейностью). Шаг свертки установлен на 1 пиксель; пространственное заполнение conv. входной слой таков, что пространственное разрешение сохраняется после свертки, то есть заполнение составляет 1 пиксель для свертки 3 × 3. слои. Пространственное объединение выполняется пятью слоями максимального объединения, которые следуют за некоторыми конвенциями. слои (не для всех конв. слоев следует max-pooling). Максимальное объединение выполняется в окне размером 2 × 2 пикселя с шагом 2.
Три полностью соединенных (FC) уровня следуют за стеком сверточных слоев (которые имеют разную глубину в разных архитектурах): первые два имеют 4096 каналов каждый, третий выполняет 1000-позиционную классификацию ILSVRC и, таким образом, содержит 1000 каналов (по одному для каждого класс). Последний слой - это слой soft-max. Конфигурация полносвязных слоев одинакова во всех сетях.
Все скрытые слои имеют нелинейность выпрямления (ReLU). Также следует отметить, что ни одна из сетей (кроме одной) не содержит Local Response Normalization (LRN), такая нормализация не улучшает производительность набора данных ILSVRC, но приводит к увеличению потребления памяти и времени вычислений.
Приступим к написанию кода ..
Моя модель VGG:
from __future__ import print_function import keras from keras.preprocessing.image import ImageDataGenerator from keras.models import Sequential from keras.layers import Dense, Input, Flatten from keras.applications.vgg16 import preprocess_input from keras.applications.vgg16 import VGG16 from keras.models import Model import numpy as np from glob import glob IMAGE_SIZE =[224,224] #because vgg takes this size image as an input #location where my images are train_path = 'C:\\Users\\91811\\Desktop\\MLOps\\Datasets\\Train' test_path = 'C:\\Users\\91811\\Desktop\\MLOps\\Datasets\\Test'
Это некоторые библиотеки, которые нам могут потребоваться для обучения нашей модели.
#getting images from imagenet 3 means here 3d images (coloured images) vgg = VGG16(input_shape=IMAGE_SIZE + [3] , weights = 'imagenet' , include_top = False) for layer in vgg.layers: #freezing layers layer.trainable = False folder =glob('C:\\Users\\91811\\Desktop\\MLOps\\Datasets\\Train\\*') x = Flatten()(vgg.output) prediction = Dense(len(folder), activation='softmax')(x) model = Model(inputs=vgg.input , output=prediction) model.summary() #Complete layer summary model.compile(loss = 'categorical_crossentropy' , optimizer = 'adam' , metrics=['accuracy']) train_datagen = ImageDataGenerator(rescale = 1./255 , shear_range=0.2, zoom_range=0.2 , horizontal_flip=True) training_Set = train_datagen.flow_from_directory('C:\\Users\\91811\\Desktop\\MLOps\\Datasets\\Train',target_size=(224,224),batch_size=32 , class_mode='categorical') test_datagen = ImageDataGenerator(rescale = 1./255) test_set = test_datagen.flow_from_directory('C:\\Users\\91811\\Desktop\\MLOps\\Datasets\\Test',target_size=(224,224),batch_size=32 , class_mode='categorical', shuffle=False) r = model.fit_generator(training_Set,validation_data=test_set,epochs=5,steps_per_epoch=len(training_Set), validation_steps=len(test_set)) from keras.models import load_model model.save('vggtl.h5') #saving our model
Я создал свой собственный набор данных, щелкнув около 200 моих изображений.
Использование OpenCV, распознавание лица:
Это библиотеки, которые я использовал
from PIL import Image from keras.applications.vgg16 import preprocess_input import base64 import json import cv2 import random from io import BytesIO from keras.models import load_model import numpy as np from keras.preprocessing import image
Здесь я использовал haarcascade front face. Каскад Хаара - это алгоритм обнаружения объектов машинного обучения, используемый для идентификации объектов на изображении или видео.
model = load_model("vggtl.h5") #loading our vgg model face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml") def face_extractor(img): faces = face_cascade.detectMultiScale(img,1.3,5) if faces is (): return None for (x,y,w,h) in faces: cv2.rectangle(img(x,y),(x+w,y+h),(0,255,255),2) cropped_face = img[y:y+h, x:x+w] return cropped_face video_capture = cv2.VideoCapture(0) while True: _,frame = video_capture.read() face=face_extractor(frame) if type(face) is np.ndarray: face = cv2.resize(face, (224,224)) im = Image.fromarray(face,'RGB') img_array =np.array(im) img_array = np.expand_dims(img_array,axis=0) pred = model.predict(img_array) print(pred) name = "None Matching" if(pred[0][3]>0.5): name='Samkit' cv2.putText(frame,name,(50,50),cv2.FONT_HERSHEY_COMPLEX,1,(0,255,0),2) else: cv2.putText(frame,"No face Found",(50,50),cv2.FONT_HERSHEY_COMPLEX,1,(0,255,0),2) cv2.imshow('Video',frame) if cv2.waitKey(1) & 0xFF == ord('q'): break video_capture.release() cv2.destroyAllWindows()
Я сделал экстрактор функций, который берет мое обрезанное изображение. Теперь, наконец, с помощью CV2 он распознает лицо на видео в реальном времени.
Спасибо за прочтение !