--------잡설--------


일단 이번껀 lora로 뽑았을때 3D 느낌이 나지 않게 하는게 목표였고


해당 목표를 달성한거 같아서 드디어 글씀


3D 스크린샷을 2D 이미지로 바꾸는 과정이 정신나갈거 같더라




--------주의사항--------


방법 설명에 앞서서 알아줬으면 하는 사항




1. 해당 방법은 절대로 최선의 방법은 아닐것


그래도 "이렇게 하면 이정도까지는 가능하더라" 를 공유하고자 해서 글씀


이미지에 블러를 먹일 필요가 없었을지도 모르고


멀티컨트롤넷을 사용할 필요가 없었던걸지도 모르고


애초에 3D 스크린샷 그 자체로 학습 시켜서 2D캐릭터를 그려내는 lora가 가능했을지도 모름


하지만 나는 다 실패하고 마지막으로 성공한게 이번 방법임.


그러므로 내가 시도했던 방법을 있는 그대로 서술하고자 함.


즉 비효율적이고 필요 없는 행동도 다 적어놓을것임. 혹시 모르니깐.




2. 이하 사전지식을 충분히 알고있어야 좋음


1) 프롬프트 관련 지식

    img2img를 돌릴때 원하는 형태 및 색이 나오도록 프롬프트로 차력쇼 해야 할수도 있음.


2) img2img에 대한 지식

    https://arca.live/b/aiart/69557695

    https://arca.live/b/aiart/69613226

    twitter.com/AI_Illust_000/status/1624016367589679104

    특히 마지막 링크의 경우를 비슷하게 나마 구현하기위해서 이미지에 블러를 먹인다거나 했음.

    위 3개 링크에 대해선 몰라도 문제 없을지도 모름.

    하지만 img2img를 무진장 돌려야 하는 이 방법의 특성상 img2img를 잘 써야 하는건 맞는듯.


3) lora 학습에서 학습 파라미터에 대한 지식

    그야 lora 만드는 과정이니까 관련 지식이 충분하면 좋음.


4) lora 학습에 사용되는 데이터 정제에 대한 지식

    이 지식이 없어서 그런지 내가 만든건 특정 자세를 그리려고 하는 경향과,

    배경이 약간 심플하게 되어버리는 경향이 있는 lora가 만들어졌음

    학습에 사용될 스크린샷을 어떤식으로 찍어야할지 알아야 더 좋은 lora가 나올것으로 보임.


5) 코이카츠에 대한 지식 및 코이카츠 스튜디오에 대한 지식

    이거로 캐릭터 프리셋을 만들어야 하니까

    촬영할 씬 카드를 고르거나 만들어야하고, 스크린샷을 찍어야 함.



있으면 좋은것 : 프로그래밍 지식

    python으로 이미지 처리하면 편하다. 물론 코드를 작성 완료한 후에만




3. 2D 그림이 나오긴 하는 캐릭터라면 그 그림 쓰자

    애초에 코이카츠 스샷으로 학습한다는 발상 자체가 아마

    2D 그림이 너무 적어서 그런거일거 같으니 더 말리지는 않겠음






--------왜 했음?--------


위가 3D 스크린샷 그대로 학습한것

밑은 2D로 변환한 이미지로 학습한것





Lora3D 10에포크.pngLora3D 20에포크.png
Lora2D 10에포크.pngLora2D 20에포크.pngLora2D 30에포크.png


위가 3D 스크린샷 그대로 학습한것

밑은 2D로 변환한 이미지로 학습한것



3D쪽의 얼굴 모양이랑 눈모양이랑 이목구비 형태가 

너무 코이카츠 느낌이 녹아들어있는거랑

머리카락이 플라스틱 레고처럼 느껴지는거랑

그림에 유연성이 모자란거

이런 단점들이 싫어서 시도했음





--------했었던 과정--------


--코이카츠 부분 시작--

참고 : 설치 관련은 전부 스킵한다. 코이카츠 하던놈들용 설명이니 이해해줘.


1. 코이카츠로 프리셋을 제작하기 or 다운로드해서 받기

    자작캐릭터 lora를 원한다면, 해당 캐릭터를 코이카츠 캐릭터로 직접 만들어야 함

    혹시 캐릭터 프리셋이 존재한다면 그거로 써도 됨

    캐릭터 프리셋 만드는법은 생략한다. 여긴 코이카츠챈이 아니다.



2. 코이카츠 스튜디오에서 사용할 신 다운로드 받기 or 만들기

    [게임아님.png]

    이번엔 이거다.


    배경이 필요하다면 알아서 씬카드를 받아오던가, 기본 내장된 배경을 활용하던가, 카메라 배치를 생각하던가 해보자.

    내가 할땐 배경 없이 포즈만 취했었으니 그냥 켰음



3. 코이카츠 스튜디오에서 스크린샷 기능을 이용하여 스크린샷을 찍자

    일단 방금 만든 캐릭터를 불러오고 의상을 의도한것으로 변경함.




    F1을 눌러서 플러그인을 키고 screenshot manager를 찾는다



    여기서 중요한 값들은 빨간네모 친 부분이다.

    스크린샷의 해상도 변경이 가능하고, 

    뒤에 배경 없이 단색일때 그걸 단색으로 찍어줄지, 투명으로 찍어줄지 여부

    그리고 설정된 단축키를 볼수있다.



    좌측같은 화면에서 F11로 스샷을 찍으니 우측처럼 나옴

    UI를 알아서 제외하고 찍어줌



    [불투명배경.png] , [투명배경.png]

    [배경있는경우 불투명배경.png] , [배경있는경우 투명배경.png]

    참고로 "Transparency in rendered screenshots"를 체크를 풀고 찍으면 배경색으로 설정되어있는 단색이 같이 찍히고

    체크를 하고 찍으면 투명배경으로 나옴

    하지만 맵을 지정하고 찍으면 그냥 맵도 같이 찍힘.

    



    이번에 할땐 그냥 배경 없이 포즈랑 카메라 위치만 가지고 

    해상도는 1440*2560으로 세로로길게 여러장 찍었음

    짤들은 그 투명배경 뒤에 흰색 배경을 덧붙인거


--코이카츠 부분 끝--





--학습 데이터 정제 1차 시작--


나는 python으로 코드를 짜서 이미지들을 처리함. 

일부 블러 먹이는 과정은 gimp로 했음.

투명 배경에서 나온 이미지들은 이하와 같음


1. 해상도 변경없이 흰색 배경이 된 이미지 

    (이후 img2img에서 2D로 변환할때 사용할 대상)

    저 위에 있는 28장 이미지들임


1-1. 해상도 변경없이 흰색 배경이 된 이미지에 블러를 10 먹인 이미지

    100% 필요한지는 모르지만 나는 사용했음.    

    난 gimp 사용자라서 gimp 기준으로 흐리게를 10만큼 줬음. 아마 더 크게 줘도 될듯

    (이후 img2img에서 2D로 변환할때 사용할 대상)

    해당 이미지를 사용하는 사유 : 

    https://arca.live/b/aiart/69557695

    https://arca.live/b/aiart/69613226

    twitter.com/AI_Illust_000/status/1624016367589679104

위 글의 기법에 멀티컨트롤넷을 활용하여 0.99의 디노이즈를 활용하면서 형태를 유지시키 위함임



2. 해상도 변경된 흰색 배경 이미지 (7장만 올림. 전체는 28장)

    (lora 1차에 사용될 학습이미지)


--학습 데이터 정제 1차 끝--





--lora 학습 1차 시작--


tagset은 tagger를 사용해서 모든 학습데이터에 달아줌

해당 태그 데이터는 lora학습과 img2img에서 사용된다.

    여담으로 이번 스크린샷을 넣고 태그분석 시켜보면

    virtual youtuber, ponytail, star hair ornament 같이 해당사항 없는 태그까지 줄줄이 달아줌

    그런거 직접 솎아내야 하더라. 

    Exclude tags에 "virtual_youtuber,ponytail,star_hair_ornament" 라고 넣고 제외 시켜가면서 버릴태그 버렸음

    virtual youtuber 태그는 그래도 이해는 함. 의도하고 그런느낌으로 만든 캐릭터긴 해서 맞긴한데... 어... 음...


3D캐릭터가 찍힌 스크린샷으로 만든 데이터셋으로 lora 학습을 돌린다

    파라미터는 알아서 잘 찾자 내가 뭐라 답을 못준다 나도 어려워

    일단 내가 마지막으로 정착한 값은 다음과 같음.

    학습용 모델 : animefull-final-pruned.ckpt

    Train batch size : 3

    Epoch : 20

    Repeats : 10

    정규화 이미지 Repeats : 1


    Learning rate : 2e-6

    Text Encoder learning rate : 5e-5

    Unet learning rate : 2e-4

    LR Scheduler : cosine_with_restarts

    Optimizer : AdamW8bit

        Lion안써요? : 네. 최선을 다해도 흰색 옆머리를 안그려주더라구요.

        Text Encoder learning rate를 4e-6으로 주고, 

        Unet learning rate를 7e-5로 주고 돌렸는데 흰색 옆머리만 안그려줘서 포기함

        20에포크까지 돌렸는데도 그러는거 보면 아마 안될듯. 걍 AdamW8bit 쓸렵니다.


    Network Rank (Dimension) : 128

    Network Alpha : 64

    Max resolution : 768,768

    Gradient checkpointing : 체크함

    Shuffle caption : 체크함

    Use xformers : 체크함

    Max train epoch : 20(위에 에포크 숫자랑 같은 값 넣는 편)


    학습에 사용된 이미지 장수 : 28장

    정규화 이미지 : 1_1girl 1000장 (실제로는 280장만 적용됨)

    


목표는 3D 느낌이 나는 lora가 되더라도, 형태와 색을 잘 알아먹는 수준까지 학습시킴

여기서 만든 lora를 lora_3D 라고 부르겠음

[lora_3D로 테스트한 결과물.png]

lora_3D의 10에포크를 가지고 다음 과정으로 넘어감.


--lora 학습 1차 끝--




    ----img2img 과정 요약----

원본 디노이징0.99로 형태 재구성

    참고로 lora_3D의 10에포크를 가지고 해보면 이런식으로 나오고



    거기에 다시 img2img를 돌리면 이렇게 색상을 다시 조절 가능하다

    특히 귀쪽과 헤어의 톤을 잘 보면 알수있다.

    


    이건 7th anime로 다른 포즈를 2D로 변환한 경우다.

    제일 우측이 디노이징 0.99로 뽑은 이미지고, 컨트롤넷에 적용한 그림이다.

    디노이징 0.6의 결과물의 컬러감과

    제일 우측의 컬러감을 비교해보면 차이가 있을것이다.


이걸 28장 전부 할수있는만큼 한다

    ----과정요약 끝----




--img2img로 3D 스크린샷을 2D 그림으로 변환하기 1차 (형태 위주) 시작--



모델은 2D 모델을 이것저것 전부 가져와서 사용한다.

사용한 모델은 7th, abysshell, abyssmaple,aom2,aom3,aom3a1 그외 civitai에서 올라온 2D 모델들 이것저것을 사용함


학습 데이터 정제 1차에서 만든 이하 이미지들을 가져옴

1. 해상도 변경없이 흰색 배경이 된 이미지

    이건 멀티 컨트롤넷에 넣어준다.

2. 해상도 변경없이 흰색 배경이 된 이미지에 블러를 10 먹인 이미지

    이걸 img2img 의 이미지로 사용한다.


참고로 위에 예시에서 사용한 lora랑 밑에서 사용한 lora가 다른데

밑에꺼는 참고로 Lion으로 삽질하다 나온 lora임

하지만 위에 과정요약의 예시처럼 해도 충분히 가능할테니 밑에 빨간색으로 해놓은 lora 그대로 설명을 이어가도록 하겠음.


<lora:mynekochan_0006-3_1e-5_5e-6_8e-5-000010:0.6>,masterpiece, best quality (2D:1.4),(beautiful detailed face:1.2),1girl, solo, short blue hair, white side hair, blue eyes, shirt, butterfly hair ornament, black shorts, shorts, white shirt, white background, cat ears, simple background, short shorts, hand on hip, short sleeves

Negative prompt: (worst quality, low quality:1.4),monochrome,(3D:1.4),(realistic:1.0)

Steps: 20, Sampler: DPM++ 2M Karras, CFG scale: 30, Seed: 116072793, Size: 1152x2048, Model hash: c330a60ddc, Model: 7th_anime_v3_A, Denoising strength: 0.99, Clip skip: 2, Mask blur: 4, ControlNet-0 Enabled: True, ControlNet-0 Module: canny, ControlNet-0 Model: controlnetPreTrained_cannyV10 [e3fe7712], ControlNet-0 Weight: 0.3, ControlNet-0 Guidance Start: 0, ControlNet-0 Guidance End: 1, ControlNet-1 Enabled: True, ControlNet-1 Module: hed, ControlNet-1 Model: controlnetPreTrained_hedV10 [13fee50b], ControlNet-1 Weight: 0.3, ControlNet-1 Guidance Start: 0, ControlNet-1 Guidance End: 1, Dynamic thresholding enabled: True, Mimic scale: 10, Threshold percentile: 100, Mimic mode: Half Cosine Up, Mimic scale minimum: 3, CFG mode: Half Cosine Up, CFG scale minimum: 3


대략 이런식으로 돌렸다


lora_3D는 가중치를 낮춰서 사용

    1.0으로 사용해버리면 3D가 되어버리니 0.6정도로 가중치를 낮춰서 사용

변환할 이미지에 맞는 tag도 가져와서 프롬프트에 넣고

네거티브와 프롬프트를 더 추가하고 붙이고 뺄껀 빼서 2D 느낌이 나도록 이미지를 생성함


목표는 "2D 이미지같은 형태" 다. 제일 중요한 2D 그림다운 형태를 잡는 것이 목표

사실상 여기가 차력쇼 구간임. 프롬프트,네거티브,컨트롤넷 웨이트,디노이징 값으로 최대한 컨트롤해야함


추천하는 프롬프트 : (best quality 2D:1.4), 각각의 이미지의 tag들

추천하는 네거티브 : 평소 사용하던 네거티브, 3D, realistic

컨트롤넷 추천 : canny와 hed

컨트롤넷 웨이트 추천 : 0.3~0.4 언저리

    0.2 수준으로 내려가면 형태가 완전 딴판인 그림이 나오고, (or 인체가 망가짐)

    0.4~0.6 쪽으로 올라가면 형태가 3D때 형태 그대로 나오는 경향이 있더라.

    0.3 정도가 비슷한 형태인데 다른 느낌으로 다시 잡아줌

디노이징 추천 : 0.9~0.99

    Lora가 animefull 모델 기준으로 이미 답을 외운 상태일것이고

    컨트롤넷으로 정답까지 알려준 상태이므로

    디노이징을 높게 줘도 잘 복원해준다.

    단 타율은 낮다. (대략 높아봐야 20%)


모든 이미지를 돌린 결과는 이렇다.
참고로 중간중간 3D 스크린샷 그대로 집어넣은 경우가 있는데
마음에 드는 형태가 안나와서 포기한 케이스다.

    

--img2img로 3D 스크린샷을 2D 그림으로 변환하기 1차 끝--





--img2img로 3D 스크린샷을 2D 그림으로 변환하기 배경제거 + 그외 수정 시작--

https://arca.live/b/aiart/71494133 이거 썼음

webui에 있는 확장기능도 써봤는데

쓰고나면 img2img 마저 할때 vram 모자르다고 갑자기 터지기 시작하더라

그래서 webui랑 분리되어있는거로 써야했었음.


다른거 써도됨. 1차에서 변환한거에서 캐릭터만 따오는 용도고

높은 디노이징으로인해 배경이 영향받아서 노이즈가 꼈을것인데. 그거 제거하는 용도임.

그리고 팔꿈치에 손가락이 생겼다던가 옷이랑 팔이랑 일체화 되었다던가 하는것들은 직접 수정하면 됨.

gimp로 직접 수정할수있는것들만 수정했고. 직접 수정 못하는건 애초에 버리고 다시 뽑았음.

배경 제거된 이미지들 7장이다.

28장 전부 배경을 제거했다.


--img2img로 3D 스크린샷을 2D 그림으로 변환하기 ABG Remover GUI 0.0.2 끝--






--img2img로 3D 스크린샷을 2D 그림으로 변환하기 2차 (형태 위주) 시작--


1. 위에서 배경을 제거한 2D변환된 이미지

    이건 멀티 컨트롤넷에 넣어준다.

2. 해상도 변경없이 흰색 배경이 된 이미지에 블러를 10 먹인 이미지

    이걸 img2img 의 이미지로 사용한다.


<lora:mynekochan_0006-3_1e-5_5e-6_8e-5-000010:0.6>,masterpiece, best quality (2D:1.4),1girl, solo, short blue hair, white side hair, shirt, from behind, white shirt, shorts, white background, simple background, cat ears, black shorts, ass, short sleeves, thigh gap, ahoge

Negative prompt: (worst quality, low quality:1.4),monochrome,(3D:1.4),(realistic:1.0)

Steps: 20, Sampler: DPM++ 2M Karras, CFG scale: 7, Seed: 3072536556, Size: 1152x2048, Model hash: ce4b9ee0d3, Model: magicalmix_v20, Denoising strength: 0.7, Clip skip: 2, Mask blur: 4, ControlNet-0 Enabled: True, ControlNet-0 Module: canny, ControlNet-0 Model: controlnetPreTrained_cannyV10 [e3fe7712], ControlNet-0 Weight: 0.3, ControlNet-0 Guidance Start: 0, ControlNet-0 Guidance End: 1, ControlNet-1 Enabled: True, ControlNet-1 Module: hed, ControlNet-1 Model: controlnetPreTrained_hedV10 [13fee50b], ControlNet-1 Weight: 0.3, ControlNet-1 Guidance Start: 0, ControlNet-1 Guidance End: 1

대략 이런식으로 돌렸다


결과물    

3D 캐릭터 스크린샷 원본2D로 변환하고 배경 제거한것블러를 10 먹인 이미지색상을 빼온 결과물

그냥 3D 그대로 씀
즉 좌우 이미지가 같음

실패

실패

실패



디노이즈 0.6~0.8 사이에서 돌림

종종 형태가 너무 변하는 경우는 0.5로 돌리기도 했음

종종 여기서 이상한 형태가 나오는 경우등이 있는데

컨트롤넷에 전해주는 이미지는 형태만 사용할것이기에

canny나 hed에 요상하게 인식이 되는 구간이 존재한다면

그부분을 블러를 먹이거나 손가락툴로 문질러서 흐리게 만들거나 브러쉬로 잘 칠해보는 방식으로 처리가 가능함


팔꿈치 보면 단순해진것을 볼수있을건데

저런 부분들이 문제가 되던데, 저정도 퀄로 처리해도 됨. 어짜피 컨트롤넷으로만 전달 할거라서 충분함


--img2img로 3D 스크린샷을 2D 그림으로 변환하기 2차 끝--






--학습 데이터 정제 2차 시작--


위에서 만든거를 학습 데이터에 맞게 다시 정제하기
배경 더러우면 ABG 다시 넣어서 배경 제거하고 뒤에 다시 흰색으로 깔아주고

뭐 잘 자르고 리사이징하고 등등해서
학습데이터로 다시 맞춰내기



1440*2560
1440*2560
1440*2560
1440*2560
1440*2560
1440*2560
1440*2560

512*1152512*1152576*1024384*1536384*1536384*1536448*1280


위가 정제 전(28장 중에서 7장)

밑에가 정제후(28장 중에서 7장)

참고로 표 배경색을 회색으로 깔아놓은거고

흰색 네모 부분은 이미지에 실제로 존재하는 부분임. 참고 하라고 저렇게 해놓음.


참고로 처리한 과정은

1. abg로 배경 날리고

2. [python으로 처리함] 배경이 투명한 이미지를 상하좌우 공백 제거

3. [python으로 처리함] 공백이 제거된 배경이 투명한 이미지를 학습에 적절한 해상도로 변경

4. [python으로 처리함] 흰색 배경 추가


--학습 데이터 정제 2차 끝--





--lora 학습 2차 시작--


방금 나온 따끈따끈한 2D로 변환된 이미지로 학습시키기

이렇게 나온 lora로 뽑은게 밑에쪽이다


<lora:mynekochan_0012_2e-6_5e-5_2e-4_yesreg_yestag-000010:1.0>, (short blue hair, white side hair, blue eyes, butterfly hair ornament, cat ears,1girl:1.0),best quality (2D:1.0),masterpiece,very beautiful happy smile,upper body,sit on wooden chair,cafe,(paper cup coffee:1.0),perfect wooden table,perfect open hand with Palm,perfect very detailed inside of cafe,sun light on face,best quality scenery official wallpaper ,terrace,(perfect beautiful sky:1.2)
Negative prompt: (worst quality, low quality:1.4),(monochrome:1.2),(3D:1.0),(realistic:1.0),(simple:1.2)
Steps: 20, Sampler: DPM++ 2M Karras, CFG scale: 18, Seed: 870630836, Size: 576x1024, Model hash: d124fc18f0, Model: AOM3, Denoising strength: 0.4, Clip skip: 2, Hires upscale: 2, Hires upscaler: 4x-AnimeSharp, Dynamic thresholding enabled: True, Mimic scale: 10, Threshold percentile: 100, Mimic mode: Half Cosine Up, Mimic scale minimum: 3, CFG mode: Half Cosine Up, CFG scale minimum: 3
<lora:mynekochan_0012_2e-6_5e-5_2e-4_yesreg_yestag-000020:1.0>, (short blue hair, white side hair, blue eyes, butterfly hair ornament, cat ears,1girl:1.0),best quality (2D:1.0),masterpiece,very beautiful happy smile,upper body,sit on wooden chair,cafe,(paper cup coffee:1.0),perfect wooden table,perfect open hand with Palm,perfect very detailed inside of cafe,sun light on face,best quality scenery official wallpaper ,terrace,(perfect beautiful sky:1.2)
Negative prompt: (worst quality, low quality:1.4),(monochrome:1.2),(3D:1.0),(realistic:1.0),(simple:1.2)
Steps: 20, Sampler: DPM++ 2M Karras, CFG scale: 18, Seed: 870630836, Size: 576x1024, Model hash: d124fc18f0, Model: AOM3, Denoising strength: 0.4, Clip skip: 2, Hires upscale: 2, Hires upscaler: 4x-AnimeSharp, Dynamic thresholding enabled: True, Mimic scale: 10, Threshold percentile: 100, Mimic mode: Half Cosine Up, Mimic scale minimum: 3, CFG mode: Half Cosine Up, CFG scale minimum: 3

<lora:mynekochan_0012_2e-6_5e-5_2e-4_yesreg_yestag-000030:1.0>, (short blue hair, white side hair, blue eyes, butterfly hair ornament, cat ears,1girl:1.0),best quality (2D:1.0),masterpiece,very beautiful happy smile,upper body,sit on wooden chair,cafe,(paper cup coffee:1.0),perfect wooden table,perfect open hand with Palm,perfect very detailed inside of cafe,sun light on face,best quality scenery official wallpaper ,terrace,(perfect beautiful sky:1.2)
Negative prompt: (worst quality, low quality:1.4),(monochrome:1.2),(3D:1.0),(realistic:1.0),(simple:1.2)
Steps: 20, Sampler: DPM++ 2M Karras, CFG scale: 18, Seed: 870630836, Size: 576x1024, Model hash: d124fc18f0, Model: AOM3, Denoising strength: 0.4, Clip skip: 2, Hires upscale: 2, Hires upscaler: 4x-AnimeSharp, Dynamic thresholding enabled: True, Mimic scale: 10, Threshold percentile: 100, Mimic mode: Half Cosine Up, Mimic scale minimum: 3, CFG mode: Half Cosine Up, CFG scale minimum: 3 



--lora 학습 2차 끝--







--------여담--------

마지막에 lora 학습할때 태그를 내가 개같이 줬는데도 알아서 잘 뽑더라? 


솔직히 태그 어캐 줘야 할지 전혀 모르겠음

lora 학습 관련은 lora 정보글 보고 배우자. 

나같은경우 1girl,akg,그외 자세같은거에 관한 태그 만 줬는데

akg는 사실 akh라고 아무 뜻도 없는 태그로 넣으면 거기에 캐릭터 외형이 다 들어가지 않을까 해서 넣으려던건데

akg로 오타났더라? 허허허 어쩐지 헤드폰이 나오더라

근데도 캐릭터 잘 그려내는게 신기할따름임


빠진내용 없겠지?