Я создал модель распознавания лиц, используя 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 он распознает лицо на видео в реальном времени.

Спасибо за прочтение !

GitHub

Linkedln