Рубрики
Без рубрики

Проходя 10 000 фотографий за 30 секунд

Разработка алгоритма, чтобы обнаружить себя на 10 000 фотографий. Tagged Python, машинное обучение, распознавание лица, выпускной.

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

И это было здорово! Университет провел большую выпускную церемонию со всеми этими важными академическими людьми, родственниками, друзьями и более 90 выпускников. Мне нравятся эти церемонии. Все кажется такими счастливыми. Что может быть лучше, чтобы удержать это счастье от захвата его на фотографиях? Профессиональные фотографы, конечно, осознают это и всегда рядом. О, мальчик, их всегда много.

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

Посмотрите на фотографии мой выпускной Анкет Мы говорим о 436 страницах с 24 картинками на общей сложности до 10 400 фотографий. Хуже всего то, что единственный способ найти конкретного человека – это пройти все эти фотографии вручную. Процесс, который с грубой оценкой займет до трех часов. Я имею в виду, я не самый оживленный человек в мире, но кажется, что это много времени для выбора нескольких фотографий.

Я сделал это через 20 -й странице, и мне уже было скучно. Я должен был быть другой способ, подумал я. Кроме того, если вам нужно делать то же самое более одного раза, компьютер может сделать это лучше, чем вы. Итак, я придумал простую идею. Что если бы я написал сценарий, чтобы соскрести все фотографии и пропустить их через какой -то алгоритм, который мог бы обнаружить мое лицо и вернуть только фотографии, на которых я нахожусь. Теоретически это должно работать, и теоретически это должно занять у меня менее трех часов.

Загрузка фотографий

Как я уже упоминал, веб -сайт, на который я нацелен, организован на страницах, а на каждой странице содержится 24 фотографии. Что мне нужен, так это сценарий, который может выполнять все эти страницы и загружать фотографии.

Сначала я намеревался написать все в Python, но после того, как я понял, как легко было бы написать простой сценарий Bash, используя силу Wget, я подумал, почему бы не сделать это вместо этого. Итак, вот это:

#!/bin/bash

for i in {1..436}
do
  wget -r -l1 -A.jpg https://www.example.com/events/view/1545?page=$i
done

Честно говоря, не так много. Сценарий итерации проходит через каждую из 436 страниц и выполняет простую команду WGET для загрузки всех изображений JPG. Обратите внимание, что он использует опцию поиска WGET, что означает, что Wget Crawling по веб -странице следующие ссылки и каталоги. Вы можете узнать больше об этом интересном алгоритме Здесь Анкет Таким образом, Wget не будет просто скачать миниатюры картин, но и оригинальные. Некоторые дополнительные пиксели будут иметь решающее значение для алгоритма машинного обучения [спойлер] Я собираюсь использовать позже [/спойлер].

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

Распознавание лица

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

Распознавание лица это отличная библиотека Python с открытым исходным кодом, которая может сделать именно это и рекламируется точность 99,38%, работая на вершине знаменитого dlib библиотека. Он в основном обеспечивает доступ к набору алгоритмов и работает как черный ящик, позволяя следующему:

  • Найти лица на картинках
  • Манипулируйте особенностями лица
  • Определите людей, использующих их лица

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

Чтобы идентифицировать человека, алгоритм поиск в базе данных уже известных людей для человека, у которого самые близкие измерения к новой. Машинное обучение (да … Нет глубокого обучения, извините, я знаю, что сейчас жарко, но это не решение для всего), чтобы сделать эту классификацию с линейной SVM Classifier Анкет Чтобы узнать больше об этом процессе, я рекомендую прочитать гораздо более точное и углубленное объяснение Адама Гейтги Здесь Анкет

Применение распознавания лица

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

Мое лицо использовалось для тренировок:

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

#import face_recognition
from shutil import copyfile

# Create an encoding of my facial features that can be compared to other faces
picture_of_me = face_recognition.load_image_file("mavrodis.jpg")
my_face_encoding = face_recognition.face_encodings(picture_of_me)[0]

# Iterate through all the 10,460 pictures
for i in range(1, 10461):
    # Construct the picture name and print it
    file_name = str(i).zfill(5) + ".jpg"
    print(file_name)

    # Load this picture
    new_picture = face_recognition.load_image_file(file_name)

    # Iterate through every face detected in the new picture
    for face_encoding in face_recognition.face_encodings(new_picture):

        # Run the algorithm of face comaprison for the detected face, with 0.5 tolerance
        results = face_recognition.compare_faces([my_face_encoding], face_encoding, 0.5)

        # Save the image to a seperate folder if there is a match
        if results[0] == True:
            copyfile(file_name, "/home/deeplearning/Desktop/my_face/mavrodis/" + file_name)

Это в значительной степени! Уведомление о строке 21, предоставляется конкретное значение (0,5). Это толерантность (или порог) алгоритма. Более высокая толерантность говорит, что алгоритм является менее строгим, а более низкий означает противоположное. Это займет некоторое время, так как он должен проверить все 10 000+ фотографий (но, безусловно, есть место для некоторой параллелизации).

Некоторые из фотографий, которые были автоматически обнаружены: TADA! Это успех!

Есть несколько вещей, которые мы должны заметить. На фотографиях есть водяные знаки, но распознавание лица не было никаких проблем с этим. Кроме того, алгоритм отлично подходит для групповых фотографий или фотографий, что лицо находится далеко от объектива камеры.

Точность

Около 160 фотографий были обнаружены с использованием этого алгоритма. Если вы считаете, что было 90 студентов, 400 картинок, некоторые из которых были групповыми фотографиями), это имеет смысл с точки зрения статистики. Тем не менее, я не могу обеспечить процент от точности, поскольку это потребовало бы, чтобы я прошел каждую из первоначальных 10 400 фотографий, чего я и намеревался избежать.

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

Вывод

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

Билл Гейтс однажды сказал:

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

Я говорю:

Если вы ленивый человек, дайте тяжелую работу компьютеру. Это сэкономит вам время и усилия.

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

Оригинал: “https://dev.to/kmavrodis/going-through-10000-pictures-in-30-seconds-ad8”