Реализация нового запроса качества захвата лиц от Vision framework для iOS

Во время WWDC 2019 Apple внесла в свой фреймворк Vision много интересных нововведений. Они не только улучшили отслеживание лиц и классификацию изображений, но также представили интересные новые функции, такие как Важность, встроенные модели классификации животных. И улучшенные API для работы с моделями классификации Core ML. Среди новых выпусков возможность сравнивать качество захвата лиц в наборе изображений - одна из самых многообещающих функций, появившихся в этом году.

Внедрение технологии захвата лиц дало мощный импульс технологии распознавания лиц Vision. Он демонстрирует, сколько Apple инвестировала в сферу компьютерного зрения, чтобы сделать съемку и обработку фотографий умнее и проще, чем когда-либо прежде.

Показатель качества захвата лиц использует модель, обученную на широком спектре изображений (с разной экспозицией, освещением, мимикой и т. Д.). Запрос Vision анализирует изображение за один снимок и присваивает ему метрическую оценку. Оценка зависит от выражения лица (отрицательные получают меньшую оценку), освещения, фокуса и размытости изображения.

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

Качество захвата лиц не только помогает в создании более интеллектуальных приложений на основе камеры, как показано в документации, но также помогает привнести интеллектуальное машинное обучение в обработку видео. Цель этой статьи - сделать Live Photos (подробнее об этом позже) умнее, используя качество захвата лиц в наших приложениях для iOS.

Живые фото были представлены в iOS с iPhone 6s и являются одним из самых любимых режимов камеры. Он изменил наш взгляд на неподвижные изображения, предоставив эффект живого движения.

Сфера

Идея состоит в том, чтобы найти лучший кадр из Live Photo с человеческим лицом. Мы будем использовать новый класс VNDetectFaceCaptureQualityRequest для выполнения наших запросов Vision на ряде живых фотографий, которые были намеренно сняты в плохом / размытом состоянии, чтобы извлечь из них лучший кадр.

Однако вы также можете распространить тот же код и концепцию на видео. Live Photos по сути содержат видео, как мы увидим дальше.

Живые фото: под капотом

Живые фотографии состоят из изображения и видеоленты, содержащей действия, выполняемые во время захвата изображения. Это дает ощущение присутствия в данный момент при просмотре их.

Под капотом живые фотографии состоят из ключевой фотографии в паре с файлом ресурса видеоресурса. Мы можем изменить ключевую фотографию, выбрав любой из видеокадров в режиме предварительного просмотра в приложении «Фотографии».

Чтобы получить доступ к ключевой фотографии или видео в коде, вам необходимо использовать класс PHAssetResourceManager, который содержит ресурсы объекта. Мы будем использовать это в нашей реализации в следующих нескольких разделах.

План действий

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

  • ImagePickerController для выбора живых фотографий из камеры или библиотеки фотографий.
  • PHAssetResource, чтобы получить видеоресурс и сохранить его во временном каталоге FileManager.
  • Использование CollectionView для отображения видеокадров вместе со значением метрики качества лица из запроса Vision.
  • Наконец, мы покажем кадр с наивысшим качеством захвата лица в UIImageView.

На следующем рисунке показан общий обзор того, как эта реализация связана - от захвата фотографий в реальном времени до извлечения видео и запроса качества захвата лиц Vision:

Теперь, когда мы разработали наши планы действий, давайте приступим к реализации, настроив пользовательский интерфейс.

Настройка пользовательского интерфейса

Следующий код устанавливает кнопки и изображения в нашем ViewController.swift файле:

Если приведенный выше код выглядит большим, это потому, что вместо раскадровки я создал пользовательский интерфейс программно.

Настройка нашего средства выбора изображений

Одна из вышеупомянутых кнопок отвечает за запуск средства выбора изображений, а другая выполняет запрос Vision, который мы увидим позже.

@objc func onButtonClick(sender: UIButton){
let imagePicker = UIImagePickerController()
imagePicker.sourceType = .photoLibrary
imagePicker.mediaTypes = [kUTTypeImage, kUTTypeLivePhoto] as [String]
imagePicker.delegate = self
present(imagePicker, animated: true, completion: nil)
}

В приведенном выше коде мы установили ImagePickerController для доступа к живым фотографиям из библиотеки фотографий. Чтобы ImagePicker работал правильно, убедитесь, что вы добавили описание использования конфиденциальности для «Использование фотографий» в свой файл info.plist.

Извлечение и обработка видео из живого фото

Живые фото относятся к типу PHLivePhoto. Следующий код используется для обработки Live Photo, выбранного в средстве выбора изображений:

В приведенном выше коде мы фильтруем результаты средства выбора изображений, чтобы вернуть изображения Live Photo, проверяя, содержат ли возвращенные результаты экземпляр aPHLivePhoto в info dictionary.

Внутри функции processLivePhoto мы извлечем видеоресурс из Live Photo, сохраним его во временном URL-адресе в FileManager и извлечем кадры изображения из видео.

PHAssetResourceManager.default().writeData отвечает за запись буферов видео в URL. Как только ресурс записан в videoUrl, функция imagesFromVideos запускается благодаря наблюдателям свойств:

var videoUrl : URL? {
        didSet{
            DispatchQueue.global(qos: .background).async {
                guard let videoURL = self.videoUrl else{ return }
                self.imagesFromVideo(url: videoURL)
            }
        }
}

Извлечение кадров из видео

Следующий код извлекает определенное количество кадров (в зависимости от продолжительности видео) и помещает их в массив:

generateCGImagesAsynchronously отвечает за асинхронное извлечение нескольких кадров из видео в течение указанного NSValue (времени).

Используя asset.duration и numberOfFrames, мы определяем временной интервал между каждым извлеченным кадром. В настоящее время numberOfFrames установлено на 12, чтобы ограничить количество запросов Vision, которые мы будем выполнять. Это кажется нормальным для Live Photos, продолжительность которых не превышает 3 секунд, хотя вы можете поиграть с этим числом, если выполняете обработку видео.

В начале приведенного выше фрагмента кода мы определили несколько свойств. setCustomData используется для заполнения нашего CollectionView. Для этого нам нужно сначала настроить CollectionView.

Прежде чем мы начнем создавать наш CollectionView, взглянем на приложение на полпути:

Конечно, горизонтальное представление коллекции, показанное на приведенной выше записи экрана, еще не реализовано.

Настройка CollectionView

Мы пропустили setupCollectionView функцию при настройке других компонентов пользовательского интерфейса с самого начала. Пришло время реализовать это.

В приведенном выше коде мы настроили горизонтальное представление коллекции и зарегистрировали в нем класс CustomCell, который содержит макет для UICollectionViewCell

Ячейка представления коллекции, источник данных и методы делегирования

Следующий код настраивает ячейку представления коллекции, добавляя к ней UIImageView и Label.

Класс CustomData содержит данные для каждой ячейки. Это источник данных для нашего CollectionView. Следующий код определяет это:

public struct CustomData {
var faceQualityValue: String = ""
var frameImage: UIImage
}

Затем нам нужно определить методы делегата нашего CollectionView:

Теперь пора обработать запрос Vision.

Настройка запроса видения

Наш обработчик Vision возьмет каждое из изображений из CollectionView и запустит на них VNDetectFaceCaptureQualityRequest, чтобы получить показатель faceCaptureQuality. Мы просто покажем изображение с высочайшим качеством захвата лиц в UIImageView.

Следующий код запускает запрос Vision при нажатии кнопки (со значком глаза) для запуска метода выбора:

Я выполнил вышеуказанный запрос Vision на нескольких живых селфи-фотографиях (намеренно размытых, со странными позами и выражениями), чтобы определить лучший кадр. Вот результаты:

Приведенные выше результаты показывают, как Vision помогает автоматически определять лучшее лицо, захваченное из заданного набора изображений (то есть видеокадров). Запрос качества захвата лица для видео довольно быстрый и точный для видео с короткой продолжительностью, как у нас с Live Photos.

Заключение

Итак, мы обсудили новые изменения, внесенные в технологию лица Vision в iOS 13 и macOS 15 (в частности, качество захвата лиц), и создали полное приложение iOS с нуля, которое использует эту новую функцию в Live Photo. Полный исходный код доступен в этом репозитории GitHub.

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

Только время покажет, решит ли Apple ввести эту функцию во встроенную функцию Live Photo для интеллектуального редактирования. А пока вы можете попробовать импровизировать с указанным выше приложением, возможно, сохранив лучший кадр в качестве ключевого кадра (который отображается в библиотеке фотографий) Live Photo.

Это завершает эту часть. Надеюсь, вам понравилось читать.

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

Независимо от редакции, Heartbeat спонсируется и публикуется Comet, платформой MLOps, которая позволяет специалистам по данным и группам машинного обучения отслеживать, сравнивать, объяснять и оптимизировать свои эксперименты. Мы платим участникам и не продаем рекламу.

Если вы хотите внести свой вклад, отправляйтесь на наш призыв к участникам. Вы также можете подписаться на наши еженедельные информационные бюллетени (Deep Learning Weekly и Comet Newsletter), присоединиться к нам в » «Slack и подписаться на Comet в Twitter и LinkedIn для получения ресурсов, событий и гораздо больше, что поможет вам быстрее и лучше строить лучшие модели машинного обучения.