Giter VIP home page Giter VIP logo

face_detection_with_cnns's Introduction

face_detection_with_CNNs

Решение задачи поиска лица на изображении на основе свёрточных нейронных сетей.

Постановка задачи

Дано:

RGB-изображение произвольного размера с одним, вариативным по положению, лицом на нём.

Требуется:

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

Подготовка обучающей выборки

Существует множество размеченных наборов данных для распознавания лиц. В моей работе использовался набор данных UMDFaces (Batch 3). Помимо ограничительных рамок, которые использовались в моей работе, UMDFaces предоставляет данные о расположении 21 ключевой точки лица, пол, сгенерированный предварительно обученной нейронной сетью, данные о положении лица (отклонение от нормали и др) и многое-многое другое. UMD Faces

Из всего набора данных было выделено 22 тысячи изображений для обучения и тестирования нейронных сетей. Из них 16 тысяч – train set (использовался для обучения нейронных сетей), 4 тысячи – validation set (использовался для подборки гиперпараметров моделей и предварительной оценки точности на данных, которые не видела нейронная сеть), остальные 2 тысячи – test set.

Изображения хранились в папках train и test, а ответы к ним - в csv-файлах train.csv и test.csv (подготовлены на основе umdfaces_batch3_ultraface.csv). В csv-файлах данные хранилась в виде название изображения (id-строка) и соответсвующие данному изображению ответы - координаты левой нижней и правой верхней вершин ограничительной рамки. В данном скрипте может быть найдена реализация подготовки обучающей выборки

Описание первой модели (CNN.ipynb)

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

Архитектура первой модели представлена на рисунке ниже: architecture 1

Графики ниже представлены для данных гиперпараметров:

Оптимизатор: Adam (lr = 6e-4)

Функция потерь: mse (средняя квадратичная ошибка)

Данная сеть обучалась на 60 эпохах, около 6 часов на GPU

accuracy 1 loss 1

Точность на тестовой выборке: 91.8 %

Пример работы модели:

img 1

В CNN.ipynb представлен немного другой вариант обучения данной модели, на большем количестве эпох (100), соответственно в CNN.ipynb графики отличаются. Также в новой версии пока что нет проверки на тестовой выборке, так как еще планируется улучшать построенную модель. Веса, полученные в рузультате обучения на 100 эпохах можно найти в папке Models_Weights (файл cnn.h5).

Описание второй модели (transfer_learning.ipynb)

Перейдём к описанию модели, построенной на основе переноса обучения и тонкой настройки.За базовую модель я взял архитектуру VGG-16, обученную на ImageNet’е.

Опять же обращаю внимание, что в transfer_learning.ipynb гиперпараметры (а соответсвенно и графики) могут отличаться по сравнению с теми, что указаны ниже. Это опять же связано с тем, что вторая модель еще дорабатывается. Ниже представлены результаты, которые были получены на момент сдачи курсовой работы.

Итак, первый шаг - замена последних полносвязных слоёв VGG-16 на новые полносвязные слои, подходящие под нашу задачу: architecture 2

Шаг 2 - обучаем полносвязные слои на 15 эпохах - получаем точность около 82 %. Оптимизатор: Adam (lr = 5e-5) Функция потерь: mse (mean squared error)

Шаг 3 - дообучаем последний, пятый свёрточный блок, процесс обучения сходится за 30 эпох. Оптимизатор: Adam (lr = 1e-5) Функция потерь: mse

accuracy 2 loss 2

В результате получаем точность на тестовой выборке: 89.7 %, а всё обучение длилось около 3 часов на GPU, что значительно меньше, чем в случае с первой моделью (6 часов).

Как в случае и с первой моделью, в новой версии transfer_learning.ipynb пока что нет проверки на тестовой выборке, так как еще планируется улучшать построенную модель.

Некоторые выводы и предложения по улучшению моделей

Первая из моделей (обученная “с нуля”) лучше показала себя на тестовой выборке, что, в первую очередь, связано с тем, что первая и вторая модели имеют примерно одинаковую глубину, но большая часть второй модели была предварительно обучена на другом наборе данных (ImageNet’e). Из этого можно сделать вывод, что когда наш набор данных довольно сильно отличается от набора, на котором была обучена базовая модель, надо дообучать большее число свёрточных блоков исходной базовой модели. Тем не менее вторая модель показала довольно хорошие результаты на тестовой выборке (точность – 89.7 % против 91.8 % первой модели). Один из вариантов её улучшения – изменение базовой модели на, например, Inception-v3, которая показывает лучшие результаты на ImageNet’e . В то же время сеть Inception-v3 намного глубже и в её архитектуре сложнее разобраться, но мы ведь любим сложные эффективные архитектуры! Помимо вышеупомянутого, процесс обучения второй модели сошелся значительно быстрее и в целом обучение заняло значительно меньше времени, что и является одним из основных преимуществ переноса обучения и тонкой настройки.

Также стоит упомянуть, что в основу обучения легли градиентные методы (у обеих моделей оптимизатор – Adam), у которых есть проблема схождения к локальным минимумам. Существуют различные техники для борьбы с данной проблемой, однако в своей работе я не испробовал их. Применение таких техник – также один из вариантов улучшения моделей.

Полный отчёт

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

face_detection_with_cnns's People

Contributors

gumilevski avatar

Stargazers

Apollinaria Chernikova avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.