КОДЕКС
Приложение для распознавания лиц iOS в реальном времени на основе FaceNet
В этой статье я расскажу вам, как разработать простое приложение для iOS, способное распознавать лица с высокой точностью. Я тестировал с 70 пользователями.
Способность распознавать это приложение основана на предварительно обученной FaceNetмодели была обучена на «VGGFace2 набор данных, состоящий из ~3,3 млн лиц и ~9000 классов».
Но основная проблема заключается в том, как использовать FaceNet на устройстве iOS. Поскольку я всего лишь разработчик iOS и не имею опыта в машинном обучении или обработке изображений, я долгое время боролся с этим.
В первый раз я пытаюсь обучить модель классификации с помощью инструмента Create ML, это довольно просто. Просто создайте две папки для двух классов, затем перетащите их в Training Data и запустите Train. Подождите и экспортируйте в файл *.mlmodel. Вы можете прочитать Документ Apple для обучения.
Модель работает хорошо, но когда у меня более 3 пользователей, это дает неверный результат. Игнорируй это!
Во второй раз я пытаюсь использовать turi create tool от Apple, он лучше, я могу выбрать архитектуру модели. У нас есть 3 предварительно обученные модели. Я выбрал resnet-50 за лучший результат. Если вы хотите попробовать, прочитайте этот урок. Таким образом, моя модель дает мне точный результат с 10 пользователями, не более! Так что я тоже игнорирую.
Я думал о создании сервера Python, используя FaceNet или ArcFace для распознавания. Затем в моем приложении iOS я отправлю изображение на свой сервер и получу результат. Это даст мне наилучший результат, но проблема в том, что нам нужно дождаться сети, наверняка это приложение не сможет распознать в реальном времени. Итак, я попытался преобразовать модель Tensorflow в формат Core ML с помощью coremltools и использовать ее в своем приложении для iOS. Скачать FaceNet в формате Core ML можно здесь.
Вход — это изображение (цвет 160x160), а выход — это MultiArray (Double 512), это массив с 512 двойными элементами.
Импортируйте «facenet.mlmodel» в свой проект, затем создайте несколько расширений:
Вам необходимо изменить размер входного изображения до 160x160, прежде чем преобразовать его в CVPixelBuffer. Простой демонстрационный код:
Это вывод напечатанный и двойной массив с 512 элементами. Наша модель преобразовала мое лицо в векторы Double 512.
Я буду использовать два лица двух людей, преобразовать их в два вектора. Имейте в виду, что вектор, который я только что сгенерировал, — это база данных лиц 😂. Как только у меня будет новое изображение лица, я буду использовать модель Facenet и конвертировать ее в другой вектор, а затем вычислять расстояние между двумя векторами. Это функция для расчета расстояния:
Ближайшие векторы в базе данных являются результатом прогнозирования.
Но в конечном итоге я использовал FaceNet непосредственно в своем приложении. Использование TensorFlow Experimental» на CocoaPods. Если вы еще не использовали CoacoaPods, вам следует прочитать это.
Установка:
pod 'TensorFlow-experimental'
1. Что такое FaceNet?
Это реализация TensorFlow распознавателя лиц, описанная в статье «FaceNet: унифицированное встраивание для распознавания лиц и кластеризации». В проекте также используются идеи из статьи Deep Face Recognition от Visual Geometry Group в Оксфорде.
Короче говоря, это и есть модель встраивания, вся важная информация из изображения встраиваетсяв вектор. По сути, FaceNet берет лицо человека и сжимает его в вектор из 128 чисел.
В идеале вложения похожих лиц также похожи.
Это моя векторная структура:
2. Как работает приложение?
2.1. Как использовать FaceNet в нашем приложении для iOS?
Я боролся с тем, как использовать TensorFlow в iOS. Читаю FaceNet на мобильном, пытаюсь конвертировать FaceNet (.pb) в FaceNet (.tflite). Он пересекает время океана.
Когда я нашел этот проект на GitHub, использовать FaceNet (.pb) в своем проекте стало намного проще. Вы можете скачать наиболее важные файлы здесь. Он создал связующий заголовок и импортировал Objective-C в Swift. Прочтите этот документ для обучения.
Я думаю, вам следует скачать мой файл, это намного быстрее. Предположим, вы покончили с использованием FaceNet в своем приложении. Взгляните на этот файл, вы должны знать, что с ним делать:
2.2. Получить данные лица
Я запишу 5-секундное видео, извлеку до 50 изображений (5 изображений/1 секунду). Использование FaceNet для создания 50 векторов из этих изображений. Сохраняйте векторы в базу данных или что-то еще, вам нужно использовать это для предсказания.
2.3. Как распознать?
Предположим, вы добавили 10 пользователей, теперь у вас есть 10 x 50 = 500 векторов в вашей базе данных. Создайте ViewController, который может обрабатывать кадр с камеры:
И главная функция здесь:
Посмотрите на эту строку:
let res = vectorHelper.getResult(image: frame)
Это самая важная строка, это функция getResult, она вернет ближайший вектор в базе данных. Думаю, несложно понять, что я пишу, рассчитать расстояние и найти минимальное расстояние. Я использовал свойство расстояния для «Точного значения» и «Расстояния до другого вектора», просто немного двусмысленно 😂😂
Теперь у вас есть имя лица в текущем кадре, давайте нарисуем его в кадре 😌 . См. эту строку в файле FrameViewController.swift:
guard let results = request.results as? [VNFaceObservation] else { return } self.previewView.removeMask() let lb = self.getLabel(image: self.currentFrame) for face in results { self.previewView.drawFaceboundingBox(face: face, label: lb) }
previewView — это UIView, в нем мы показываем вывод кадра камеры. лицо — это VNFaceObservation, короче говоря, я получу ограничивающую рамку лица из этого значения. Подробнее о VNFaceObservation здесь и Apple Vision Framework здесь. Это предварительный просмотр:
Все важное сделано. Вы должны знать, как сделать больше. В противном случае не стесняйтесь клонировать мой проекти изменять его. Я много чего в нем делал (произносил текущее имя, отправлял журнал времени на сервер и т. д.,…» Не забудьте поставить мне звездочку 😅😅😅.
Я использую базу данных Firebase в реальном времени. Это моя структура базы данных:
Например, у вас есть 100 пользователей, поэтому у вас есть 50 x 100 = 5000 векторов. Как найти ближайший вектор за короткое время? Поскольку цикл — не лучшее решение, вам следует больше узнать о кластеризации k-средних, дереве k-d или kNN. Я провел тестирование с 70 пользователями и получил результат за 0,12 секунды. Итак, мое приложение достигает около 8 кадров в секунду.
Спасибо за ваше время. Если моя история поможет вам, не забудьте похлопать меня ❤️❤️