목차

 

1. 목표

2. 준비물

3. 진행 과정

4. 결과

 

1. 목표

 

던파에는 '가완프'라는 용어가 있다.

'가장 완벽한 프리스트'라는 뜻인데, 이는 던파에서 원하는 룩을 맞추기 위해 가장 완벽한 캐릭터라는 뜻이다.

 

 

 

(출처 - https://df.nexon.com/community/creation/ucc/2759242, https://df.nexon.com/community/creation/ucc/2843015

 

대략 이런 식으로 말이다.

 

 

던파에 있는 수많은 직업들 중 왜 하필 코스프레로 유명한 건 남프리스트인가? 에 대해서는

개인적으로 두 가지 이유가 있다고 보는데

 

1. 오래된 직업이라 사용할 수 있는 아바타 파츠가 많다.

2. 남프리스트는 던파에 존재하는 모든 직업 중 키와 체격이 제일 크다.

즉 캐릭터 표현에 사용되는 픽셀 수가 많고, 그렇기 때문에 코스프레를 표현하는 데 용이하다.

 

1번은 객관적으로 확인할 수 있는 사실이지만,

2번은 개인적인 추측일 뿐이다.

 

비단 던파 뿐만 아니라 수많은 게임들에서 이런 식으로 해당 게임에서 제공하는 룩 변경 기능을 이용해서

자신이 원하는 스타일을 구현하거나, 외부 IP의 캐릭터를 코스프레 하거나 한다.

위 가완프의 경우도 던파에서 원하는 룩을 구체화하는 방식 중 하나인 것이다.

 

여기서 아이디어를 떠올려서, 그렇다면 이미지 생성 모델을 이용해서 룩을 구현해보면 어떨까? 라는 생각을 했다.

던파는 마침 2D 게임이라서 이미지 모델을 베이스로 학습을 할 수 있고,

오래된 게임이라 이미지 소스가 많아서 학습에 필요한 데이터 또한 충분히 확보할 수 있을 것이라고 생각했다.

 

따라서, 이 프로젝트의 최종 목적은

1. 기존 이미지 생성 모델을 베이스로 던파 아바타 이미지를 추가로 학습하고,

2. 일반적인 프롬프트를 사용해서 던파 아바타 스타일의 이미지를 생성할 수 있게 하는 것이다.

 

 

2. 준비물

 

1) base 모델 선정 + LoRA

base 모델은 사실 선택지가 없었다.

무조건 sd3.5 medium 뿐이었는데, 이유는 가지고 있는 GPU가 VRAM이 10GB짜리 RTX 3080이기 때문.

물론 일반적으로는 학습용으로 사용할 경우 VRAM 10GB로도 한참 부족하지만,

윈도우의 경우 shared gpu memory를 통해 system ram의 절반 정도를 할당받아 쓸 수 있고,

이를 통해 수십GB의 추가 memory를 사용할 수 있었기에 어떻게든 할 수 있었다.

 

그러면 더 큰 모델들 (sd3.5 large, flux 2 dev, z-image 등)은 사용할 수 없었나? 라는 의문이 들 수 있는데,

먼저 sd3.5 medium 기준으로 최고 해상도인 1024로 학습할 경우, batch size가 4가 한계였다.

여기서 모델 사이즈를 늘린다고 하면, sd3.5 large만 해도 medium의 두 배 이상 사이즈이기 때문에 문제가 생겼을 것이다.

설령 학습에 사용이 가능했더라도 batch size, rank, image resolution 등 여러 곳에서 제한이 생길 수 밖에 없을 것이고,

그러면 결국 학습 시간이 훨씬 오래 걸리거나, output의 품질에 제한이 걸리는 등 여러 한계가 생길 수 밖에 없었을 것이다.

 

개인용 GPU로 학습하는 것이었기 때문에,

빠른 iteration을 돌리기 위해서는 최대한 작은 모델인 것이 시간상 유리했고,

따라서 이번 학습은 sd3.5 medium으로 고정했다.

 

그리고 LoRA는 같은 이유로 당연히 사용하게 됐다.

품질은 비슷한데 학습 시간 절약에 큰 도움이 되는 방법을 사용하지 않을 이유가 없다.

 

2) 학습 데이터 확보

학습 데이터는 던파 데이터에서 아바타 이미지를 추출해서 랜덤하게 조합해서만들었다.

던파 아바타의 경우 총 9개 슬롯에 각각 1파츠씩 장착하는 식이다.

이 중 피부 슬롯은 시스템적으로 캐릭터의 신체를 나타내기 때문에 필수고, 나머지 8개 슬롯은 선택이다.

실제 인게임에서는 직업마다 특정 슬롯은 미장착 시 기본 아바타를 장착하긴 하는데,

학습할 때 그런 것까지 세세하게 따질 건 아니니까 그냥 무시했다.

 

던파에는 기본 직업이 총 15종류가 있고,

피부는 직업당 대략 10종류씩,

나머지 슬롯은 더미 데이터 같은 걸 다 포함해서 대략 각각 1000종씩 있었다.

거기에 2D 게임인 던파 특성상 애니메이션을 표현할 때 이미지를 연속으로 재생하는 식으로 표현하는데,

여기에 사용되는 이미지가 직업당 150~200장 정도씩 존재한다.

그렇다면 이론상 15 x 10 x 200 x 1000 ^ 8 = 3e28개의 아바타 이미지를 뽑아낼 수 있다는 소리고,

당연히 개인용 GPU 1장으로 저만큼의 데이터를 다 학습할 수 없으니, 적당히 뽑아내서 사용했다.

 

자세한 건 밑에서 또 적겠지만, step 한 번에 120초 정도 걸렸다고 치고 세팅 바꿔서 학습할 때마다 각각 8시간씩으로 잡았으니,

대략 학습 iteration 한 번에 8시간 x 60분 / 2분 = 240 step 정도씩 학습했다.

batch size가 4면 1440장, 32면 11520장을 학습에 사용한 셈이다.

 

학습 이미지의 경우 최소 사이즈로 잡으면 200x200 해상도 이미지로 생성할 수 있고,

sd3.5 medium base 모델이 학습할 때 사용한 이미지 사이즈를 고려해서 기본 해상도를 256x256으로 잡았다.

여기에 학습할 때 upscaling하는 식으로 512, 1024 해상도까지 추가해서 학습에 사용했다.

학습 데이터의 예시

 

 

3) 생성 방식

마지막으로, 목표로 하는 이미지 생성 방식을 정할 필요가 있었다.

 

1. 실제 존재하는 아바타 파츠에 대한 정보를 생성하고, 그 파츠들을 조합해서 최종 이미지를 구성하는 방식

2. 아바타 파츠를 생성하고, 그것들을 조합해서 최종 이미지를 구성하는 방식

3. 그냥 최종 이미지 1장만 생성하기

 

만약 내가 던파 인게임 아바타 파츠를 이용해서 원하는 룩을 꾸미고 싶은 유저라면 1번,

이미지 생성 모델을 이용해서 실제 쓸 수 있는 아바타 파츠를 만들어내고 싶은 개발자라면 2번이었겠지만,

둘 다 단순히 이미지 1장이 아니라 파츠별로 이미지를 생성해내는 작업이 필요하고,

그렇게 파츠별 이미지를 생성해내는 건 통짜 이미지를 만들어내는 것보다

더 정교한 모델 설계 및 많은 학습량이 필요한 일이기 때문에,

둘 다 할 수 없는 현재로써는 3번 방법을 선택하기로 했다.

 

3. 진행 과정 

 

학습 파라미터 범위

 

rank: 16~1024

image resolution: 256, 512, 1024

learning rate: 1e-4

 

 

1) DreamBooth 방법 사용

학습을 시작하기로 했을 때, 제일 처음 한 건

'최소한의 이미지로 좋은 효과를 볼 수 있는 학습 방법 찾기'였다.

어쨌든 나는 개인용 GPU 1장을 사용해서 학습하고 있었고,

최소한의 이미지로 효과를 볼 수 있다는 것은 학습량, 즉 컴퓨팅 파워를 최소화할 수 있다는 뜻이니까 말이다.

그렇게 찾은 방법이 DreamBooth였다.

 

다만 DreamBooth의 목적은 최소한의 이미지로 특정 대상을 추가로 학습하는 것이고,

따라서 아예 스타일을 바꾸는 것이 목적인 내 학습 목표에 잘 맞을지는 의문이었으나,

일단 학습 시간이 적다면 첫 iteration으로 간단하게 해보기도 좋고,

마침 diffusers 라이브러리에 dreambooth + sd3 + lora 조합으로 학습 가능한 코드가 있어서

그걸로 테스트 해보기로 했다.

 

황천의 뒤틀린 오징어튀김과 새우튀김

 

그리고 처음으로 나온, 그래도 사람 실루엣처럼 생긴 무언가...이다.

황천의 뒤틀린 튀김이라고 이름을 붙였다.

 

밑에서 추가적으로 적겠지만, 실패의 원인은 결과적으로는 너무 방대한 학습 데이터셋을 사용한 것이 원인이었고,

따라서 학습량의 부족이라고 할 수 있다.

 

 

2) 일반적인 학습 방법 사용

DreamBooth의 실패를 뒤로하고, 그냥 일반적인 학습 방법으로 돌아왔다.

 

그런데 그렇게 해도 학습이 잘 안 되서 결국 금단의 조치를 취했는데,

바로 데이터셋에 사용되는 애니메이션 스프라이트를 한 장으로 제한한 것이다.

 

위에서 썼다시피 던파는 애니메이션을 이미지 연속 재생으로 구현하고 있고,

따라서 직업당 150~200장 내외의 애니메이션 스프라이트가 있는데,

이 중 내가 선택한 남프리스트의 경우 총 197장의 스프라이트가 있다.

 

남프리스트 기본 아바타의 애니메이션

 

지금까지는 이 197장을 전부 학습에 이용하고 있었는데,

이 중 첫 번째 스프라이트, 즉 스탠딩 포즈에 해당하는 이미지만 사용해서 학습을 하기로 한 것이다.

이렇게 한 이유는 당연히 이미지에 일관성이 있으면 학습하기 더 용이할 것이라고 생각했기 때문이다.

 

결국 근본적인 이유는 학습량 부족일 것이라고 생각하긴 했으나,

어찌됐든 컴퓨팅 파워의 한계로 시간 효율을 따져야했고,

따라서 결과물이 빨리 눈에 보이는 방식을 택하기로 했다.

 

256x256 결과물

 

256 해상도 학습을 제일 처음으로 해봤는데,

보다시피 결과물이 잘 안 나왔다.

 

일단 포즈와 체형은 학습이 되긴 했는데,

얼굴이 아예 뭉재져서 제대로 표현이 안 되고,

IP 캐릭터의 특징도 색깔이나 큰 특징은 잡아주지만 디테일은 잡아주지 못한다.

 

512x512 결과물

 

1024x1024 결과물

그에 비해 512나 1024는 볼만하게 나왔다.

캐릭터의 얼굴 묘사가 알아볼만은 하고, 특정 IP 캐릭터의 특징 또한 잘 알아볼 수 있게 표현됐다.

따라서 처음에 DreamBooth 학습 시 황천의 뒤틀린 오징어튀김이 나온 이유 역시

이렇게 데이터셋을 제한하지 않은 것이 원인으로 밝혀졌다.

물론 저 결과물들도 이상한 부분이 있고, 모든 결과물이 이런 식으로 볼만하게 나오는 것도 아니고

열 몇 장씩 생성하고 그 중에 가장 잘 나온 것을 선택한 거지만,

어쨌든 그래도 납득할만한 결과물이 나온다는 것이 중요한 것이다.

 

그리고 당연하다면 당연한 거긴 한데,

학습에 사용한 해상도와 맞는 output을 뽑아내야 결과물이 잘 뽑혔다.

512로 학습했으면 512, 1024로 학습했으면 1024로 출력해야 품질이 좋게 나왔다는 뜻이다.

일종의 해상도와 관련된 overfitting이 아닌가 싶긴 한데,

당장 해결할 수 있는 문제도 아니고 어쨌든 결과물이 나오긴 하니 그냥 넘어가기로 했다.

 

3) 다시 DreamBooth 테스트

 

단일 스프라이트로만 학습하면 결과가 잘 나온다는 것을 알게 됐으니,

DreamBooth도 해당 방식으로 한 번 더 학습해보았다.

1024x1024 결과물

 

그리고 결과는 참 미묘했다.
보다시피 학습이 되긴 되는데, 미묘하게 포즈와 체격이 달라졌다.

 

일반적인 학습 방법으로 했을 때는 체형도 비슷하고 포즈도 비슷한 걸로 보아,
DreamBooth를 원래 목적이 아닌 것을 위해 썼을 때 생기는 단점 같은 것이라고 생각하지만
애초에 원래 목적인 아닌 곳에 사용한 이상 딱히 할 수 있는 말은 없다.

 

4. 결과

1) 정리

별다른 특수 학습 방법 없이 일반적인 LoRA 학습으로 진행을 했다.

rank는 너무 낮게만 하지 않으면 큰 차이가 없었고,

품질이 제일 높았던 경우는 학습 이미지를 1024로 사용했을 때였다.

위의 예시에서도 256짜리가 퀄리티가 제일 낮았고, 1024가 제일 좋았다.

 

따라서, 원래 목적인 '일반적인 프롬프트를 입력해서 던파 아바타 스타일 이미지 생성하기'는 일단은 성공했다고 생각한다.

물론 내가 세상 모든 존재하는 프롬프트를 넣어본 것은 아니지만,

그래도 타 IP 캐릭터를 프롬프트로 넣을을 때 성공적으로 던파 아바타 스타일로 생성하는 것을 보면,

그래도 기본적인 생성은 되는 것이니 말이다.

 

2) 한계점

1. 얼굴 표현

원체 이미지 사이즈 자체도 작지만 거기서 더더욱 작은 얼굴 부분이라 그런지, 얼굴 묘사가 제대로 되지 않는 경우가 많았다.

던파 아바타는 기본적으로 측면을 향해 서있는 형태고, 따라서 얼굴도 측면을 바라보고 있는데,

생성된 이미지의 경우 정면에 가깝게 바라보고 있는 경우가 많았다.

caption에 얼굴이 바라보고 있는 방향을 지정하면 좀 더 나아지지 않을까 싶은 생각이 든다.

순서대로 256, 512, 1024. 작게 보면 비슷해 보이긴 하지만, 256은 제대로 얼굴이 생성되는 경우가 없고, 512나 1024는 그나마 알아볼 수 있다
원본 학습 이미지와 비교해보자

 

2. 배경

기본적으로 배경이 없는 이미지로 학습을 진행했고, 생성 프롬프트에도 배경이 없을 것을 요청으로 넣었다.

근데 자꾸 어디선가 배경이 같이 생성되는 경우가 있다.

생성형 AI 특성상 모든 것을 완벽하게 컨트롤 할 수 없다는 건 알지만,

그래도 납득이 안 가는 것은 안 가는 것이다.

 

3. 포즈

스탠딩 포즈만으로 학습하기로 결정했을 때부터 예측한 거긴 하지만,

다양한 포즈를 생성해내기는 매우 힘들었다.

앉거나, 뛰거나, 점프하거나, 눕거나 등의 포즈를 요구해봤지만,

전부 기본 스탠딩 포즈로만 생성이 됐다.

 

타 IP 캐릭터의 특징이 덧씌워지는 것을 보면 사람의 체형이라는 것은 학습한 거 같은데,

아직 포즈까진 제대로 학습이 안 됐나 싶다.

 

 

3) 추가 목표

추가로 노려볼 수 있는 건 크게 세 가지이다.

하나는 모든 직업의 학습, 두 번째는 모든 애니메이션 스프라이트의 학습,

마지막으로 무기의 학습이다.

 

던파에는 총 15가지 기본 직업이 있고, 모든 직업은 생김새가 다르다.

이번 학습에서는 단일 직업조차도 제대로 학습이 안 되서 스탠딩 포즈로 제한했지만,

어쨌든 이론상의 최종 목표는 모든 직업의 모든 애니메이션 스프라이트의 학습이다.

 

무기의 경우 아바타와 비슷하다.

무기별로 애니메이션 스프라이트가 있고, 캐릭터의 애니메이션에 맞춰서 무기 또한 스프라이트가 달라진다.

따라서 무기를 추가하는 건 그닥 어려운 작업은 아니지만, 어쨌든 무기가 캐릭터 이미지보다 앞에 표시되기 때문에

캐릭터 이미지 학습에 방해가 될 것 같아서 이번엔 배제했다.

 

4) 품질 개선 방법

 

output 품질을 개선할 수 있는 방법은 무궁히 많다.

 

1. 데이터 품질

먼저 데이터의 품질이 있다.

어차피 다 던파 아바타 이미지인데 무슨 품질? 이라고 생각할 수 있지만,

이미지가 아니라 caption, 즉 태깅의 품질을 높일 수 있다.

 

현재 caption은 프레임 정보를 제외하고는 모든 이미지가 동일하게 들어가고 있고,

따라서 스탠딩 프레임 1개만으로 학습한 최종 세팅에서는 모든 이미지가 caption이 동일한 상태이다.

여기에 만약 각 아바타 파츠의 이름을 가져와서 태그에 넣을 수 있다면, 어느 정도 도움이 됐을 것이다.

 

예를 들어 '산타 모자'라는 이름을 가진 아바타가 있고 이 정보를 caption에 넣었다면,

해당 아바타 파츠를 학습에 사용했을 때 '산타', '모자'라는 정보가 추가로 학습됐을거고,

이는 output 품질 상승에 당연히 도움이 됐을 것이다.

이걸 하지 못한 이유는, 내가 추출한 데이터는 이미지 관련 데이터 뿐이고, 아바타 이름은 게임 텍스트 쪽 데이터인데,

게임 텍스트 쪽 데이터는 추출하지 못했기 때문이다.

 

또, 추가적으로 커뮤니티발 코스프레 아바타를 가져와서 caption을 추가 할 수도 있다.

아이언맨 코스프레가 있다고 하면, 해당 아바타의 파츠들을 가져와서 학습용 데이터를 생성한 후,

해당 이미지 caption에는 ironman을 추가하는 식.

이 방식을 사용하지 못한 이유도 위와 같다.

유저들이 코스프레한 아바타 파츠 이름은 한국어로 적혀있는데,

나는 그 데이터와 아바타 이미지 데이터를 매칭시킬 수 있는 방법이 없었다.

 

2. base 모델 최신화

더 크고 더 최신인 base 모델을 사용하는 방법도 있다.

당장 같은 계열인 sd3.5 large도 있고, flux2 dev나 z-image도 있다.

어느 쪽이든 sd3.5 medium보단 같거나 더 좋은 결과를 냈을 거라고 예상해 볼 수 있다.

 

3. 학습량 및 컴퓨팅 파워 증대

학습량을 늘리는 것도 당연히 유효한 방법이다.

현재 최종 결과를 단일 직업의 스탠딩 포즈로만 학습할 수 있던 이유로 추측되는 것이 학습량 부족인데,

만약 학습량을 월등히 늘릴 수 있었다면,

다양한 직업에 다양한 포즈로 학습이 가능했을 것이라고 생각한다.

 

4. 학습 해상도 다변화

다양한 해상도로 학습하는 것도 방법이 될 수 있다.

sd3.5 medium의 경우 256 → 512 → 768 → 1024 → 1440 식으로 해상도를 점차 늘려가며 학습하고,

마지막 단계에서는 여러 해상도를 섞어서 학습했다고 나온다.

이유까지는 모르겠지만, 어쨌든 원본 모델도 여러 해상도를 학습시켰다는 뜻이니,

추가 학습을 진행하는 내 입장에서도 선택할 만한 방법일 것이다.

 

 

 

데이터 품질의 경우 데이터 언팩킹을 못해서 어쩔 수 없이 못 한 부분이라고 치면,

나머지 세 가지 이유의 경우 개인용 GPU의 컴퓨팅 파워의 부족이 원인이니,

결국 RTX 5090을 4장씩 달지 못한 내 지갑 사정을 원망할 뿐이다.

 

 

 

P.S. 이 글을 한창 쓰고 있던 와중에 Flux 2 klein 모델이 공개됐는데, 이 쪽도 4B 모델은 상당히 가볍기 때문에

개인용 GPU에서 테스트 할 수 있을 것으로 보이니, 테스트 해 볼 예정이다.

 

블로그 이미지

클라리넷

카테고리

Vie (2)
(0)
C++ (0)
게임 개발 (0)
게임하기 (0)
엔진 (0)
전자기기 (1)
Deep Learning (1)