뉴럴 포스트 프로세싱(Neural Post Processing) 은 포스트 프로세싱 파이프라인에서 신경망을 사용하는 사용자 친화적인 방법입니다. 머티리얼 에디터를 사용하여 코드를 작성하지 않고도 신경망을 활용하는 포스트 프로세스 머티리얼(Post Process Materials)을 구성할 수 있습니다.
뉴럴 포스트 프로세싱 활성화하기
시작하기 전에 먼저 프로젝트에서 Neural Rendering 플러그인을 활성화해야 합니다. 메인 메뉴의 편집(Edit) 아래에 있는 플러그인(Plugins) 브라우저에서 플러그인을 활성화할 수 있습니다. 이 플러그인에는 머티리얼 에디터에서 설정한 뉴럴 프로파일 및 뉴럴 버퍼, 텍스처를 기반으로 신경망을 실행하는 데 필요한 모든 코드가 포함되어 있습니다.
뉴럴 포스트 프로세싱 머티리얼 구성하기
아래 섹션을 따라 ONNX 포맷 신경망을 임포트 및 구성하고, 이 신경망을 사용할 수 있는 포스트 프로세스 머티리얼을 생성합니다.
신경망 프로파일 구성하기
다음 단계에 따라 언리얼 엔진에서 호환되는 신경망 모델을 임포트하고 구성합니다.
- ONNX(*.onnx) 머신 러닝 모델 파일을 언리얼 엔진으로 임포트하여 NNE 모델 데이터(NNE Model Data) 에셋을 생성합니다.
-
콘텐츠 브라우저에서 추가(+) 메뉴를 사용하여 뉴럴 프로파일(Neural Profile) 에셋을 생성합니다. 머티리얼(Material) > 프로파일(Profiles) 롤아웃 메뉴에서 에셋을 추가할 수 있습니다.
-
새로 생성한 뉴럴 프로파일(Neural Profile) 에셋을 엽니다.
-
NNE 모델 데이터 할당 슬롯을 사용하여 ONNX 파일을 임포트했을 때 생성한 NNE 모델 데이터 에셋을 설정합니다.
포스트 프로세스 머티리얼 생성하기
다음 단계에 따라 일부 그래프 로직과 함께 뉴럴 프로파일을 사용하는 포스트 프로세스 머티리얼을 구성합니다.
- 콘텐츠 브라우저에서 새 머티리얼(Material) 을 생성하고 엽니다.
-
머티리얼 에디터에서 디테일(Details) 패널을 사용하여 다음과 같이 설정합니다.
- 머티리얼 도메인(Material Domain): 포스트 프로세스(Post Process)
- 신경망과 함께 사용됨(Used with Neural Networks): 체크
- 뉴럴 프로파일(Neural Profile): 뉴럴 프로파일 에셋
-
머티리얼 그래프(Material Graph)에서 Neural Input 노드를 사용하여 신경망으로의 입력을 준비하고 Neural Output 노드를 통해 신경망에서 출력을 가져옵니다. 메인 머티리얼 노드의 이미시브 컬러(Emissive Color) 핀에 연결하면 다음과 같은 모습일 것입니다.
- 머티리얼 에디터 툴바에서 적용(Apply) 을 클릭합니다.
이 구성을 통해 머티리얼이 머티리얼 에디터에서 이용할 수 있는 모든 노드를 사용하여 데이터를 프리 프로세싱 및 포스트 프로세싱할 수 있습니다. 이 예시에서는 1/2.2의 간단한 감마 보정을 적용하고 입력 값 범위를 0~1에서 0~255로 스케일 조절한 후 뉴럴 출력에서 출력을 가져온 뒤 디스플레이에 다시 반전시킵니다. 스케일 조절이 항상 필요한 것은 아닙니다. 신경망 모델 입력과 출력 범위에 따라 달라집니다. 모델 입력과 출력 범위가 0~1이면 아래와 같이 더 간단하게 구성할 수 있습니다.
아래는 이 구성을 더 진행하여 디폴트 라이트 머티리얼을 마스크로 사용하도록 커스텀 영역을 적용한 예시입니다.
이 구성은 다음과 같은 결과를 생성할 수 있습니다.


뉴럴 프로파일 에셋 세팅
뉴럴 프로파일은 신경망과 바인딩하고 런타임과 배치 크기, 타일 환경설정을 지정하는 데 사용됩니다.
| 프로퍼티 | 설명 |
|---|---|
| 모델 | |
| 런타임 타입(Runtime Type) | 지원할 NNE 런타임 타입으로, NNERuntimeORTDml 또는 NNERuntimeRDGHlsl입니다. |
| NNE 모델 데이터(NNE Model Data) | 엔진에 임포트한 NNE 모델 데이터(예: ONNX 모델)를 저장합니다. |
| 입력 치수(Input Dimension) | 사용 중인 NNE 모델 데이터의 입력 치수입니다. |
| 출력 치수(Output Dimension) | 사용 중인 NNE 모델 데이터의 출력 치수입니다. |
| 오버라이드 | |
| 배치 크기(Batch Size) | 배치 치수가 다이내믹(-1)인 경우 배치 크기를 오버라이드하는 데 사용됩니다. |
| 타일 | |
| 타일 크기(Tile Size) | 사용되는 총 타일입니다. 각 타일은 1 배치로 실행됩니다. NNE 모델은 치수 증강 없이 그대로 로드되어 사용됩니다. 예를 들어, 입력 텍스처의 치수가 다르면 적용 전에 스케일 다운됩니다. 자동(Auto)로 설정하면, 자동으로 배치 치수로 타일링된 버퍼가 생성되며, 각 타일이 뉴럴 모델을 실행합니다. 예를 들어, 모델 입력 치수가 (1x3x200x200)이고 포스트 프로세싱에 사용된 버퍼 크기가 1000x1000인 경우, 5x5 타일((5x5)x3x200x200)이 실행되어 재결합됩니다. |
| 테두리 오버랩(Border Overlaps) | 타일 테두리 오버랩입니다(왼쪽/오른쪽, 상단/하단). 이 값이 클수록 타일 크기가 자동으로 설정된 경우 전체 화면을 덮는 데 필요한 타일 수가 증가합니다. |
| 오버랩 리졸브 타입(Overlap Resolve Type) | 오버랩 리졸브 방법을 설정합니다. 무시(Ignore)로 설정하면 오버랩된 타일 영역이 인접한 타일에 기여하지 않습니다. 페더링(Feathering)으로 설정하면 오버랩된 영역이 인접한 타일에 선형으로 블렌딩됩니다. |
타일링
타일링은 타일 오버랩을 포함하여 텍스처 인덱싱 모드에서 지원됩니다. 연결 중에 오버랩된 타일 영역을 무시(Ignored) 또는 페더링(Feathered) 으로 설정하여 뉴럴 필터링 및 스타일 전송과 같은 애플리케이션을 지원할 수 있습니다. 타일이 많으면 디테일 증가에 도움이 되지만, 네트워크 복잡도에 따라 비용이 증가할 수 있습니다.
다음은 페더링을 통해 2x2 타일링을 사용하여 뉴럴 스타일을 전송하는 예시로, 이음새가 숨겨져 있습니다.
r.Neuralpostprocess.TileOverlap.Visualize 1 시각화 콘솔 명령을 사용하여 타일 오버랩을 시각화할 수 있습니다.
타일 크기가 자동(Auto) 으로 설정된 경우, 타일 크기에서 스케일 조절을 적용하지 않고 뉴럴 입력 텍스처 위에 네트워크를 직접 적용합니다. 이때 텍스처 외부의 타일은 미러링됩니다. 다음은 타일 크기를 자동(Auto)으로 설정한 경우 타일 오버랩을 시각화한 예시입니다.
버퍼 인덱싱
텍스처는 타깃 치수에 따라 다운스케일되거나 업스케일되며, 타일 크기가 자동 으로 설정된 경우에는 그대로 유지됩니다. 현재 텍스처 인덱싱 모드는 텍스처 인덱싱 모드에 대해 기본적으로 [1 x 3 x H x W]를 지원합니다.
다른 [B x C x H x W] 치수로 임의의 ONNX 모델을 사용하려면 버퍼 인덱싱 모드(Buffer Indexing Mode) 를 사용하면 됩니다. 이 모드에서는 읽거나 쓴 실제 값을 완전히 제어할 수 있습니다. 기본적으로 필터링이 수행되지 않으므로 머티리얼 그래프에서 머티리얼 로직을 사용하여 필요한 필터를 적용하거나 커스텀 셰이더 코드를 작성해야 합니다.
다음은 씬을 B=2x2 배치로 분할한 예시이며, Neural Input 노드와 Neural Output(버퍼) 노드를 통해 설정됩니다.
또한, 뉴럴 프로파일 에셋에서 몇 가지 세팅도 수정해야 합니다. 다음 옵션 중 하나를 사용할 수 있습니다.
- 다이내믹 배치가 지원되는 경우 배치 크기 오버라이드(Batch Size Override) 를 4 로 설정합니다.
- 다이내믹 배치가 지원되지 않는 경우 타일 크기(Tile Size) 를 2x2 로 설정합니다.
타일은 순차적으로 호출되지만, 배치는 한 번의 실행으로 배포됩니다. 이러한 두 옵션은 버퍼에서 읽거나 쓰는 방법에 대한 디자인에 따라 함께 사용할 수도 있습니다. 현재 Neural Output 노드의 각 호출은 세 개의 연속 채널을 읽습니다.
런타임 타입
다음 두 가지 NNE 런타임 중에 선택할 수 있습니다.
- NNERuntimeORTDml: DirectML을 백엔드로 사용합니다.
- NNERuntimeRDGHlsl: 32의 나머지로 출력 너비에 최적화된 컨볼루션을 사용합니다.
애플리케이션
뉴럴 포스트 프로세싱을 프로젝트에서 리얼타임 렌더링으로 사용하거나 씬 캡처를 통해 툴로 사용할 수 있습니다. 다음은 몇 가지 사용 가능한 애플리케이션입니다.
- 스타일라이즈(Stylization): 빠른 스타일 전송, AnimeGAN, CartoonGAN, Pix2Pix, CycleGAN
- 스케치(Sketch): ShadeSketch
- Neural tone mapping
- Image segmentation and Classification
추가 참고 사항
- Neural Input 및 Neural Output 노드의 호출 수.
- 하나의 포스트 프로세스 머티리얼에서 하나의 Neural Input 노드만 호출할 수 있지만, Neural Output노드는 여러 번 호출할 수 있습니다.
- 뉴럴 입력의 마스크.
- 마스크를 사용하여 버퍼나 텍스처에 기록할 화면의 일부를 선택할 수 있습니다. 예를 들어, 왼쪽 상단에 직사각형 모양이 있는 경우, 해당 영역을 1로 설정하여 UV와 입력을 유효하게 만들어 버퍼에 기록하고 다른 UV와 입력은 마스크를 0으로 설명하면 무시할 수 있습니다.
- 결과 해상도가 낮은 경우.
- 결과 해상도는 모델 출력 치수의 영향을 받습니다. 뉴럴 프로파일에서 출력 치수를 확인하세요. 해상도를 높이려면 더 높은 해상도 모델을 익스포트하거나, 위에서 언급한 버퍼 인덱싱 또는 타일링을 사용하여 치수를 늘리면 됩니다. 모델에 따라 테두리에 비연속성이 있을 수도 있습니다.
- 버퍼 레이아웃.
- 텍스처 인덱싱 모드에서 기본적으로 지원되는 레이아웃은 BCHW입니다. 개발된 모델의 레이아웃은 텐서플로우와 같은 BHWC일 수 있으므로 명시적으로 BCHW로 익스포트해야 합니다.
유용한 콘솔 명령
r.Neuralpostprocess.Apply로 신경망의 애플리케이션을 활성화하거나 비활성화할 수 있습니다. 비활성화하면 뉴럴 입력이 뉴럴 출력으로 직접 반환됩니다.