machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Как создать Animoji от Apple, используя ARKit?

Дата публикации Oct 3, 2019

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

Недавно идея Apple Animoji привлекла мое внимание. Итак, я начал исследовать, как Animoji от Apple работает с такой хорошей производительностью.

Постановка задачи:

  1. Визуализируйте 3D Face модель в сцене камеры всякий раз, когда лицо пользователя обнаруживается через фронтальную камеру.
  2. Модель должна имитировать движения лица, выражения и ориентации пользователя.

Основные строительные блоки:

  1. Аппаратное обеспечение с камерой, которое может снимать изображения в режиме реального времени с хорошей производительностью: устройства iOSфронтальная камера истинной глубины (iPhone X и выше)это лучший выбор.
  2. Программное обеспечение, которое может применять алгоритмы обнаружения лиц для обнаружения лиц с помощью выражений лица: для этого можно использовать OpenCV. Но благодаряApple's ARKitкоторая делает большую часть работы под капотом с хорошей производительностью. Он способен обнаружить лицо, а также выражения лица в видеBlendShapes(или Shape keys или Morph target), Каждое местоположение BlendShape имеет значение в диапазоне от 0 до 1, которое является измерением этого конкретного выражения лица.Выучить больше, АРКит обеспечивает50 BlendShape расположениеs
  3. 3D Face model: скачать модель лица сhttps://www.turbosquid.com
  4. Программное обеспечение для редактирования 3D-моделирования, где я могу создавать и определять местоположения blendshape: есть много хороших приложений, таких какUnity, Maya и т. Д. Для работы, но я использовалсмесительv2.80как это бесплатно;).

Подходить:

Идея заключается в том, что всякий раз, когда сеанс отслеживания лица ARKit выполняется, в каждом цикле рендеринга он дает непрерывные 50 значений местоположения смешанной формы в диапазоне от 0 до 1. Если я обновлю эти значения до соответствующих местоположений смешанной формы, определенных в 3D-модели, я получу анимацию для этих местоположений. Таким образом, ключ заключается в том, чтобы определить подходящие blendshapes (или ключи формы) на модели и дать имя shapekey как тоАРКит обеспечивает,

Деление раствора на 4 части:

  1. Создание ключей формы для 3D-модели
  2. Экспортировать объект модели как .dae из Blender
  3. Импортировать файл .dae в Xcode
  4. Код

1. Создание ключей формы для 3D-модели

Поскольку я новичок в Blender, большую часть времени я потратил на то, чтобы освоиться с этим инструментом.

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

Ключи формы

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

Создание ключей формы

Шаг 1

НажмитеTABвыходитьредактироватьРежим. СГоловаобъект выбран, нажмите+(плюс), чтобы добавитьКлюч формы, Этот первый ключ формы автоматически называетсяОснова,и является формой объекта по умолчанию. Не редактируйте форму этого ключа. Ключи формы могут быть созданы только вобъектрежим, но мы, конечно, можем редактировать форму любой клавиши, введя вредактироватьРежим.

Шаг 2

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

Шаг 3

Точно так же я определил 30 ключей формы, ссылаясь наARKit blendshape локациии дал то же имя, что и уARKit blendshapes,

Обратите внимание, что ARKit предоставляет 50 местоположений blendshape. Итак, вы определяете их все, если вы хотите более плавную анимацию.

Изменяя значения ключей формы от 0 до 1, вы можете проверить анимацию этого blendshape.

основаКлюч формы
browOuterUp_LКлюч формы
eyeBlink_LКлюч формы
mouthSmile_LКлюч формы

2. Экспортируйте объект модели как .dae из Blender:

ARKit использует комплект сцены (.scn) для загрузки 3D-моделей. Объект Blender экспортируется в формате Digital Exchange Format (.dae). Xcode имеет возможность конвертировать файл .dae в файл .scn.

Проблемы, с которыми сталкиваются:

A) Убедитесь, что все ваши модификаторы существуют в экспортированном файле .dae:

Каким-то образом я увидел, что мои модификаторы не были экспортированы в файл .dae. Моя 3D модель используетsubdivision modifier

После Google, я обнаружил, что применение этого модификатора важно. В противном случае ключи формы не будут сохранены при экспорте символа - это означает, что анимация не будет работать ItтребуетСкрипт Pythonработать

Затем откройте текстовый редактор, сохраните следующий скрипт в соответствующем месте и вызовите егоapply_with_shape_keys.py:

импорт БПИ

Класс ApplyWithShapeKeys (bpy.types.Operator):
«»»Подсказка»»»
bl_idname = «object.applywithshapekeys»
bl_label = «Применить модификаторы с Shapekeys»

def execute (self, context):

selection = bpy.context.selected_objects

для объекта в выборе:
if obj.type == «MESH»:

# list хранит временные объекты, созданные из shapekeys
shapeInstances = []
shapeValues ​​= []

# Деактивировать любые модификаторы якоря
для мода в obj.modifiers:
если mod.type == ‘ARMATURE’:
obj.modifiers [mod.name] .show_viewport = False

для shape_key в obj.data.shape_keys.key_blocks:
# сохранить старое значение shapekey, чтобы восстановить позже. Будет временно установлен на 0
shapeValues.append (shape_key.value)
shape_key.value = 0.0

я = 0
для shape_key в obj.data.shape_keys.key_blocks:

# игнорировать базовый shapekey
если я! = 0:
# убедитесь, что только соответствующий объект выбран и активен
bpy.ops.Object.select_all (действие =»DESELECT»)
obj.select_set (состояние = True)
context.view_layer.objects.active = obj

# убедитесь, что только этот ключ формы установлен в 1
shape_key.value = 1.0

# дублировать объект только с одним активным ключом формы. Блендер делает все остальное
bpy.ops.Object.duplicate (connected = False, mode = ”TRANSLATION”)
bpy.ops.Object.convert (цель =»MESH»)
shapeInstances.append (bpy.context.active_object)

bpy.context.object.name = shape_key.name

bpy.ops.Object.select_all (действие =»DESELECT»)
obj.select_set (состояние = True)
context.view_layer.objects.active = obj

shape_key.value = 0.0

я = я + 1

context.view_layer.objects.active = obj

# создать конечный объект
bpy.ops.Object.duplicate (connected = False, mode = ”TRANSLATION”)
newobj = bpy.context.active_object
newobj.name = obj.name + «_APPLIED»

# очистить все старые shapekeys от нового объекта
newobj.shape_key_clear ()

# применить все модификаторы к новому объекту
для мода в newobj.modifiers:
if mod.name! = «Арматура»:
bpy.ops.object.modifier_apply (apply_as = ’DATA’, modifier = mod.name)

# перебрать все временно сохраненные объекты shapekey, выбрать только этот и последний объект и присоединиться к ним
для shapeInstance в shapeInstances:
bpy.ops.object.select_all (действие =»DESELECT»)
newobj.select_set (состояние = True)
shapeInstance.select_set (состояние = True)
context.view_layer.objects.active = newobj

result = bpy.ops.object.join_shapes ()

# сбросить старые значения ключей формы
я = 0
для shape_key в newobj.data.shape_keys.key_blocks:
если я! = 0:
shape_key.value = shapeValues ​​[i]
я = я + 1

# сбросить старые значения ключей формы
я = 0
для shape_key в obj.data.shape_keys.key_blocks:
если я! = 0:
shape_key.value = shapeValues ​​[i]
я = я + 1

# удалить временные объекты
bpy.ops.Object.select_all (действие =»DESELECT»)
для shapeInstance в shapeInstances:
shapeInstance.select_set (состояние = True)

bpy.ops.object.delete (use_global = False)

# повторно активировать модификаторы арматуры
для мода в obj.modifiers:
если mod.type == ‘ARMATURE’:
obj.modifiers [mod.name] .show_viewport = True

для мода в newobj.modifiers:
если mod.type == ‘ARMATURE’:
newobj.modifiers [mod.name] .show_viewport = True

возврат {«ЗАВЕРШЕНО»}

def register ():
bpy.utils.register_class (ApplyWithShapeKeys)

def unregister ():
bpy.utils.unregister_class (ApplyWithShapeKeys)

если __name__ == «__main__»:
регистр()

В Blender откройте рабочее место сценария, нажмите «Текст»> «Открыть» и откройте только что сохраненный сценарий.

Теперь нажмите «Run Script» (находится в правом верхнем углу), чтобы добавить скрипт в проект.

Теперь вам нужно вернуться на рабочее место «Макет» (убедившись, что вы все еще находитесь в режиме объекта) и выбрать свой объект с помощьюsubdivisionмодификатор. Теперь нажмите «fn» + «f3», чтобы открыть окно поиска. Найдите функцию, которую вы только что создали, набрав «Apply Modifiers With Shapekeys» и щелкните по соответствующему результату. Blender будет ждать несколько секунд во время загрузки, а затем создаст новый объект с именем(your object name)_APPLIED, Этот новый объект теперь должен иметьsubdivisionприменены модификаторы, так что вы можете либо скрыть, либо удалить свой старый объект.

Теперь мы готовы экспортировать трехмерного персонажа из Blender в.daeфайл. Во-первых, мы хотим выделить и выделить все объекты, которые мы хотим экспортировать. В моем случае этоhead_APPLIEDобъекты. Теперь нажмите «Файл»> «Экспорт»> «Collada (по умолчанию) (.dae)».

Слева у нас есть некоторые настройки, для которых я выбрал:

  • «Только выбор»
  • «Включите детей»
  • «Включить ключи формы»

Другие настройки не имеют большого значения, но могут отличаться в зависимости от вашего персонажа. Теперь убедитесь, что он экспортируется в соответствующее место, и нажмите «Экспорт»> «COLLADA».

B)Убедитесь, что все ваши ключи формы существуют в экспортированном файле .dae:

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

После Google, я нашел этоорудие трудапомог мне решить эту проблему Спасибо Джоналли

Загрузите этот инструмент с GitHub и откройте его в Xcode. Выберите «Схема»> «Редактировать схему».

Теперь перейдите к «Run»> «Arguments»> «Arguments Passed On Launch». Мы хотим передать три аргумента:

  • Путь к входному файлу
  • «-O»
  • Путь к выходному файлу

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

Закройте диалоговое окно и затем запустите код.

Если все прошло хорошо, у вас должен быть выходной журнал, показывающий количество всех геометрий (смешанных форм), например:

Вы можете проверить.daeПредварительный просмотр, чтобы убедиться в наличии модификаторов и ключей формы.

3) Импортируйте файл .dae в Xcode:

Теперь перетащите вывод.daeфайл, сгенерированный изColladaMorphAdjusterвыше в.scnassetsпапки. Нажать на.daeфайл, и вы должны увидеть свой 3D персонаж.

Теперь вы хотите экспортировать.daeкак.scnфайл. Это можно сделать, нажав «Редактор»> «Преобразовать в формат файла сцены SceneKit (.scn)». Обычно я выбираю «Дублировать», так как это сохранит.daeфайл, если вы хотите использовать его по другой причине в вашем проекте.

Теперь нажмите на ваш.scnфайл.

Проверьте, все ли ключи формы (Geometry Morpheus) существуют в файле scn или нет. Если нет, то снова вернитесь в Blender и повторите вышеуказанные шаги.


Измените свойства преобразования Положение, Эйлер и Масштаб модели и установите для него значение, указанное ниже. Я выбрал Scale как 0.2 (20см).

Вы можете добавить материал к модели. Я выбрал Shading как «Физически обоснованный» и Diffuse как «Белый»

4) Код:

Вы можете скачать мой пример проекта FaceAnimoji.

В viewDidLoad ViewController.swift,

а) Загрузить сцену и получить доступ к корневому узлу сцены. Кроме того, установите ViewController как удаление ARSCNView

б) ARKit просит нас предоставить узел для обнаруженного якоря. В нашем случае нас интересуют лица, т.е. ARFaceAnchor. Поэтому, если какое-либо лицо обнаружено, всегда возвращайте наш scene.rootNode для рендеринга.

c) При каждом рендеринге сцены ARKit возвращает 50 значений местоположения blendshape. Поскольку наши имена ключей blendshape модели совпадают с именами ключей blendshape ARKit, нам просто нужно установить соответствующие веса, возвращаемые ARKit.

Создайте и запустите проект на iPhone X или выше с камерой истинной глубины.

Вы можете увидеть модель, имитирующую движения лица пользователя. Так как я определил 30 blendshapes в моей модели, некоторые выражения отсутствуют, например, cheek, tongue out и т. Д.

Надеюсь, вам понравился этот урок, и вы весело проводите время, играя с вашими 3D персонажами.

Вы можете скачать мой пример проектаFaceAnimojiотВот,

Спасибо за чтение!

Оригинальная статья

Footer decor

© machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map