Как правильно спроектировать приложение по распознаванию лиц?
Здравствуйте. Изучаю машинное обучение около месяца. Хочу сделать свой реальный проект (поскольку мне всегда было проще учиться разбирая что-то сложное, либо решая какую-то настоящую задачу). Возникла идея написать приложение по распознаванию лиц. Напишу подробней, у меня на кафедре установлены IP камеры. Одна из них смотрит на входную дверь кафедры. Идея приложения в следующем. Есть БД с фотографиями студентов кафедры. Есть нейронка (возможно посоветуют использовать что-то другое), которая обучена распознавать лица. Хотелось бы сделать следующее: когда приложение запущенно, оно считывает изображение с камеры, распознаёт лица и сравнивает с теми, что хранятся в БД. И делает это непрерывно. В тот момент когда появляется человек, лицо которого не занесено в БД(потенциальный нарушитель), приложение выдаёт отчёт о том, что проник кто-то посторонний. Вот в целом такая штука. Я поверхностно прошлась по OpenCV, но было бы лучше если бы я сама обучила нейронку (для получения практического опыта). Хочу спросить у знающих людей, как бы вы спроектировали такое приложение? Может быть подскажите библиотеки, возможный план разработки, и вообще что-то важное по этой теме. Буду очень благодарена!
Проектируйте микросервисно. Получится как лего: опрятно и взаимозаменяемо.
Тем более разные части можно делегировать подружкам по кафедре.
Итак, микросервисы:
1. Модуль захвата. Можно сделать на основе opencv. Присасывается к видео-потоку и ищет что-то похожее на лица, трекает их (opencv это хорошо умеет). Кадры с лицами гурппами кладёт в очередь (которая у вас отдельным микросервисом рядом крутится). Группы нужны, чтобы можно было улучшить распознавание за счет выбора наиболее однозначно распознаваемых ракурсов.
2. Сервис распознавания. Вытаскивает таски с группами фоток из очереди и кидает в другую очередь на классификацию. После классификации всех вариантов группы выбирает самые надёжные варианты и пишет в БД события.
3. Сервис классификации. Это воркер, он может масштабироваться (запускаться в нескольких экземплярах).
Достаёт таск (фоточку) из очереди, даёт своей нейроночке, а та выдаёт идентификатор класса и степень похожести.
4. Вебсервис реализации дэш-борда - рендер и публикация текущей статисики и текущих событий.
5. Сервис срочных уведомлений - выискивает из БД свежие тревожные события и рассылает СМС, дёргает сирену и активирует пулемётные турели.
Читайте про SOLID. Это надо знать и уметь как "отче наш".
Мне очень понравился вопрос.
Ну действительно. Человек только-только (месяц) как начал разбираться в машинном обучении (у других что-бы понять что к чему годы уходят) и хочет сразу же создать весьма нетривиальное приложение, потому что "проще учиться разбирая что-то сложное" (теоретически верно, при условии, что есть необходимая база знаний, упорство и умение самостоятельно учиться) . При этом - в общем-то не хочет разбираться что и как работает, но и взять готовую библиотеку и разобраться хотя-бы в ней - ни-ни, "что бы лучше самой понять". Весьма похвально, правда не совсем ясно, как это сделать без глубокого понимания предмета, то то такое.
Однако при этом найти в интернете описания решения своей и подобной ей задачи (коих - описаний - в интернете пруд пруди, включая и библиотеки и "планы разработки" ) - тоже самостоятельно или не может или не хочет. И апофеоз - "а опишите мне тут на форуме, "что-то важное по теме", естественно желательно коротко и понятно.
Занавес.