В этом коротком руководстве мы будем использовать Vision Framework, чтобы добавить возможности обнаружения и классификации объектов в простой проект ARKit. Мы будем использовать модель Core ML с открытым исходным кодом для обнаружения пульта дистанционного управления, получения центра его ограничивающего прямоугольника, преобразования координат его 2D-изображения в 3D и затем создания привязки, которая может использоваться для размещения объектов в сцене AR.

Вот предварительный просмотр того, что мы создадим:

Для начала вам нужно создать новое приложение дополненной реальности в Xcode: Файл ›Новый› Проект… и затем выбрать «Приложение дополненной реальности».

Замените код в ViewController.swift приведенным ниже кодом, чтобы мы могли начать с чистого листа:

Мы будем использовать свободно доступную модель Core ML с открытым исходным кодом под названием YOLO, что означает «You Only Look Once». Это современная система обнаружения объектов в реальном времени. который может определять местонахождение и классифицировать 80 различных типов объектов.

Модель Core ML можно загрузить с веб-сайта разработчиков Apple: https://developer.apple.com/machine-learning/models/. Прокрутите вниз до YOLOv3-Tiny, нажмите Просмотреть модели и затем загрузите файл YOLOv3TinyInt8LUT.mlmodel.

После загрузки перетащите файл .mlmodel из Finder в Xcode и убедитесь, что он добавлен в цель.

Для обнаружения объекта требуется изображение с камеры, поэтому мы подключимся к методу renderer(_:willRenderScene:atTime:) _1 _, чтобы запросить изображение и запустить процесс обнаружения объекта, если изображение доступно.

Используя захваченное изображение ARKit, мы создадим запрос изображения и заставим его выполнить запрос на обнаружение объекта:

Здесь image imageRequestHandler выполняет запрос обнаружения объекта с именем objectDetectionRequest. Этот запрос нужно создать только один раз, и его можно определить в ленивой переменной. Здесь мы создаем экземпляр модели YOLO и создаем запрос CoreML.

Здесь processDetections - обработчик завершения VNCoreMLRequest. Здесь мы получим распознанный объект дистанционного управления и его ограничивающую рамку, а затем выполним все необходимые преобразования, чтобы получить координаты трехмерного мира, которые мы можем использовать для создания привязки ARKit.

Сначала нам нужно пройти все наблюдения, проверить строку классификации, чтобы увидеть, обнаружено ли дистанционное управление, а затем отфильтровать наблюдения с низкой достоверностью:

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

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

Чтобы получить координату трехмерного мира, мы можем использовать центральную точку пространства обзора для выполнения проверки попадания. Если мы укажем featurePoint в качестве типа результата проверки попадания, ARKit найдет характерную точку, ближайшую к лучу проверки попадания. Если мы получим результат, мы можем использовать его свойство worldTransfrom, чтобы создать привязку ARKit и добавить ее в сеанс:

Добавление этой привязки к сеансу вызовет функцию renderer(_,didAdd:,for:) ARSCNViewDelegate, в которой мы можем добавить трехмерный контент в сцену. В этом случае мы добавим простую красную сферу и прикрепим ее к якорю:

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

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

Проект Xcode можно найти здесь: https://github.com/MasDennis/ARKitVisionObjectDetection