WWDC20

Новое в iOS 14: определение контура зрения

Apple повышает свои амбиции в области компьютерного зрения с помощью кучи новых запросов на Vision

Мероприятие Apple WWDC 2020 (только в цифровом формате) стартовало на удивление. Было много новых сюрпризов (читай: Собственные кремниевые чипы Apple для Mac) из мира SwiftUI, ARKit, PencilKit, Create ML и Core ML. Но больше всего мне понравилось компьютерное зрение.

Фреймворк Apple Vision был дополнен рядом интересных новых API-интерфейсов, которые довольно просто выполняют некоторые сложные и важные алгоритмы компьютерного зрения.

Начиная с iOS 14, платформа Vision теперь поддерживает оценку положения рук и тела, оптический поток, обнаружение траектории и определение контура.

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

Наша цель

  • Понимание запроса на определение контура Vision.
  • Запускаем его в приложении SwiftUI iOS 14 для обнаружения контуров вдоль монет.
  • Упрощение контуров за счет использования фильтров Core Image для предварительной обработки изображений перед их передачей в запрос Vision. Мы постараемся замаскировать изображения, чтобы уменьшить текстурный шум.

Обнаружение контура зрения

Обнаружение контура определяет контуры краев изображения. По сути, он объединяет все непрерывные точки, имеющие одинаковый цвет или интенсивность.

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

Обнаружение и сегментация монет - довольно распространенный вариант использования в OpenCV, и теперь, используя новый VNDetectContoursRequest Vision, мы можем легко выполнять то же самое в наших приложениях iOS (без необходимости в сторонних библиотеках).

Для обработки изображений или кадров инфраструктура Vision требует VNRequest, который передается в обработчик запроса изображения или обработчик запроса последовательности. Взамен мы получаем VNObservation класс.

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

Мы можем проверить следующие свойства из VNContoursObservation:

  • normalizedPath - возвращает путь обнаруженных контуров в нормализованных координатах. Как мы вскоре увидим, нам придется преобразовать его в координаты UIKit.
  • contourCount - количество обнаруженных контуров, возвращенных запросом Vision.
  • topLevelContours - массив VNContours, не заключенных внутри какого-либо контура.
  • contour(at:) - Используя эту функцию, мы можем получить доступ к дочернему контуру, передав его индекс или IndexPath.
  • confidence - Уровень доверия к общему VNContoursObservation.

Примечание. Использование topLevelContours и доступ к дочерним контурам удобно, когда вам нужно изменить / удалить их из окончательного наблюдения.

Теперь, когда у нас есть представление о запросе обнаружения контура Vision, давайте посмотрим, как он может работать в приложении iOS 14.

Начиная

Для начала вам понадобится как минимум Xcode 12 beta. Вот и все, так как вы можете напрямую запускать запросы изображений Vision в своих предварительных просмотрах SwiftUI.

Создайте новое приложение SwiftUI в мастере Xcode и обратите внимание на новый SwiftUI App жизненный цикл:

После завершения настройки проекта вы увидите следующий код:

@main
struct iOS14VisionContourDetection: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

Примечание. Начиная с iOS 14, SceneDelegate устарел в пользу протокола SwiftUI App, особенно для приложений на основе SwiftUI. Аннотация @main в верхней части struct указывает, что это начальная точка приложения.

Обнаружение монет с помощью запроса на визуализацию контура

Чтобы выполнить наш запрос Vision, давайте быстро настроим представление SwiftUI, как показано ниже:

В приведенном выше коде мы использовали синтаксис if let, выпущенный в SwiftUI для iOS 14. Игнорируйте состояние preprocessImage; А пока давайте сразу перейдем к detectVisionContours функции, которая обновит outputImage состояние после завершения запроса Vision:

В приведенном выше коде мы установили свойства contrastAdjustment (для улучшения изображения) и detectDarkOnLight (для лучшего определения контура, поскольку у нашего изображения светлый фон) для VNDetectContoursRequest.

После запуска VNImageRequestHandler с входным изображением (присутствующим в папке Assets) мы возвращаем VNContoursObservation.

В конце концов, мы нарисуем normalizedPoints как наложение на наше входное изображение.

Рисование контуров на изображении

Код для функции drawContours приведен ниже:

UIImage, возвращаемый вышеуказанной функцией, устанавливается в состояние contouredImage SwiftUI, и впоследствии наше представление обновляется:

Результаты довольно приличные, учитывая, что мы запускали это на симуляторе, но они, безусловно, были бы лучше, если бы мы запускали это на устройстве с iOS 14 с доступом к Neural Engine.

Но все же контуров слишком много (в основном из-за текстур монет) на наш взгляд. Мы можем упростить (или, скорее, уменьшить) их, предварительно обработав изображение.

Использование основного изображения для предварительной обработки запросов на визуальное изображение

Core Image - это фреймворк Apple для обработки и анализа изображений. Хотя он отлично работает для простых задач по обнаружению лиц и штрих-кодов, он не масштабируется для сложных случаев использования компьютерного зрения.

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

Но что еще более важно, Core Image - удобный инструмент для предварительной обработки изображений, которые затем передаются в структуру Vision для анализа.

Теперь, если вы смотрели видео WWDC 2020 Computer Vision APIs, вы видели, что Apple использовала монохромный фильтр Core Image для предварительной обработки, демонстрируя свой пример определения контура перфокарты.

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

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

Следовательно, при предварительной обработке важно обращать внимание на типы изображений, с которыми вы имеете дело.

outputImage, полученный после предварительной обработки, подается в запрос изображения Vision. Блок кода для создания и применения фильтров Core Image доступен в этом репозитории GitHub вместе с полным исходным кодом.

Анализ контуров

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

VNGeometryUtils.boundingCircle(for: VNContour)

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

Кроме того, вызывая метод polygonApproximation(withEpsilon:) на VNContour, мы можем еще больше упростить наши контуры, отфильтровав небольшие шумные части по краю.

Заключение

Компьютерное зрение играет огромную роль в будущем смешанной реальности Apple. Внедрение API-интерфейсов позы рук и тела, которые были частью структуры ARKit, откроет новые возможности для создания приложений интеллектуального компьютерного зрения.

WWDC 2020 принесла много интересного. Я очень рад новым возможностям машинного обучения на мобильных устройствах. Следите за обновлениями, и спасибо за чтение.

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

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

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