ai_avengers

Идеальный костюм для вечеринки: AI советует, каким героем из «Мстителей» нарядиться на Хэллоуин

Обнаружение и распознавание лиц — одно из наиболее интересных специализированных применений компьютерного зрения. Люди способны распознавать лица с невероятной точностью, и с недавнего времени мы начали пытаться научить компьютеры делать то же самое (желательно, со сравнимым успехом), чтобы использовать их в различных приложениях. Задача распознавания одного и того же лица на нескольких изображениях серьезно осложняется тем, что лица значительно меняются при смене эмоций и в процессе старения. Однако достижения в области глубокого обучения, такие как исследование FaceNet, полностью перевернули эту область, позволив упростить имплементацию алгоритмов распознавания лиц и достичь высокой точности.

Не отводите взгляд от прибора!

Если вы опасаетесь, что развитие подобных навыков у компьютеров может зайти слишком далеко, вас можно понять. Конечно, в возможности использования технологии распознавания лиц есть много положительных моментов. Например, эта технология может быть невероятно полезна для таких задач, как усиление безопасности растущего цифрового мира, помощь в поиске пропавших людей, создание приложений для слепых, помогающих ориентироваться в окружающем мире и (потенциально) помощь в создании более совершенных инструментов для борьбы с преступностью. Но конфиденциальность остается главной проблемой этой области. Достаточно ли комфортно мы ощущаем себя в обществе, чтобы спокойно относиться к тому, что наши фотографии будут взяты и использованы для какой-то задачи классификации? Использование распознавания лиц на персональном устройстве для обеспечения безопасности может казаться нормальным, но что насчет целевой рекламы? Конфиденциальность — действительно сложный вопрос, и, пока мы продолжаем работать над совершенствованием таких технологий, важно помнить:

«С большой силой приходит и большая ответственность»
Дядя Бен из «Человека-паука».
Я, рассказывая о распознавании лиц

Выглядеть как герой

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

Итак, задача: на носу Хэллоуин. Вы работаете в компании, продающей карнавальные костюмы, и ваше начальство хочет создать интересное и интерактивное приложение, с помощью которого покупатели могли бы найти костюм, который им больше всего подходит. Как насчет того, чтобы использовать технологию распознавания лиц и найти актеров, на которых покупатели больше всего похожи, а затем порекомендовать костюмы на основе этого? Звучит как отличный план. И так как в этом году фильмы Marvel были безумно популярны, давайте для нашего приложения использовать актеров и их персонажей из франшизы «Мстителей».

Курс по Machine Learning
Идет набор в группу 3 800₽ в месяц

Есть несколько отличных инструментов, которые можно использовать для задач обнаружения и распознавания лиц (например, OpenCV), но я продемонстрирую, как использовать для этого библиотеку Python face_recognition. Она работает очень быстро и точно, базируясь на dlib, которая, в свою очередь, дает очень впечатляющие результаты (точность 99,38% при тестировании на «Labeled Faces in the Wild»). Обнаружение лица на изображении (поиск и возврат местоположения ограничительной рамки) и получение его кодировки (векторного представления лица) укладывается всего в три строки:

import face_recognition
loaded_image = face_recognition.load_image_file('young_rdj.jpg')
face_location = face_recognition.face_locations(loaded_image)
face_encoding = face_recognition.face_encodings(loaded_image)[0]

Отлично! Написав всего несколько строк, мы нашли на изображении лицо и преобразовали его в векторное представление, которое сможем использовать для сравнения с другими изображениями. В то время как большинство приложений ищут точное совпадение (например, приложения, которые находят выбранного человека на нескольких фотографиях или телефон, проверяющий лицо пользователя для аутентификации), я хочу найти лучший вариант среди «достаточно похожих». Вот так выглядит рабочий процесс моего приложения по поиску самого похожего Мстителя:

Курс по нейронным сетям
Идет набор в группу 4 200₽ в месяц

1.Загрузка фотографий каждого актера из фильмов франшизы. Для себя в первую очередь я искал больших парней и даже добавил парочку из мира Людей Икс, раз в комиксах некоторые из них тоже стали Мстителями. Никакого замысловатого кода для этого, просто много времени, проведённого в Google в поисках качественных изображений.

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

def image_to_encodings(file):
   """Return the face encodings from an image"""
   load_image = face_recognition.load_image_file(file)
   return face_recognition.face_encodings(load_image)[0]

3. Пропуск всех изображений через функцию выше и создание нового словаря с именем персонажа и массивом с кодировками лица:

# Glob makes it easy to capture all jpgs filenames into a list
avengers_cast_files = glob.glob('avengers/*.jpg')
# Getting character name from the file name
avengers_cast_names = [re.sub('.jpg|avengers/', '', image)
                          for image in avengers_cast_files]
# Getting encodings
avengers_cast_encodings = [image_to_encodings(image)
                             for image in avengers_cast_files]
# Creating dictionary with these new details
avengers_dictionary = {name: encoding for name, encoding
                      in zip(avengers_cast_names,
                             avengers_cast_encodings)}

4. Преобразование словаря с кодировками с помощью функции pickle. Это позволяет позже легко обратиться к этому словарю и избавляет от необходимости повторного запуска face_recognition на уже обработанных изображениях:

 
outfile = open('avengers_features.pkl','wb')
pickle.dump(avengers_dictionary,outfile)
outfile.close()

5. Создание функции для возврата наилучшего совпадения на основе кодировок:

def top_match(known_encodings, known_names, new_image_embed):
   """With list of known image names/encodings,
       return closest match"""
   distances = face_recognition.face_distance(known_encodings,
                                              new_image_embed)
   top = np.argmin(distances)
   return known_names[top]

6. И тестирование — добавление нового изображения и вывод самого похожего персонажа:

me = image_to_encodings('me.jpg')
top_match(list(avengers_dictionary.values()),
         list(avengers_dictionary.keys()),
  me)

Соколиный глаз! Неплохо, я доволен таким вариантом.

Если вам захочется проверить работу приложения самим, то вы можете найти мой код на GitHub. В нынешнем виде код запустится через терминал, но зато с вот такой ASCII картинкой:

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

Оригинал: Avengers, resemble!

Перевод: Ухаров Елена

Поделиться:
Опубликовано в рубрике Machine Learning, Переводные материалыTagged ,

SkillFactory.Рассылка