Style Transfer

Style Transfer

pz

Process

REST Mode

По умолчанию используется этот режим.
Для стилизации необходимо в AStyleGameMode вызвать метод StylizeREST, принимающий адрес Style-сервера (например, 127.0.0.1:5000) и RenderTarget с буфером, который необходимо стилизовать.

Stages —  массив со значениями размера изображения на каждой из стадий стилизации (последняя стадия должна быть 1024)
StyleId —  id стиля (12 / 23 /28)

Стилизованная текстура приходит с событием StylizedREST.


UE Server Mode

Используется, когда имеются проблемы с захватом изображения для стилизации на клиенте.
Для включения режима необходимо задать StyleRESTMode = false (AStyleGameMode), а также StyleServerEnabled = true

Git

В случае клиент-серверной архитектуры стилизация производится на сервере. Клиенты определяют состояние сцены и получают по grpc готовые текстуры, упакованные в несколько пакетов.

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


UE Server

Main Level содержит несколько подуровней, каждый из которых соответствует UE клиенту.

SetupLevels

Для начала работы необходимо выполнить инициализацию уровней и стилизатора. Для этого нужно вызвать метод SetupLevels AStyleGameMode:

SetupLevels(TArray<FStyleConfigurationItem> ConfigurationItems, TArray<FStyleStage> StylizationStages,
TSubclassOf<APawn> PawnClass,
int ResultWidth,
int ResultHeight,
bool useGpu)
  • PawnClass —  класс, в инстансы которого вселяются клиенты
  • Result Width, Result Height —  размер финального изображения
  • UseGPU —  если true, стилизация и Denoise производятся на GPU (требуется поддержка CUDA 8). При этом OpenCV (остальные фильтры и ресайз) в любом случае использует ресурсы CPU. UPD: в данный момент cuda операторы выключены

Количество ConfigurationItems не должно превышать количество подуровней главного уровня.

Стадии стилизации применяются по очереди и определяют выполняемые над изображением действия.

  • Input Width, Input Height —  размер входного изображения (для первой стадии эти значения определяют размер Render Target
  • Resize Algorithm —  алгоритм интерполяции, применяемый при ресайзе
  • Stylize —  если true, то изображение трансформируется нейронной сетью
  • Denoise —  если присутствует, включает фильтр снижения уровня шума
  • Blur —  если присутствует, изображение размывается (Averaging, Gaussian, Median)
  • Bilateral —  билатеральный фильтр

Потенциально доступен весь функционал OpenCV. Фильтры могут добавляться при необходимости.

Пример стилизации в 4 стадии. На последней стадии изображение не прогоняется через сеть, но Denoise применяется


При клиент-серверной архитектуре после инициализации сервера к нему подключаются UE клиенты с PlayerName и соответствующими настройкам.

Каждый подуровень должен содержать ASceneCapture2D, определяющий положение камеры захвата и APlayerStart.

При отсутствии единого сервера можно выполнить стилизацию, вызвав функцию Stylize AStyleGameMode.

Размер Texture должен совпадать с размером, заданным для первой стадии стилизации

Если задан параметр Texture, стилизуется буфер соответствующей текстуры (в противном случае —  буфер RenderTarget'а)

Стилизация осуществляется асинхронно вне зависимости от значения UseGPU.

Event Finalize вызывается при завершении стилизации


UE Client

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

Для старта сессии необходимо вызвать функцию StyleSetup (AStylePlayerController)

После этого клиент может вызвать функцию Stylize (AStylePlayerController) и получить буфер стилизованной текстуры, которую можно получить из AStylePlayerController

UPROPERTY (EditAnywhere, BlueprintReadOnly, Category = "Style Player Controller")
UTexture2D *StylizedTexture = nullptr;


Admin Interface

  • Осуществляет запуск UE сервера и UE клиентов с параметрами
StyleTransfer.exe Main?listen -StyleServer ue_server_ip
StyleTransfer.exe ue_server_ip?name=player_name -StyleServer ue_server_ip player_name —  идентификатор машины UE клиента
  • инициирует запуск (сброс) сессий
service StyleService {
rpc StartSession (SessionInfo) returns (StatusResponse) {}
}
message SessionInfo {
  string artist_name = 1;
  string level_name = 2;
}
artist_name
—  имя пользователя
  • принимает стилизованные изображения для
service StyleService {
rpc GetTexture (TextureRequest) returns (stream TexturePart) {}
}
message TextureRequest {
 string level_name = 1;
 int32 stamp = 2;
}
message TexturePart {
  int32 part = 1;
  int32 parts_total = 2;
  int32 bytes = 3;
  int32 bytes_total = 4;
  int32 texture_width = 5;
  int32 texture_height = 6;
  bytes data = 7;
}

style.proto находится в /Test/GRPCTest

  • Осуществляет идентификацию пользователей, сохраняет и отправляет результаты сессий вовне


Cборка

  • проверить наличие CUDA 8
  • установить Windows SDK (Win 10, Win 8.1)
  • пропатчить Unreal Build Tool (/Engine/Binaries/DotNET) (Unreal Engine 4.18)
  • собрать проект (Visual Studio 2015)
  • положить динамические библиотеки из Stylization\Source\ThirdParty\StylizationLibrary\x64\Release в Binaries проекта

Debug

Запустить listen server можно в Editor (open LevelName?listen).
Запустить клиент можно так:
"D:\Epic Games\UE_4.18\Engine\Binaries\Win64\UE4Editor.exe" C:\PaintingsVR\PaintingsVR.uproject 127.0.0.1?name=Player_1 -game -log


Модель

Обученная модель замораживается в tftn.pb и загружается в рантайме.

Необходимый для работы граф должен лежать в Content/Auxiliary/Graph проекта.


Качество стилизации

Зависит от:

  • модели сети
  • параметров обучения
  • исходного изображения (форма, цвета и текстуры объектов)
  • стадий стилизации
  • постобработки стилизованного изображения


Примечания

  • При асинхронной стилизации на CPU плавной работы Render thread'а добиться не выходит. Кроме того, при наличии достаточного количества стадий (4 и более) стилизация занимает много времени (более 10 секунд).
  • При использовании GPU плавность работы нарушается только при наличии фильтров OpenCV.
  • Имеет смысл использовать клиент-серверную архитектуру.




Report Page