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

Давайте посмотрим, насколько просто использовать фреймворк Apple Vision, построенный на CoreML, для простого распознавания лиц.

Первое, что вам понадобится, это устройство под управлением iOS 11 и Xcode 9, установленное на вашем компьютере для разработки. Вы можете обойтись симулятором для первого примера в этом посте, но вам понадобится модернизированное устройство для проекта, который мы создадим позже.

Давайте возьмем изображение команды iHeartRadio и передадим его функции для обнаружения лиц:

Ядром этой функции являются первые три строки, в которых мы настраиваем VNImageRequestHandler, который затем выполняет VNDetectFaceRectanglesRequest для входного изображения.

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

Четыре лица из шести были успешно обнаружены. Кажется, что такие вещи, как тени, различия в освещении и гигантские светоотражающие (но стильные) солнцезащитные очки немного мешают обнаружению. Опять же, это исполняемый код iOS 11 beta 1 из Xcode 9 beta 1, поэтому неудивительно, что Apple все еще есть несколько проблем, которые необходимо решить до официального выпуска Gold Master в конце этого года.

Обратите внимание на одну важную строчку:

let y = viewHeight — (standardRect.origin.y * viewHeight) — height

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

Это работает, но в целом не слишком увлекательно. Давайте сделаем еще один шаг: обнаружение лиц в реальном времени с прямого видеовхода с камеры! (Здесь вам понадобится устройство, поскольку в симуляторе нет камеры.)

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

Во-первых, Info.plist нужен ключ с именем NSCameraUsageDescription со строковым значением, описывающим, почему нам нужен доступ к камере устройства. Затем мы настраиваем контроллер базового представления для обработки предварительного просмотра с камеры в реальном времени и распознавания лиц:

Вспомогательный класс CameraCapture используется для управления всем вводом-выводом камеры, и мы используем его, чтобы настроить подуровень текущего представления для предварительного просмотра ввода с камеры.

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

Затем мы можем создать подкласс и переопределить processBufferCaptured, чтобы выделить лица:

Посмотрим на результаты:

Но зачем останавливаться на желтых очертаниях? Давайте сделаем это веселее.

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

Полевые испытания нашей системы:

Здорово! Но что, если мы захотим разделить нашу безумную ненависть с другими? Давайте закончим, реализовав возможность сохранять фото в нашей библиотеке.

Info.plist нужен другой ключ с именем NSPhotoLibraryAddUsageDescription со строковым значением, которое пользователь увидит при запросе разрешения библиотеки фотографий. Затем мы можем написать простое расширение, чтобы выполнить работу:

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

Опять же, весь исходный код доступен на GitHub.

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

Изучите новые фреймворки и получайте удовольствие!