Однажды на работе, в непринужденной беседе с моими товарищами по команде, возникла тема машинного обучения. Меня сразу зацепило, и я внимательно слушал, как все говорят об этом.
Кто-то вспомнил о сериале «Интересное» - научно-фантастической криминальной драме, которая на самом деле основана на искусственном интеллекте. Это заинтриговало меня, и мне захотелось узнать больше.
Вот сюжет сериала: компьютерный программист разрабатывает приложение для правительства, которое способно собрать воедино все источники информации для прогнозирования и идентификации людей, планирующих террористические акты. Основываясь на прогнозируемой информации, он пытается остановить преступление.
Как? - Канал данных наблюдения всего города будет передан системе в качестве входных данных. Машина будет сопоставлять релевантную информацию, анализируя видеопоток, и узнавать закономерности, которые имели место в каждой преступной деятельности.
Через несколько дней я наткнулся на интересный проект под названием Facenet. Этот проект посвящен распознаванию лиц - задаче компьютерного зрения по идентификации и проверке личности человека по фотографии его лица.
Ознакомившись с деталями этого проекта, я смог связать его с сериалом "Интересные люди". Я попытался построить то же самое, но добавив в проект свое собственное изображение интересующего человека.
Процесс добавления небольшого набора данных с предварительно обученной моделью и выполнения повторного обучения называется Передача обучения. Это намного быстрее и чрезвычайно рентабельно, потому что все уроки уже сделаны. Добавление нового набора данных поверх него - это всего лишь небольшое усилие по обучению, которое будет быстрее и рентабельнее.
В этом посте я поделюсь своим опытом создания проекта и создания модели машинного обучения.
Прежде чем мы погрузимся в построение модели, давайте разберемся с этапами процесса построения.
Чтобы построить модель машинного обучения, нам нужны данные, и они должны пройти следующие шаги:
- Во-первых, необработанные данные необходимо обработать, очистить и организовать как набор данных. В нашем случае это набор изображений каждого человека. Обычно это делается с помощью специалистов по обработке данных и экспертов в предметной области.
- Во-вторых, набор данных необходимо разделить на две части. Набор обучающих данных (80%) и тестовый набор данных (20%)
- В-третьих, мы пишем собственный алгоритм или выбираем существующий алгоритм машинного обучения, который лучше всего подходит для нашего сценария использования.
- Наконец, нам нужно провести обучение, регулируя входные значения, пока мы не получим ожидаемый уровень точности.
А теперь пора погрузиться в практическую деятельность 🙃
Я загрузил проект Facenet в свою учетную запись Github, чтобы проводить свои эксперименты. Кроме того, я поместил его в контейнер с помощью Docker для более быстрого запуска и упрощения управления. Эти два шага, конечно, необязательны, но я обнаружил, что это очень удобно для меня.
Как только это будет сделано, вы тоже можете приступить к созданию своей версии этого приложения:
Настройка рабочей среды
Убедитесь, что на вашем компьютере установлены Git и Docker.
Откройте терминал и клонируйте проект в свое рабочее пространство.
$ git clone https://github.com/rajivmanivannan/facenet $ cd facenet
Используйте приведенную ниже команду docker compose для создания образа докера.
$ docker-compose build
Чтобы запустить докеризованное приложение, выполните следующую команду
$ docker-compose run --rm cli bash
Выполните следующие команды, чтобы создать каталог, необходимый для нашей работы.
$ mkdir models mkdir -p datasets/lfw/raw mkdir -p datasets/my_dataset/{train,test}
Шаг 1. Сбор данных и создание набора данных
Я собрал изображения себя и одной знаменитости из Интернета. Затем я организовал его в две отдельные папки. В каждой папке было около 15 изображений. Затем я переместил папки по следующему пути / app / datasets / lfw / raw.
В этом проекте они использовали многозадачные каскадные сверточные нейронные сети (MTCNN) для обнаружения лица на изображении и кадрирования его в изображения размером 160x160. Выровненные и обрезанные изображения (набор данных) будут храниться в / datasets / lfw / lfw_mtcnnpy_160. Чтобы создать набор данных, выполните следующую команду.
for N in {1..4}; do python src/align/align_dataset_mtcnn.py /app/datasets/lfw/raw /app/datasets/lfw/lfw_mtcnnpy_160 --image_size 160 --margin 32 --random_order; done
Шаг 2. Обучение модели машинного обучения
Нам нужно разделить набор данных - 80% для обучения и 20% для тестирования. Я взял 3 изображения в качестве тестового набора из 15 изображений и отложил в сторону. Затем поместил набор данных в папку train и test по следующему пути / datasets / my_dataset / train.
А затем загрузите предварительно обученную модель 20180402–114759, распакуйте ее в папку моделей в проекте. Эта модель была обучена на наборе данных VGGFace2, состоящем из ~ 3,3 млн лиц и ~ 9000 идентификаторов (классов) .
Выполните приведенную ниже команду, чтобы обучить и построить свою собственную модель с вашим набором данных.
python src/classifier.py TRAIN ./datasets/my_dataset/train/ ./models/20180402-114759.pb ./models/my_classifier.pb --batch_size 1000
После завершения обучения он создаст новую модель с нашим набором данных с именем my_classifer.pb. Вы можете найти в пути / models.
Шаг 3. Протестируйте модель машинного обучения с помощью тестового набора данных
Пришло время протестировать нашу модель с помощью тестового набора данных. Поместите тестовый набор данных по следующему пути / datasets / my_dataset / test. Выполните приведенную ниже команду, чтобы классифицировать тестовые данные по нашей модели. Это обеспечит процент точности совпадения лиц для каждого изображения.
python src/classifier.py CLASSIFY ./datasets/my_dataset/test/ ./models/20180402-114759.pb ./models/my_classifier.pb --batch_size 1000
Вывод
Я считаю, что это является основой для создания полноценного приложения на основе распознавания лиц. Я работаю над созданием приложения, чтобы узнавать моих товарищей по команде и приветствовать их по имени. Я буду держать вас в курсе, как это происходит!
Кредиты:
Проект Дэвида Сэндберга Распознавание лиц с помощью Tensorflow
Арвинд Сукумар - Спасибо за наставничество с первого дня.
Джахангир Анвари - Спасибо за помощь в создании контейнеров для этого проекта.
Пожалуйста, если вам понравился этот пост! Сообщите мне свои мысли в 💬 ниже 👇🏻