AI와 게임 개발 / 3D 생성 모델 연구 맛보기

NeRF에서 DreamFusion 까지

scalalang2
취미로 논문 읽는 그룹
22 min readMay 7, 2024

--

1994년 폴란드에 설립된 회사인 CD PROJECT는 본래 게임의 CD를 복제 판매하는 회사였다. 나중에는 직접 게임 개발에 뛰어들었고 위쳐3로 초대박을 치면서 기업 신화의 주인공이 되었다. 이를 발판으로 사이버펑크 장르의 AAA급 오픈월드 게임 ‘사이버펑크 2077’을 준비한다. CDPR은 2018년, E3에서 사이버펑크 2077의 게임 플레이 트레일러를 공개했다.

출시일을 3번이나 연기하는 등, 우여 곡절 끝에 출시된 게임은 영상에서 보여줬던 대부분 기능을 찾아볼 수 없었고 콘솔에서 최적화가 되지 않아 정상적인 플레이가 가능한 수준이 아니었다. 사이버펑크 2077이 공개한 게임플레이 영상은 실제로는 대부분 구현조차 되지 않은 데모 영상일 뿐이었다. 논란 끝에 소니는 플레이스테이션에서 게임을 내려 버렸고, 마이크로소프트는 사이버펑크를 설치하려는 유저에게 경고 팝업을 띄우는 조치를 했다. (지금은 애니메이션의 성공과 DLC 출시로 어느 정도 회복되었다)

최근에도 The Day Before라는 게임이 가짜 플레이 영상으로 사용자를 속였고, 얼리 엑세스로 선보인 게임에서 각종 버그는 물론이고, 스팀에서 환불이 가능한 기준인 120분 플레이 시간 정책을 방해하려고 백그라운드에서 게임 프로세스를 계속 돌려두고 있다는 의혹이 있었다. 많은 논란 끝에 개발사는 폐업하였고, 스팀은 조건없이 게임을 전액 환불했다.

필자는 국내의 한 게임회사에서 평범하게 게임 서버를 개발하고 있다. 그러다 보니 AI와 관련해서 여러 내용을 심심치 않게 접하고 있는데, AI 시장도 Hype가 심하다 보니 개발팀의 실력과 현재의 기술 수준을 부풀려서 VC로 부터 투자를 받아 법인 차량부터 바꾸거나, 정부 과제의 눈 먼돈을 받기 위해 코딩보다 제안서를 더 많이 쓰는 회사도 있다.

게임 분야에서는 3D 모델을 AI로 렌더링을 제공한다는 소프트웨어들이 데모 영상만 공개하고 고가의 선주문을 받고있으며, 일부 유튜버와 수익을 공유하며 바이럴 마케팅에만 힘쓰는 모습이 심심치 않게 보인다.

그러다 보니 AI 기술이 어디까지가 진실이고 어디까지가 Hype인지 스스로 경계를 찾고 싶었다. 최신 연구 동향을 파악하기 위해 논문 한편을 읽어봤다. 오늘은 구글이 2023년에 ICLR에서 발표한 Dream Fusion을 소개한다. Dream Fusion은 Diffusion Model을 이용해서 텍스트를 3D 모델로 변환하는 방법을 다룬다.

본인은 컴퓨터 그래픽스나 AI 전문가가 아니라, 평범한 개발자의 시선에서 능력이 되는데 까지만 이해한 것이니 재미로만 봐주세요

DreamFusion 으로 생성한 3D 오브젝트

INDEX

  • Background
  • Text-to-3D Model
  • NeRF(Neural Radiance Fields)
  • Diffusion Model & DDPM
  • Dream Fusion : Score Distillation Sampling
  • Dream Fusion : Algorithm
  • Limitations
  • Ending

Background

필자는 현재 신작 게임을 준비하고 있다. 그러다 보니 하나의 게임을 만들기 위해 들어가는 비용과 시간이 얼마나 큰지 잘 알고 있다. AI 기술이 개발팀의 생산성을 크게 높여준다면 게임의 컨텐츠 분량과 퀄리티를 한 단계 더 높일 수 있을 것이다.

요즘 많은 중국 게임사들이 높은 퀄리티의 컨텐츠를 5~6주 간격으로 DLC 수준의 업데이트를 제공하는 미친 개발속도를 자랑하다보니, 인건비가 비싼 일본과 한국, 유럽 등에서 제작되는 게임들은 중국 게임사의 생산성을 따라가려면 한 명 한 명의 생산성을 높이는 것이 필요한 상황이다.

2022년 센서타워 블로그

게임 뿐만 아니라 증강현실, 영화, 애니메이션 등 컴퓨터 그래픽을 활용하는 모든 분야에서 AI 도구가 생산성을 높여줄 수 있다면 제작자가 만든 컨텐츠의 표현력 향상과 컨텐츠 분량 확대를 통해 사람들이 충분히 긴 시간동안 즐길 수 있도록 도움을 줄 것이다.

뜬금 없지만 최근 State of Unreal 2024 에서 소개된 게임이 인상적이어서 인용해보았다.

Text-to-3D Model

최근 DALLE, Stable Diffusion, Midjourney 등의 인공지능이 텍스트를 기반으로 고해상도의 이미지를 만드는 능력을 선보이고 있다. 최근 생성 모델 트렌드는 Diffusion Model [1]연구를 기반으로 대규모의 이미지-텍스트 학습 데이터를 이용했다.

Text-to-3D Model을 만든다고 하면 3D 데이터를 Diffusion Model 학습에 이용하면 되지만, 아쉽게도 3D 에셋은 제작도 어렵고 절대적인 개수도 이미지에 비하면 한참 부족하다. 그래서 최신 연구들은 2D 이미지 모델로 3D 생성 모델을 만드는 방법을 고민하고 있다. 오늘 다루는 Dream Fusion도 이러한 방법으로 3D 모델을 생성한다.

그림 출처 : ICLR 2023 — DreamFusion: Text-to-3D using 2D Diffusion

논문 내용을 다루기 전에 NeRF(Neural Radiance Fields)[2]와 Diffusion Model[1]에 대한 사전 지식이 필요해서 이 개념을 먼저 다루면서 시작한다.

NeRF(Neural Radiance Fields)

NeRF(Neural Radiance Fields)는 다양한 각도에서 촬영한 이미지를 기반으로 해서 3D 공간을 구현한 신경망 자체를 의미한다. 가장 기본적인 분류모델, 언어모델은 대규모의 학습 데이터로 일반화된 지식을 잘 학습하는 방식이라면 NeRF는 신경망 하나가 하나의 공간(Scene)만을 표현하고 학습 데이터도 동일한 사물을 여러 각도에서 촬영한 사진을 이용한다.

NeRF는 네트워크 자체는 컨볼루션 레이어 없이 Fully-connected Network 만을 이용한다. 입력 데이터로는 카메라의 위치 좌표 (x,y,z)카메라의 각도 (θ, ϕ) 를 사용한다. 네트워크의 출력은 이미지이다.

아래 그림을 잘 보면 ray가 지나가는 각 위치(x,y,z)와 각도(θ, ϕ)를 샘플링 해서 F(θ)에 색상을 질의하는데 이 과정을 논문에서 query 라고 표현했다. 이 과정을 여러번 거쳐서 각 색상을 얻어온 다음에 Volume Rendering 기법으로 최종적으로 2D 이미지로 보여줄 색상을 결정한다.

NeRF 학습 구조도 출처 : [2]
NeRF는 공간에 대한 이미지를 사용해서 하나의 딥러닝 모델이 공간 자체를 학습하게 한다.

정리하자면 입력값은 카메라의 위치, 출력값은 해당 카메라에서 바라본 이미지를 2차원으로 투영한 값이다. 네트워크는 컨볼루션 레이어 없이 Fully Connected Layer를 사용한다. NeRF는 여기서 학습의 성능을 높이기 위해 3가지 정도를 더 준비했다.

① Volume Rendering
게임을 취미로 가진 사람들이라면 컴퓨터 게임은 주로 폴리곤(Polygon)으로 3D 모델링을 표현한다는 것을 알고 있을 것이다. 반대로 3D 오브젝트를 표현하는 방식중에 복셀(Voxel)이 있다. Volume + Pixel을 나타내는 말이며 2차원 이미지를 누적한 것이라고 생각하면 된다. 일상생활에서는 뇌 컴퓨터 단층촬영(Brain CT)를 하면 나오는 이미지가 복셀로 표현된다.

완전 어렸을 때 시험 문제로 정사각형은 총 몇개냐 라는 문제가 나온적이 있었지…

Volume Rendering은 예전부터 사용된 3D Voxel 데이터를 2차원으로 투영하는 방식이다. 물체를 바라보는 카메라 위치로부터 Ray Casting 하면서 물체와 만나는 모든 색상값을 누적해 2차원 픽셀에 표현될 색상을 계산한다.

출처 : Clinical Utility of Three-dimensional US1

Ray는 카메라의 위치에 O와 이동 거리 * 시간 Dt을 더해서 O + Dt로 표현한다. 논문에서는 Ray의 결과값인 C(r)를 구하는 Volume Rendering 수식을 아래와 같이 표현했다.

여기서 T(t)는 광선이 시간에 따라 누적된 투과율(빛이 물체를 통과할 수 있는 정도)을 나타낸다. 이 값은 시간에 따라 값이 작아질 것이다. 다시 말하면 빛이 통과하는 곳의 밀도가 큰 부분은 값을 크게 가지고 달의 뒷면 처럼 빛이 닿을 수 없는 공간의 색상은 적게 합성되는 원리이다.

그리고 밀도를 나타내는 volume density σ(x) 와 색상값 c를 곱해서 ray 하나의 색상값을 계산한다. 여기서 σ(x) 또한 학습된 확률 분포이다. 이제 구적법을 사용해서 적당히 값을 샘플링해서 근삿값을 계산한다.

수식 자체는 1995년에 발표된 논문, Optical models for direct volume rendering 에 기반해서 완성되었다.

이렇게 사용한 Volume Rendering 수식은 미분이 가능하기 때문에 오차역전파로 학습할 수 있다.

② Positional Encoding
입력값이 (x,y,z,θ,ϕ) 로 굉장히 차원이 작았기 때문에
Positional Encoding으로 차원을 늘리는 작업을 한다.

③ 계층적 밀도 샘플링 (Hierarchical Volume Sampling)
아래 그림을 잘 들여다 보면 비어있는 공간의 데이터는 샘플링해도 Loss에 기여하는게 없기 때문에 계산을 최적화 하기 위해서는 좋은 데이터를 샘플링 해야 한다. 논문에서는 coarse 네트워크와 fine를 학습해서 신경망으로부터 데이터를 샘플링 하는 방식을 제안한다.

먼저, 균일(Uniform)하게 데이터 Nc 개를 샘플링한다. 그리고 이를 coarse 네트워크에 색상을 얻어온 뒤에 이 결과값을 다시 fine 네트워크에 넣어서 평가한다. 이러면 fine 네트워크는 볼륨과 관련된 정보로 점점 편향된다. 볼륨 렌더링 수식에서 가중치 w 를 아래와 같이 정의하고, 색상에 기여하는 가중치에 대해서 전체를 나누면 확률 밀도 함수(PDF)가 하나 나오는데 이 확률 분포에서 Inverse Transform Sampling으로 값을 다시 샘플링해서 사용한다.

색상을 표현하는데 더 많이 기여하는 가중치일수록 확률이 높게 나온다.

마지막으로 coarse 네트워크에서 얻어온 값과 fine 네트워크에서 얻어온 값으로 Loss를 사용해서 신경망을 학습한다.

④ NeRF의 단점
우선 데이터 구하기가 까다롭다. 실외 촬영으로 데이터를 구한다고 치면 해가 계속 이동하기 때문에 정적인 순간의 3D 공간 사진을 구하기가 어렵다. 또한, NeRF Model 하나가 하나의 공간만을 다루기 때문에 다른 용도로 사용하기 어렵다.

지금까지가 NeRF에 대해서 대략적으로 소개하였고 원본 논문과 Keras 홈페이지[3]에 더 자세한 내용이 나와있다.

Diffusion Model & DDPM

Diffusion Model에 대해서는 따로 논문을 보진 않았고 본 스터디에서 한 번 진행했었던 자료와 위 영상을 토대로 정리했습니다.

Diffusion Model이란 원본 데이터에 노이즈를 점진적으로 추가해서 가우시안 분포를 따르는 노이즈를 만들고, 노이즈로부터 점차 노이즈를 걷어내서 원본 이미지로 복원하는 프로세스를 가진 생성 모델이다.

Diffusion Models: A Comprehensive Survey of Methods and Applications[4]

원본 이미지에서 노이즈로 향하는 과정을 Forward Process, 노이즈에서 이미지로 향하는 과정을 Reverse Process라고 부르는데 이 두 과정은 현재 상태를 바로 이전 상태에만 의존한다고 가정하는 마르코프-체인으로 정의한다.

노이즈를 추가하는 과정을 표현하는 함수 q는 step 마다 가우시안 분포에서 노이즈를 조금씩 추가한다. 아래 수식에서 β값은 노이즈가 추가되는 량을 결정하며 가우시안 분포의 평균과 분산이 저렇게 생긴 이유는 노이즈를 계속 추가하기만 하면 값이 커지니까 값을 조금 scale down 시키는데 이런 상황까지 표현한 것이다[5].

Forward process를 이렇게 정의했는데, 우리가 원하는 것은 노이즈에서 이미지로 향하는 p 함수를 구하는 것이다. 이 함수는 학습을 통해 q(x_t|x_t-1)에서 노이즈를 제거하는 확률 분포의 평균과 분산을 배운다.

Forward Process의 q의 확률 분포는 이미 주어졌으니, 네트워크를 최적화 하는 Loss는 두 확률 분포를 추정하는 KL Divergence Loss를 이용할 수 있다. 원래대로라면 Denoising Process를 매 step마다 진행해서 매우 느릴 것이지만, DDPM의 저자들(Ho et al)[1]께서는 노이즈를 생성하는 q 함수를 특정 x0에서 임의의 단계 t로 바로 건너 뛸 수 있는 수식을 세우셨다.

그리고 이제 이 수식으로 다시 denoising 하는 p 함수를 학습하기 위해 Loss세워야 한다. 식 자체를 이리저리 잘 유도하면 아래와 같은 최종 수식이 완성된다고 하시는데 본인은 수학에 자신이 없는지라 처음부터 이해할 생각도 하지 않았다.

정말 다행히도 앞에 있는 상수는 쿨하게 제거해버리고 실제 노이즈인 ε과 신경망으로 학습하는 εθ의 차이만으로 Loss를 사용해도 충분히 잘 작동한다고 말한다.

Ho et al. (2020) found that predicting worked best, especially when combined with a reweighted loss function

Score Distillation Sampling

지금부터는 이 글의 주제인 Text로부터 3D 모델을 만드는 Dream Fusion[7] 내용을 다룬다. Dream Fusion은 기존에 이미 텍스트로 2D 이미지를 생성하는 Diffusion Model에 사용된 개념을 사용하고 3D로 렌더링 하는데에는 NeRF를 이용한다.

하지만, Diffusion Model을 그대로 사용하지는 않는데 Diffusion Model은 샘플링된 노이즈로부터 이미지를 생성하는 반면, 우리가 원하는 건 카메라의 위치와 각도로부터 3D 모델을 생성하는 것이기 때문이다. 이를 differentiable image parameterization(DIP)[8] 라고 부른다.

DIP의 핵심 개념을 보여주는 그림이다.

생성함수 g 가 파라미터 θ를 입력으로 받아서 이미지 x = g(θ)를 생성한다. 생성함수 g는 미분 가능(differentiable)하기 때문에 오차 역전파 알고리즘(Backpropagation)으로 학습할 수 있다. 3D 세계에서는 생성함수 g는 volume tric renderer이고 파라미터 θ는 3D Volume 정보를 말한다.

Dream Fusion의 구조도

위 그림은 DreamFusion의 구조도이다. U-Net과 Transformer에 자물쇠 아이콘이 있는 걸 볼 수 있는데, 이 둘은 학습 대상이 아니고 pre-trained 된 모델을 이용한다. 마지막으로 Diffusion Model과 NeRF에서 만들어진 이미지를 비교해서 만들어진 Loss를 다시 NeRF로 학습하는 구조를 가지고 있다. Diffusion Model은 구글의 Imagen을 사용한다.

DreamFusion에서 정의한 Loss를 Score Distillation Sampling (SDS) 라고 부르는데 위의 내용을 잘 따라왔다면 크게 어렵진 않다. 여기서 Distillation은 Hinton 교수님이 예전에 제안하신 지식 증류[9]를 의미하고, Score Function은 확률 분포를 파라미터에 편미분 한 값이다. 다시 말해서 그냥 Diffusion Model의 지식을 빌려오겠다는 뜻이다.

SDS Loss의 내용

눈을 크게 뜨고 잘 보면, 위에서 봤던 Diffusion Model의 L_simple을 따르고 있다. 이미지 x는 NeRF로 생성된 이미지 g(θ)를 입력값으로 주었고 Diffusion Model인 ε_hat 의 파라미터에서 y가 추가된 걸 볼 수 있는데 이건 텍스트를 임베팅 한 값이다.

z_t를 논문에서는 잠재변수(latent-variable)라고 말하고 있는데 이는 초기 이미지 x에 대해서 step t에 대해 노이즈를 씌운 값이다. 마지막으로 우측의 미분한 값을 살펴보면 파라미터 θ에 대해 편미분 한 값이고 w(t)는 다시 잠재변수 zt를 x에 대해 편미분한 값이 NeRF 모델을 업데이트 할 Gradient가 된다. (이런 수식을 chain rule 이라고 불렀던가..?)

Appendix 에 포함된 의사코드

마지막으로 Appendix에 포함된 의사코드를 같이 첨부했다.

Dream Fusion : Algorithm

Dream Fusion의 구조도

Neural Rendering
Dream Fusion은 NeRF에서 향상된 버전인 mip-NERF 360(CVPR 2022)[11]을 사용한다. 초기에는 랜덤한 가중치로 NeRF를 만들고 랜덤한 카메라 각도로 이미지를 계속 생성하면서 가중치를 업데이트 한다. 즉, 우리가 3D 모델 하나를 원할 때 마다 NeRF Scene을 하나씩 만들어야 한다.

Shading
컴퓨터 그래픽스에서 쉐이딩이란 광원의 위치나 각도에 따라 색을 변형시켜서 입체감을 주는 작업이다. Dream Fusion은 NeRF에는 없는 셰이딩 개념을 추가했다. 구조도에서 L은 빛의 위치를 의미한다. 그리고 MLP(Multi-layer Perceptron의 약자이니 네트워크를 의미)는 이제 볼륨을 의미하는 τ와 함께 albedo값 ρ를 출력값으로 준다.

albedo[12][13]는 물체가 빛을 받았을 때 반사하는 정도를 나타내는 값이다. 실제 셰게에서 물체마다 이 값이 다른 것에 착안해서 컴퓨터 그래픽스에서도 이용하고 있다. 논문에서는 (τ,ρ)로 색상 c를 계산하는 수식까지 설명하고 있는데 여기서는 느낌으로만 이해하자면 반사율이 높을 수록 밝아지고 낮을 수록 어두운 색채를 가지게 된다. (흰눈의 반사율이 90% 정도이다)

왜 셰이딩을 추가했느냐? 하면, albedo값을 랜덤하게 아주 밝은(1,1,1)값으로 바꾸면서 학습하면 Texture가 없는 결과를 만든다. “다람쥐”를 만들도록 명령했을 때 단지 다람쥐가 포함된 이상한 사진이 덜 나온다고 한다.

카메라 및 광원 샘플링
학습 단계에서 카메라는 완전 랜덤으로 만들진 않고 elevation 각도는 [-10,90] 사이, Azimuth(방위각)는 [0,360]에서 샘플링한다. 광원의 위치를 샘플링 하는 기준 또한 카메라와 동일하다.

그림 출처 : https://www.celestis.com/resources/faq/what-are-the-azimuth-and-elevation-of-a-satellite/

Diffusion loss with view-dependent conditioning
샘플링된 카메라의 위치에 따라 텍스트 임베딩 할 때, 프롬프트에 사족을 조금 붙인다. 예를 들어 elevation이 60도를 넘으면 “overhead view” 라고 붙이며 물체를 바라보는 방향에 따라 “front view”, “back view” 등 프롬프트에 조미료를 첨가한다.

이것 말고도 논문에서는 학습에서 사용하는 테크닉들이 몇 개 더 있는데, 여기서는 생략한다.

학습
하나의 모델을 만들 때마다 4개의 칩이 탑재된 TPUv4 머신으로 15k학습을 했고 대략 1.5시간 정도 소요되었다.

NeRF로 3D Mesh 만들기
실제로 게임을 만들 때는 3D Mesh로 변경해서 사용해야 하는데, 이를 위해서 3차원 상의 점과 밀도값으로 Mesh를 생성하는 Marching Cube[14]을 이용한다. (1987년 SIGGRAPH 에서 발표된 논문)

Limitations

한계점은 논문의 Discusion 항목과 OpenReview[15] 내용을 참고했다.

  • Dream Fusion의 핵심 아이디어가 Dream Field(CVPR 2022)[16]와 유사하다고 한다. Dream Field에서는 CLIP을 사용했다면 Dream Fusion은 Diffusion Model을 증류해서 사용한다.
  • 연구에서는 모델의 해상도를 64 x 64로 잡아서 디테일이 많이 부족하다. 그렇다고 모델을 키워버리면 학습이 매우 느려서 실용적이지 않다. 후속 연구인 Prolific Dreamer(NeurIPS 2023)[17]는 512 x 512의 해상도로 3D 모델을 생성보았다. 그리고 Stable Diffusion에서도 Stable Zero 라는 3D 생성 모델을 공개했는데 논문으로 공개된 건 없지만 SDS Loss을 사용한다고 하니까 핵심 개념은 Dream Fusion과 교집합이 있는 것으로 보인다.

Prolific Dreamer 논문을 잠깐 봤는데, 17GB GPU Memory가 필요했고 NVIDIA A100 GPU 하나(약 1300만원)에서 몇 시간 정도 학습했다고 한다. 모델 크기만 키운 건 아니고 텍스트 프롬프트를 확률 변수로 취급하고 LoRA로 언어 모델까지 파인 튜닝 하는 구조를 가지고 있다. 논문을 키워드 중심으로 봐서 더 자세히는 모른다.

ProlificDreamer 구조도
Prolific Dreamer의 생성 결과
  • SDS 가 이미지 샘플링에 있어서 ancestral sampling과 비교하면 완벽한 Loss가 아니라고 하는데 필자는 해당 연구는 몰라서 잘 몰라서 여기서는 생략한다.
  • 2D 모델에 비해서 Mode Collapse가 더 부각된다는 리뷰가 있다. 손실 함수 특성상 텍스트 프롬프트에 대한 다양성이 줄어든다고 하는데 연구자들은 프롬프트에 “a DSLR photo of”를 붙이거나 high guidance weights로 신경망을 빨리 포화시키면 어느 정도 개선할 수 있다고 한다.

Ending

이번 글에서는 NeRF에서 출발해서 Diffusion Model, Dream Fusion까지의 내용을 다루었다. 텍스트를 3D로 합성하는 분야의 주요 연구들이 threestudio 레포지토리에서 관리되고 개발되고 있는 것으로 보인다. 여기서 한걸음 더 나아가실 분들은 위 링크 내용을 따라가보면 도움이 될 것 같다.

지금까지의 연구 성과들을 당장 게임에 활용할 수 있냐고 묻는다면 아직은 부족하다. 3D Mesh의 Polygon개수가 렌더링이나 네트워크 성능에 영향을 미치기 때문에 아티스트는 퀄리티와 성능 사이의 적정한 밸런스를 조절해야 하고 Collision Mesh나 애니메이션을 위한 리깅은 자동으로 만들어지지 않는다. 그렇다고 현재의 결과물이 2D 생성 모델처럼 해상도가 높다거나 참고할 수 있을 만한 수준도 아니다.

당장 사용할 만한 건 게임 내 대사에 음성 AI를 활용할 수 있고, 단순 일러스트만 필요한 경우에는 AI로 생성한 후 리터칭 해서 사용하는 사례도 있다. 이건 원래도 대기업에서는 외주로 주던거라서 외주 비용이 감소하는 것이지 개발팀의 생산성이 늘었다고 체감하지는 못했지만, 이런 AI 기술을 잘 활용하는 소규모 개발팀들의 게임 퀄리티가 갈수록 높아지고 있다고 느끼고 있다.

--

--

scalalang2
취미로 논문 읽는 그룹

평범한 프로그래머입니다. 취미 논문 찾아보기, 코딩 컨테스트, 언리얼 엔진 등 / Twitter @scalalang2 / AtCoder @scalalang