Вступление

В своем последнем посте я рассказал о некоторых трудностях работы с кастомными нейронными сетями в Lens Studio. На этот раз я покажу вам, как это выглядит, с пошаговым руководством по созданию и реализации вашей собственной нейронной сети в Snap Lens.

К концу этой публикации вы научитесь:

  1. Обучите свою собственную модель сегментации с помощью Fritz AI Studio. В своем примере я использовал маски для лица, но вы можете выбрать любой целевой объект (ы), который хотите.
  2. Включите свою модель в проект Lens Studio с помощью компонента машинного обучения.
  3. Визуализируйте прогнозы модели в реальном времени.
  4. Создайте наложение цвета и интерактивный ползунок цвета, чтобы изменить внешний вид сегментированного объекта.

Часть 1: Построение модели с помощью Fritz AI Studio

Для более подробного ознакомления с работой с Fritz AI Studio вы можете ознакомиться с нашим Руководством по быстрому запуску; или, в случае практического использования, прочитайте наш сквозной учебник по детектору кошек.

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

К счастью, мы можем начать работу с гораздо меньшим количеством изображений благодаря инструменту генерации синтетических данных в Fritz AI Studio. Этот инструмент позволяет пользователям:

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

Для моей модели маски для лица я закончил маркировку около 50 исходных изображений для окончательной версии, представленной в этом посте, но я смог получить приемлемый прототип только с 10 помеченными изображениями!

Изображения семян

Чтобы сгенерировать набор данных в Fritz AI Studio, мы начинаем с загрузки и вручную помечаем коллекцию исходных изображений. Исходное изображение - это .PNG интересующего объекта (в моем случае - маска для лица) с прозрачным фоном. Я использовал бесплатный инструмент remove.bg, чтобы удалить фон для моих изображений, но вы также можете сделать это вручную с помощью программного обеспечения для редактирования изображений, такого как Photoshop.

Для детектора лицевой маски вы могли бы сделать исходные изображения только самой лицевой маски, но в итоге я также включил голову и плечи объекта. Как следствие, модель узнает, как маска выглядит в контексте человеческого лица / головы, поэтому, например, маска, лежащая на столе, не будет обнаружена. Все исходные изображения, которые я использовал, были близки к 500x500 пикселей.

Группа исходных изображений называется Коллекцией изображений в Fritz AI Studio. Закончив аннотировать эти исходные изображения с помощью масок сегментации, я использовал инструмент создания набора данных, чтобы превратить мои 50 изображений с ручной меткой в ​​4000 изображений с автоматической меткой всего за несколько минут.

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

Fritz AI Studio также позволяет вам контролировать некоторые аспекты создания наборов данных, редактируя конфигурацию «Advanced Options» при создании снимка.

Параметр «Масштаб переднего плана» позволяет настроить относительный размер исходных изображений, когда они накладываются на фоновые изображения, в соответствии с вашими потребностями. Вы также можете настроить коэффициент пустого пространства, который представляет собой долю изображений, оставшихся пустыми (исходное изображение не вставляется на фон), и соотношение сторон, которое управляет соотношением ширины к высоте сгенерированных изображений.

Обучение модели

Теперь, когда у меня есть достаточно большой размеченный набор данных, я готов обучать свою модель сегментации маски для лица. Я могу сделать это и в студии Fritz AI - мне просто нужно настроить новое учебное задание (без кода!), Выбрав созданный мной снимок и тип модели (например, сегментацию изображения), а также мой бюджет на обучение (я пошел с 5 часами обучения - рекомендуется по умолчанию). Обратите внимание, что если обучение модели заканчивается раньше, с пользователей не будет взиматься плата за неиспользованное время обучения.

Для получения более конкретных инструкций по обучению моделей с помощью Fritz AI Studio ознакомьтесь с нашими основными концепциями и пошаговым руководством.

После того, как я закончил маркировать свои 50 исходных изображений, настроил и начал свою работу по обучению, у меня была обученная модель, готовая к работе примерно через 3 часа, включая создание набора данных и обучение модели!

Прежде чем читать дальше, обратите внимание, что мы недавно реализовали функциональность для проектов Lens Studio / SnapML, которая позволяет вам пропустить следующие шаги, которые в противном случае потребовались бы при работе с вашими собственными нейронными сетями:

  • Преобразование модели Keras в формат TensorFlow protobuf (.pb)
  • Настройка проекта Lens Studio с компонентом машинного обучения (часть 2)
  • Создание маски-линзы (часть 3)

Во время обучения модели Fritz AI Studio автоматически конвертирует модель в формат .pb, что делает ее совместимой с Lens Studio. Вы сможете загрузить этот файл модели и шаблон проекта Lens Studio, которые помогут вам быстро приступить к созданию объектива.

Если вы приносите на вечеринку свою собственную модель, обязательно обратитесь к документации Snap по экспорту модели в формат, совместимый с Lens Studio. Это может быть непростой процесс, поскольку не все типы слоев нейронной сети поддерживаются Lens Studio.

Далее в этом руководстве предполагается, что у вас есть обученная модель, сохраненная в формате .pb. Не стесняйтесь читать, если вас интересуют мельчайшие подробности создания линз с помощью специального машинного обучения!

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

Часть 2: Настройка проекта Lens Studio с компонентом машинного обучения

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

Для начала откройте Lens Studio и нажмите кнопку «Новый проект». Есть много полезных шаблонных проектов, но пока мы начнем с пустого проекта, чтобы упростить задачу.

Давайте сначала удалим объекты камеры и освещения по умолчанию на панели объектов (которая по умолчанию находится в верхнем левом углу) и папку Echopark на панели ресурсов (которая по умолчанию находится в нижнем левом углу), поскольку мы не будем нуждаться в них. Помните, что вы можете в любой момент перейти в меню «Окно» ›Панели, если не можете найти нужную панель.

Чтобы использовать нашу модель, нам нужно добавить в проект компонент машинного обучения. Для этого щелкните значок «+» в верхней части панели «Объекты», найдите «ML» и выберите компонент ML.

Затем в появившемся системном диалоге нам нужно выбрать .pb файл нашей обученной модели, чтобы загрузить его в компонент ML. Lens Studio предоставляет изображения RGB со значениями в диапазоне от 0 до 255 в качестве входных и ожидает, что выходные данные также будут в диапазоне от 0 до 255 (для моделей сегментации), поэтому вам может потребоваться настроить параметры масштаба и смещения в соответствии с ожидаемыми входными данными вашей модели. и выходы.

Если вы загрузили файл .pb из Fritz AI, нормализация уже встроена в модель, поэтому вы можете оставить параметры масштаба и смещения в Lens Studio с их значениями по умолчанию. Если вы делаете это вручную (возможно, с моделью, которую вы обучили самостоятельно), ознакомьтесь с моим последним постом, где есть несколько советов по интеграции нормализации в вашу модель.

Если компонент ML отображается под камерой перспективы, переместите его в корень иерархии объектов и удалите камеру перспективы.

После того, как вы импортируете модель, она появится на панели «Ресурсы». Однако, прежде чем мы продолжим работу с моделью, давайте добавим несколько изображений для предварительного просмотра (или видео), чтобы мы могли визуализировать прогнозы модели после соединения различных частей линзы.

Для этого щелкните в верхней средней части панели предварительного просмотра (справа в макете по умолчанию), где написано «Человек 1», нажмите кнопку «+ Из файлов» и выберите файл изображения. После добавления файла он должен появиться в раскрывающемся списке, где вы можете выбрать его для использования в качестве изображения для предварительного просмотра.

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

Часть 3: Создание линзы маски

Часть 3.1: Визуализация прогнозов маски

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

1. Настройте входные и выходные текстуры компонента ML. Выберите компонент ML на панели Objects, и он должен появиться на панели Inspector (расположенной слева от панели Preview). В нижней части панели инспектора установите для входной текстуры значение «Текстура камеры устройства». Внизу панели нажмите кнопку «Создать текстуру вывода». Эта текстура теперь будет доступна на панели ресурсов (внизу слева). Не стесняйтесь переименовать его - я называю свою «Текстура вывода модели маски лица».

2. Добавьте объект "Изображение экрана". Затем нам нужно добавить объект Screen Image (так же, как мы добавили компонент ML - щелкните значок + на панели Objects). Он должен появиться вложенным в объект Orthographic Camera, который мы переименуем в Mask Orthographic Camera, потому что позже нам понадобится другой объект Orthographic Camera для пользовательского интерфейса.

3. Создайте материал в редакторе материалов. Чтобы обработать вывод модели, нам нужно создать материал в редакторе материалов. Материал позволит нам контролировать, где на экране отображается наложение сплошного цвета. Мы будем использовать прогноз модели для каждого пикселя, чтобы определить прозрачность наложения цвета: он будет более непрозрачным, когда модель более уверена, и более прозрачной, когда модель менее уверена. Для начала добавьте материал Graph Empty в панель Resources:

Дважды щелкните новый материал Graph Empty, чтобы открыть его в редакторе материалов. Не стесняйтесь обращаться к документации редактора материалов Lens Studio для подробного объяснения основных понятий, но основная идея состоит в том, что мы создаем график (вы можете думать о нем как о функции), входными данными которого являются:

  1. Выходные данные модели сегментации
  2. Цвет наложения цвета
  3. Максимальное значение альфа (непрозрачности)

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

Чтобы добавить узлы к графу, нажмите кнопку + и найдите тип узла:

Вот полная структура графика:

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

Узел Float Parameter контролирует максимальную непрозрачность наложения цвета. Установка этого значения на 0,6–0,7 хорошо работала для моего варианта использования, потому что это позволяет прояснить некоторые детали лицевых масок.

Узел "Параметр текстуры 2D" принимает выходные данные модели. Моя модель имеет два выходных канала: один для класса фона и один для масок лица. Наличие двух каналов является избыточным для сегментации одного класса объектов, но Fritz AI Studio создает модели с фоновым классом, поскольку предлагает гибкость обучающих моделей, которые могут сегментировать несколько классов объектов по отдельности.

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

Узлы "Параметр 2D текстуры" и "Параметр цвета" доступны для пользовательских сценариев - подробнее об этом в шаге 3 следующего раздела.

4. Подключите выходную текстуру модели. Теперь, когда у нас настроен граф материала, нам нужно подключить выходную текстуру модели. Выберите материал на панели ресурсов, и вы должны увидеть параметры графика на панели инспектора. В разделе «Параметры графика» установите параметр «Выходные данные модели» в качестве выходной текстуры модели, созданной на шаге 1 выше.

5. Настройте компонент «Изображение экрана». Установите Материал в качестве материала сегментации из шага 3, установите для текстуры текстуру вывода модели из шага 1 и установите для параметра «Режим растяжения» значение «Растягивание».

На этом этапе вы должны увидеть прогнозы вашей модели! Попробуйте выбрать материал маски на панели «Ресурсы» и поиграть с параметрами «Цвет маски» и «Альфа-канал маски сегментации» (которые управляют прозрачностью наложения цвета) на панели «Инспектор».

Часть 3.2: Добавление ползунка цвета

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

1. Создайте еще одну ортогональную камеру. Самый простой способ сделать это - продублировать маску ортогональной камеры (щелкните правой кнопкой мыши ›Дублировать), а затем удалить полнокадровую область 0 под новой камерой. Давайте переименуем его в Slider Orthographic Camera, пока мы на нем.

2. Реализуйте слайдер. Следуйте инструкциям здесь (обязательно используйте ползунок ортогональной камеры из шага 1), чтобы добавить элементы пользовательского интерфейса в свой проект. Когда у вас есть элементы пользовательского интерфейса в своем проекте, вы можете удалить подсказку касания и все, что вложено в панель пользовательского интерфейса, за исключением палитры цветов пользовательского интерфейса. Иерархия ваших объектов должна выглядеть так:

3. Измените компонент «Палитра цветов пользовательского интерфейса». Откройте сценарий UIColorPicker, расположенный на панели «Ресурсы» в разделе «Пользовательский интерфейс› Ресурсы ›Сценарии», и измените строку 48 с

//@input Component.MeshVisual colorRecipient

to

//@input Asset.Material colorRecipient

И измените строку 652 с

script.colorRecipient.mainPass.baseColor = currentColor;

to

script.colorRecipient.mainPass.maskColor = currentColor;

Обратите внимание, что maskColor - это имя, которое мы дали узлу ввода параметров цвета на графе материала сегментации маски лица из шага 3 предыдущего раздела.

Эти изменения кода позволяют нам подключить ползунок цвета к нашему наложению цвета маски лица. Выберите палитру цветов пользовательского интерфейса на панели «Объекты» и назначьте материал для сегментации из шага 3 в предыдущем разделе:

4. Организуйте различные компоненты в два слоя. Давайте поместим компоненты наложения цвета на один слой, а компоненты ползунка цвета на другой слой, чтобы мы могли контролировать, когда эти слои появляются в нашей линзе. Это позволяет нам всегда отображать наложение цвета и показывать ползунок цвета только в режиме захвата. Все, что находится под Mask Orthographic Camera, должно находиться в слое под названием «Mask», а все под ползунком Orthographic Camera должно располагаться в слое под названием «Slider».

Убедитесь, что вы развернули компонент UI Panel и назначили все, что находится под ним, также слою «Slider»:

5. Организуйте цели рендеринга в конфигурации сцены. Этот шаг позволяет нам отображать элемент пользовательского интерфейса цветного ползунка в режиме реального времени при записи снимка, но он исчезает в режиме захвата перед отправкой снимка. Мы настроим это на панели Scene Config. Панель конфигурации сцены находится за панелью ресурсов в левом нижнем углу. Нажмите «Конфигурация сцены», чтобы она стала видимой.

В конфигурации сцены нажмите кнопку Render Target справа от Capture Target. В появившемся окне переименуйте Render Target в Capture Render Target и создайте новую цель визуализации с именем Live Render Target.

Вернувшись в конфигурацию сцены, установите Capture Target на Capture Render Target и установите Live Target на Live Render Target.

Убедитесь, что цель рендеринга для ортогональной камеры маски установлена ​​на «Захват цели рендеринга», а цель рендеринга для ортогональной камеры ползунка установлена ​​на «Цель рендеринга в реальном времени».

Наконец, установите входную текстуру цели рендеринга захвата как текстуру камеры устройства, а входную текстуру цели рендеринга в реальном времени установите в качестве цели рендеринга захвата.

Давайте протестируем наш новый объектив на телефоне! Вы можете легко подключить свое устройство к Lens Studio и предварительно просмотреть линзы на Snapchat. Вот как выглядит раскраска маски для лица в действии:

Заключение

Вот и все! Мы только что создали наш собственный инструмент для изменения цвета маски лица Lens с настраиваемой нейронной сетью, реализованный в проекте Lens через SnapML. Мы работали с несколькими различными процессами и инструментами, поэтому давайте кратко резюмируем:

  • В Fritz AI Studio, начав всего с 50 размеченных вручную исходных изображений, мы сгенерировали снимок данных из 4000 автоматически размеченных изображений, которые мы использовали для обучения нашей пользовательской модели сегментации маски лица. Мы экспортировали эту совместимую с Lens Studio модель и сопутствующий шаблон проекта.
  • А для тех, кто хотел изучить тонкости работы с Lens Studio, мы также проработали пошаговый процесс создания Lens, уделяя особое внимание работе с настраиваемыми нейронными сетями.

Следите за новостями, поскольку наша команда продолжает экспериментировать с Lens Studio и Snap ML. А если вы заинтересованы в создании пользовательских моделей машинного обучения для использования непосредственно в Lenses, дайте нам знать!

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

Независимая редакция, Heartbeat спонсируется и публикуется Fritz AI, платформой машинного обучения, которая помогает разработчикам учить устройства видеть, слышать, ощущать и думать. Мы платим участникам и не продаем рекламу.

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