Разработка сайтов в Вахрушево, ЛНР. Обнаружение и распознавание лиц с помощью Keras

 
 

Если вы являетесь постоянным пользователем Google Фото, возможно, вы заметили, как приложение автоматически извлекает и группирует лица людей из фотографий, которые вы резервируете в облаке.

Распознавание лиц в веб-приложении Google Фото

Распознавание лиц в веб-приложении Google Фото

Приложение для работы с фотографиями, такое как Google, достигает этого путем обнаружения лиц людей (и домашних животных!) на ваших фотографиях, а затем группирует похожие лица вместе. Обнаружение, а затем классификация лиц на изображениях — обычная задача глубокого обучения с помощью нейронных сетей.

На первом этапе этого руководства мы будем использовать предварительно обученную модель MTCNN в Keras для обнаружения лиц на изображениях. После того, как мы извлекли лица из изображения, мы вычислим показатель сходства между этими лицами, чтобы определить, принадлежат ли они одному и тому же человеку.

Предпосылки

Прежде чем приступить к обнаружению и распознаванию лиц, необходимо настроить среду разработки. Во-первых, вам нужно «прочитать» изображения через Python, прежде чем выполнять какую-либо обработку на них. Мы будем использовать библиотеку построения графиков matplotlibдля чтения изображений и управления ими. Установите последнюю версию через установщик pip:

pip3 install matplotlib

Чтобы использовать любую реализацию алгоритма CNN, вам необходимо установить keras. Загрузите и установите последнюю версию, используя команду ниже:

pip3 install keras

Алгоритм, который мы будем использовать для обнаружения лиц, — это MTCNN (многозадачные сверточные нейронные сети), основанный на статье «Совместное обнаружение и выравнивание лиц с использованием многозадачных каскадных сверточных сетей «(Zhang et al., 2016). Реализация алгоритма MTCNN для TensorFlow в Python3.4 доступна в виде пакета. Выполните следующую команду, чтобы установить пакет через pip:

pip3 install mtcnn

Чтобы сравнить лица после извлечения их из изображений, мы будем использовать алгоритм VGGFace2, разработанный группой Visual Geometry в Оксфордском университете. Реализация Keras алгоритма VGG на основе TensorFlow доступна в виде пакета, который вы можете установить:

pip3 install keras_vggface

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

Теперь, когда вы успешно установили необходимые компоненты, давайте сразу приступим к обучению!

Шаг 1: Обнаружение лиц с помощью модели MTCNN

Цели на этом этапе следующие:

получить изображения, размещенные снаружи, на локальный сервер

читать изображения matplotlibчерез imread () функцию

обнаруживать и исследовать лица с помощью алгоритма MTCNN

извлекать лица из изображения

1.1 Сохранение внешних изображений

Вы часто можете выполнять анализ изображений, размещенных на внешних серверах. В этом примере мы будем использовать два изображения Ли Якокки, отца «Мустанга», размещенные на сайтах BBC и The Detroit News.

Чтобы временно сохранить изображения локально для нашего анализа, мы извлечем каждое из его URL-адреса и запишем его в локальный файл. Давайте определим функцию store_imageдля этой цели:

import urllib.request

def store_image (url, local_file_name):

with urllib.request.urlopen (url) as resource:

with open (local_file_name, 'wb’) as f:

f.write (resource.read ())

Теперь вы можете просто вызвать функцию с URL-адресом и локальным файлом, в котором вы хотите сохранить изображение:

store_image ('https: //ichef.bbci.co.uk/news/320/cpsprodpb/5944/production/_107725822_55fd57ad-c509-4335-a7d2-bcc86e32be72.jpg’,

'iacocca_1.jpg’)

store_image ('https: //www.gannett-cdn.com/presto/2019/07/03/PDTN/205798e7-9555-4245-99e1-fd300c50ce85-AP_080910055617.jpg? width=540&height=&fit=bounds&auto=webp’,

'iacocca_2.jpg’)

После успешного извлечения изображений давайте обнаружим на них лица.

1.2 Обнаружение лиц на изображении

Для этого сделаем два импорта — matplotlibдля чтения изображений и mtcnnдля обнаружения лиц на изображениях:

from matplotlib import pyplot as plt

from mtcnn.mtcnn import MTCNN

Используйте imread () функцию для чтения изображения:

image = plt.imread ('iacocca_1.jpg’)

Затем инициализируйте MTCNN () объект в detectorпеременной и используйте.detect_faces () метод для обнаружения лиц на изображении. Посмотрим, что он возвращает:

detector = MTCNN ()

faces = detector.detect_faces (image)

for face in faces:

print (face)

Для каждого лица возвращается словарь Python, содержащий три ключа. Ключ boxсодержит границу лица на изображении. Он имеет четыре значения: x- и y-координаты верхней левой вершины, ширина и высота прямоугольника, содержащего грань. Остальные клавиши confidenceи keypoints. keypointsКлюч содержит словарь, содержащий обнаруженные черты лица, а также их координаты:

{'box’: [160, 40, 35, 44], 'confidence’: 0.9999798536300659, 'keypoints’: {'left_eye’: (172, 57), 'right_eye’: (188, 57), 'nose’: (182, 64), 'mouth_left’: (173, 73), 'mouth_right’: (187, 73) }}

1.3 Выделение лиц на изображении

Теперь, когда мы успешно обнаружили лицо, давайте нарисуем над ним прямоугольник, чтобы выделить лицо на изображении, чтобы проверить правильность обнаружения.

Чтобы нарисовать прямоугольник, импортируйте Rectangleобъект из matplotlib.patches:

from matplotlib.patches import Rectangle

Давайте определим функцию highlight_faces, которая сначала отображает изображение, а затем рисует прямоугольники поверх обнаруженных лиц. Сначала прочитайте изображение imread () и начертите его imshow (). Для каждого обнаруженного лица нарисуйте прямоугольник с помощью Rectangle () класса.

Наконец, отобразите изображение и прямоугольники, используя.show () метод. Если вы используете блокноты Jupyter, вы можете использовать%matplotlib inlineволшебную команду для отображения встроенных графиков:

def highlight_faces (image_path, faces):

# display image

image = plt.imread (image_path)

plt.imshow (image)

ax = plt.gca ()

# for each face, draw a rectangle based on coordinates

for face in faces:

x, y, width, height = face['box’]

face_border = Rectangle ((x, y), width, height,

fill=False, color='red’)

ax.add_patch (face_border)

plt.show ()

Давайте теперь отобразим изображение и обнаруженное лицо, используя highlight_faces () функцию:

highlight_faces ('iacocca_1.jpg’, faces)

Обнаружено лицо на изображении Ли Якокки

Обнаружено лицо на изображении Ли Якокки. Источник: Би -би-си

Отобразим второе изображение и обнаруженные на нем лица:

image = plt.imread ('iacocca_2.jpg’)

faces = detector.detect_faces (image)

highlight_faces ('iacocca_2.jpg’, faces)

Новости Детройта

Новости Детройта

На этих двух изображениях видно, что алгоритм MTCNN правильно определяет лица. Давайте теперь извлечем это лицо из изображения, чтобы выполнить его дальнейший анализ.

1.4 Извлечение лица для дальнейшего анализа

На данный момент вы знаете координаты лиц от детектора. Извлечение лиц — довольно простая задача с использованием списковых индексов. Однако используемый нами алгоритм VGGFace2 требует изменения размера лиц до 224×224 пикселей. Мы будем использовать библиотеку PIL для изменения размера изображений.

Функция extract_face_from_image () извлекает все лица из изображения:

from numpy import asarray

from PIL import Image

def extract_face_from_image (image_path, required_size= (224, 224)):

# load image and detect faces

image = plt.imread (image_path)

detector = MTCNN ()

faces = detector.detect_faces (image)

face_images = []

for face in faces:

# extract the bounding box from the requested face

x1, y1, width, height = face['box’]

x2, y2 = x1 + width, y1 + height

# extract the face

face_boundary = image[y1: y2, x1: x2]

# resize pixels to the model size

face_image = Image.fromarray (face_boundary)

face_image = face_image.resize (required_size)

face_array = asarray (face_image)

face_images.append (face_array)

return face_images

extracted_face = extract_face_from_image ('iacocca_1.jpg’)

# Display the first face from the extracted faces

plt.imshow (extracted_face[0])

plt.show ()

Вот как выглядит извлеченное лицо из первого изображения.

Извлечено и изменено лицо с первого изображения

Извлечено и изменено лицо с первого изображения

Шаг 2: Распознавание лиц с помощью модели VGGFace2

В этом разделе давайте сначала проверим модель на двух изображениях Ли Якокки, которые мы получили. Затем мы перейдем к сравнению лиц на изображениях стартовых одиннадцати игроков футбольной команды «Челси» в 2018 и 2019 годах. Затем вы сможете оценить, идентифицирует ли алгоритм лица обычных игроков на изображениях.

2.1 Сравните два лица

В этом разделе вам нужно импортировать три модуля: VGGFaceдля подготовки извлеченных лиц для использования в моделях распознавания лиц и cosineфункцию из SciPy для вычисления расстояния между двумя лицами:

from keras_vggface.utils import preprocess_input

from keras_vggface.vggface import VGGFace

from scipy.spatial.distance import cosine

Давайте определим функцию, которая принимает извлеченные лица в качестве входных данных и возвращает вычисленные оценки модели. Модель возвращает вектор, представляющий черты лица:

def get_model_scores (faces):

samples = asarray (faces, 'float32')

# prepare the data for the model

samples = preprocess_input (samples, version=2)

# create a vggface model object

model = VGGFace (model='resnet50',

include_top=False,

input_shape= (224, 224, 3),

pooling='avg’)

# perform prediction

return model.predict (samples)

faces = [extract_face_from_image (image_path)

for image_path in ['iacocca_1.jpg’, 'iacocca_2.jpg’]]

model_scores = get_model_scores (faces)

Поскольку оценки модели для каждого лица являются векторами, нам нужно найти сходство между оценками двух граней. Обычно мы можем использовать функцию Евклида или косинуса для вычисления сходства.

Векторное представление лиц соответствует косинусному подобию. Вот подробное сравнение косинусного и евклидова расстояний на примере.

Функция cosine () вычисляет косинусное расстояние между двумя векторами. Чем ниже это число, тем лучше совпадают ваши лица. В нашем случае мы поместим порог на расстоянии 0.4. Этот порог является спорным и будет варьироваться в зависимости от вашего варианта использования. Вы должны установить этот порог на основе тематических исследований вашего набора данных:

if cosine (model_scores[0], model_scores[1]) ≤ 0.4:

print («Faces Matched»)

В данном случае два лица Ли Якокки совпадают:

Faces Matched

2.2 Сравнение нескольких лиц на двух изображениях

Давайте найдем хорошее применение модели в этом разделе руководства. Мы сравним лица на двух изображениях стартовых одиннадцати футбольного клуба «Челси» в матче Лиги Европы против «Славии Прага «в сезоне 2018–19 и в матче за Суперкубок УЕФА против «Ливерпуля» в сезоне 2019–20. Хотя многие игроки участвуют в обеих командах дня матча, давайте посмотрим, сможет ли алгоритм обнаружить всех обычных игроков.

Во-первых, давайте извлечем ресурсы из URL-адресов, обнаружим лица на каждом изображении и выделим их:

store_image ('https: //cdn.vox-cdn.com/thumbor/Ua2BXGAhneJHLQmLvj-ZzILK-Xs=/0×0:4872×3160/1820×1213/filters: focal (1877×860:2655×1638): format (webp) /cdn.vox-cdn.com/uploads/chorus_image/image/63613936/1143553317.jpg. 5.jpg’,

'chelsea_1.jpg’)

image = plt.imread ('chelsea_1.jpg’)

faces_staring_xi = detector.detect_faces (image)

highlight_faces ('chelsea_1.jpg’, faces_staring_xi)

store_image ('https: //cdn.vox-cdn.com/thumbor/mT3JHQtZIyInU8_uGxVH-TCbF50=/0×415:5000×2794/1820×1213/filters: focal (1878×1176:2678×1976): format (webp) /cdn.vox-cdn.com/uploads/chorus_image/image/65171515/1161847141.jpg. 0.jpg’,

'chelsea_2.jpg’)

image = plt.imread ('chelsea_2.jpg’)

faces = detector.detect_faces (image)

highlight_faces ('chelsea_2.jpg’, faces)

Сравнение лиц

SBNation

Прежде чем мы продолжим, вот стартовые одиннадцать из обоих матчей:

Славия Прага Матч Старт XI: Кепа, Аспиликуэта, Луис, Кристенсен, Эмерсон, Канте, Баркли, Ковачич, Азар, Педро, Жиру

Славия Прага Матч Старт XI: Кепа, Аспиликуэта, Кристенсен, Зума, Эмерсон, Канте, Жоржиньо, Ковачич, Педро, Жиру, Пулишич

У нас есть восемь игроков, которые являются общими для обоих стартовых XI и которые в идеале должны соответствовать алгоритму.

Давайте сначала посчитаем баллы:

slavia_faces = extract_face_from_image ('chelsea_1.jpg’)

liverpool_faces = extract_face_from_image ('chelsea_2.jpg’)

model_scores_starting_xi_slavia = get_model_scores (slavia_faces)

model_scores_starting_xi_liverpool = get_model_scores (liverpool_faces)

``

for idx, face_score_1 in enumerate (model_scores_starting_xi_slavia):

for idy, face_score_2 in enumerate (model_scores_starting_xi_liverpool):

score = cosine (face_score_1, face_score_2)

if score ≤ 0.4:

# Printing the IDs of faces and score

print (idx, idy, score)

# Displaying each matched pair of faces

plt.imshow (slavia_faces[idx])

plt.show ()

plt.imshow (liverpool_faces[idy])

plt.show ()

Вот список пар лиц, которым соответствует алгоритм. Обратите внимание, что он смог сопоставить все восемь пар граней.

Восемь правильно распознанных лиц

Восемь правильно распознанных лиц (Кепа, Аспиликуэта, Эмерсон, Жиру, Канте, Педро, Кристенсен, Ковачич)

Хотя нам удалось сопоставить каждое лицо на наших изображениях, я хотел бы сделать шаг назад, чтобы обсудить последствия оценок. Как обсуждалось ранее, не существует универсального порога, который бы сопоставлял два изображения вместе. Возможно, вам придется переопределить эти пороговые значения с учетом новых данных, поступающих в анализ. Например, даже Google Фото принимает ваши данные, когда не может программно определить наилучший порог для пары.

Google Фото принимает пользовательские данные для сопоставления лиц

Google Фото принимает пользовательские данные для сопоставления лиц

Лучший путь вперед — тщательно оценить случаи при сопоставлении разных типов лиц. Эмоции лиц и их ракурсы также играют роль в определении точности. Обратите внимание, что в нашем случае использования я намеренно использовал фотографии стартовых одиннадцати, поскольку игроки смотрят прямо в камеру! Вы можете попробовать сопоставить начальные одиннадцать лиц с лицами празднования трофея, и я почти уверен, что точность упадет.

Заключение

В этом руководстве мы сначала обнаружили лица на изображениях с помощью модели MTCNN и выделили их на изображениях, чтобы определить, правильно ли работает модель. Затем мы использовали алгоритм VGGFace2 для извлечения признаков лиц в виде вектора и сопоставили разные лица, чтобы сгруппировать их вместе.

3D-печать5GABC-анализAndroidAppleAppStoreAsusCall-центрChatGPTCRMDellDNSDrupalExcelFacebookFMCGGoogleHuaweiInstagramiPhoneLinkedInLinuxMagentoMicrosoftNvidiaOpenCartPlayStationPOS материалPPC-специалистRuTubeSamsungSEO-услугиSMMSnapchatSonyStarlinkTikTokTwitterUbuntuUp-saleViasatVPNWhatsAppWindowsWordPressXiaomiYouTubeZoomАвдеевкаАктивные продажиАкцияАлександровск ЛНРАлмазнаяАлчевскАмвросиевкаАнализ конкурентовАнализ продажАнтимерчандайзингАнтрацитАртемовскАртемовск ЛНРАссортиментная политикаБелгородБелицкоеБелозерскоеБердянскБизнес-идеи (стартапы)БрендБрянкаБукингВахрушевоВендорВидеоВикипедияВирусная рекламаВирусный маркетингВладивостокВнутренние продажиВнутренний маркетингВолгоградВолновахаВоронежГорловкаГорнякГорскоеДебальцевоДебиторкаДебиторская задолженностьДезинтермедитацияДзержинскДивизионная система управленияДизайнДимитровДирект-маркетингДисконтДистрибьюторДистрибьюцияДобропольеДокучаевскДоменДружковкаЕкатеринбургЕнакиевоЖдановкаЗапорожьеЗимогорьеЗолотоеЗоринскЗугрэсИжевскИловайскИрминоКазаньКалининградКировскКировскоеКомсомольскоеКонстантиновкаКонтент-маркетингКонтент-планКопирайтингКраматорскКрасноармейскКрасногоровкаКраснодарКраснодонКраснопартизанскКрасный ЛиманКрасный ЛучКременнаяКураховоКурскЛисичанскЛуганскЛутугиноМакеевкаМариупольМаркетингМаркетинговая информацияМаркетинговые исследованияМаркетинговый каналМаркетинг услугМаркетологМарьинкаМедиаМелекиноМелитопольМенеджментМерчандайзерМерчандайзингМиусинскМолодогвардейскМоскваМоспиноНижний НовгородНиколаевНиколаевкаНишевой маркетингНовоазовскНовогродовкаНоводружескНовосибирскНумерическая дистрибьюцияОдессаОмскОтдел маркетингаПартизанский маркетингПервомайскПеревальскПетровскоеПлата за кликПоисковая оптимизацияПопаснаяПравило ПаретоПривольеПрогнозирование продажПродвижение сайтов в ДонецкеПроизводство видеоПромоПромоушнПрямой маркетингРабота для маркетологаРабота для студентаРазработка приложенийРаспродажаРегиональные продажиРекламаРеклама на асфальтеРемаркетингРетро-бонусРибейтРитейлРовенькиРодинскоеРостов-на-ДонуРубежноеСамараСанкт-ПетербургСаратовСватовоСвердловскСветлодарскСвятогорскСевастопольСеверодонецкСеверскСедовоСейлз промоушнСелидовоСимферопольСинергияСколковоСлавянскСнежноеСоздание сайтов в ДонецкеСоледарСоциальные сетиСочиСтаробельскСтаробешевоСтахановСтимулирование сбытаСуходольскСчастьеТелемаркетингТельмановоТираспольТорговый представительТорезТрейд маркетингТрейд промоушнТюменьУглегорскУгледарУкраинскХабаровскХарцызскХерсонХостингЦелевая аудиторияЦифровой маркетингЧасов ЯрЧелябинскШахтерскЮжно-СахалинскЮнокоммунаровскЯндексЯсиноватая