Моей первоначальной целью в этом проекте было создание живых визуальных эффектов для музыкальных событий, в которых использовались видеозаписи с веб-камеры для создания интерактивного контента. Мое первоначальное исследование заключалось в автоматической сегментации активно задействованных конечностей (руки в воздухе) и преобразовании этой области с помощью переноса стиля. Я также хотел, чтобы это запускалось в реальном времени со скоростью 10+ кадров в секунду при разрешении выше 512 пикселей. Изначально я был вдохновлен визуальными эффектами на мероприятиях SURFACE в Валгалле в Веллингтоне, в которых использовались базовые фильтры поверх видео в прямом эфире с веб-камеры на концерте. Я связался с одним из постоянных виджеев на мероприятии и смог использовать некоторые из их сохраненных материалов, чтобы поэкспериментировать с реальным вариантом использования.

Современные методы сегментированной передачи стилей включают UniversalStyleTransfer, который имеет надежную систему для преобразования нескольких областей с разными стилями с глобальной интерполяцией, но ее производительность и временная согласованность не были на должном уровне для работы с живым видеоконтентом. Не многие другие реализации хорошо справлялись с этим стилем сегментации, поэтому я решил отказаться от этого направления и вместо этого использовал анализ звука БПФ для модуляции визуальных эффектов передачи стиля. К сожалению, к тестовым материалам из Валгаллы не прилагались эти аудиоданные, поэтому в качестве входных данных я использую отрывки с концертов в Boiler Room.

AdaIN-style и avatar-net показали большие перспективы в своей работе, но привели к нечетким выводам как с большинством стилей, и особенно проявились при применении к видео, а также к интерполяции на основе альфа вместо интерполяции по сети.

Адаптивный перенос стиля дал более визуально приятные результаты, чем предыдущие варианты, и уникален тем, что тренируется на коллекции работ художников, а не на одном изображении, чтобы получить чувство общего стиля. Однако это имело недостаток в том, что обрабатывалось намного медленнее, а для обучения такой сети также требовалось много дополнительных данных (100 ГБ).

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

  • Достаточно эффективен, чтобы работать вживую
  • Быстро с высоким разрешением или визуально приятным при низком разрешении (с чем боролись AdaIN и avatar-net)
  • По времени (единообразная структура между кадрами)
  • Визуально стимулирующая интерполяция между нулевым / полным стилем.

Изучив немного больше, особенно используя Neural Style Transfer: A Review в качестве источника, я наткнулся на быструю передачу произвольного стиля Google, часть их пурпурного творческого репозитория машинного обучения. Они создали реализацию, которая работает эффективно и, обучаясь на большом количестве нарисованных и физических изображений, имеет базовое представление стиля, которое хорошо интерполируется в заданный стиль из любого. Исходя из этой базы, я расширил его, чтобы загружать видео через общие привязки OpenCV python, которые позволяют использовать один и тот же API для видео в реальном времени / в потоковом режиме и для сохраненных видео, такая же обработка применяется и к выводу видео.

    #video input
    capture = cv2.VideoCapture(FLAGS.video_path)
    fps = capture.get(cv2.CAP_PROP_FPS)
    video_name = os.path.basename(FLAGS.video_path)[:-4]
    #video output
    width = int(FLAGS.image_size*in_width/in_height)
    codec = cv2.VideoWriter_fourcc(*"MJPG")
    out_fps = fps/(1+FLAGS.frame_skips)
    out_file=os.path.join(FLAGS.output_dir, video_name + "_" + style + "_" + str(FLAGS.image_size) + '.avi')
    out = cv2.VideoWriter(out_file, codec, out_fps, (width,FLAGS.image_size), True)

Для анализа звука я использовал библиотеку под названием librosa. Я пробовал несколько различных методов анализа, включая обнаружение биений и частотный анализ cqt, но в конечном итоге полагался на «верное быстрое преобразование Фурье» для получения частотных бинов из звука аудиовидеоканала. Я рассчитал вес каждого кадра путем усреднения амплитуды самых низких частот, чтобы получить басы / ритм музыки. В следующем коде cqt - это numpy.ndarray формы (частоты, выборки), а cqt_sr - это частота дискретизации анализа БПФ.

        bin_start = int(cqt.shape[0]*0)
        bins = int(cqt.shape[0]*0.2)
        for bin_i in range(bin_start, bin_start+bins):
            cur = cqt[bin_i, int(cqt_sr*i/out_fps)]
            weight += cur

        weight = weight/bins
        maxWeight = max(maxWeight, weight)
        weight /= maxWeight
        weight *= weight
        weight = max(weight, lastWeight-0.1)

        lastWeight = weight

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

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

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

Иногда экспериментирование - единственный способ добиться хороших результатов. Далее следует еще несколько примеров, которые показались мне визуально стимулирующими и которые можно было бы использовать для визуальных эффектов в будущем. Это одни из лучших результатов из более чем 65 изображений в разных стилях, которые в ходе проекта я тестировал несколько раз на разных входах, разрешениях и гиперпараметрах.

Используя уникальную передачу стилей Google, мы можем исследовать интерполяцию между идентичностью и стилем, которая наряду с анализом звука создает интересные визуальные эффекты, обладающие достаточной гибкостью для использования в различных стилях и музыкальных жанрах. С другим графическим процессором мы можем выводить плавные 24 кадра в секунду. В будущем я надеюсь, что это сработает для события SURFACE, поэтому я планирую подключить это к существующему программному обеспечению для видео в реальном времени Resolume, позволяя VJ использовать эти сгенерированные в реальном времени интерактивные визуальные эффекты без необходимости изучать мой код или интерфейс командной строки. надеюсь также добавить простые способы взаимодействия с гиперпараметрами, которые я настроил в ходе экспериментов, включая диапазон частотных интервалов, весов и т. д.

Эдвард Тейлор, 2018