먼저 이건 날림 학습이니 오류가 없다고는 말 못함. 학습 설정 방법은 여러가지가 있다보니 이에 따라서 알맞게 해도 됨.


1. 학습시킬 주제를 선택한다.

캐릭터를 학습하고자 한다면 해당 캐릭터 그림을 모으면 되고, 특정 작가의 화풍을 학습하고자 한다면 특정 작가의 그림을 모으면 된다. 


여기서는 간단하게 모바일 게임 캐릭터 카드 이미지를 사용할건데, 이렇게 화풍이 일정한 데이터를 사용하면 화풍까지 학습할 가능성이 있다. 하이퍼는 그나마 덜하지만 LoRA나 드림부스는 그럴 수 있으니 모델 자체의 화풍을 유지하기 원한다면 여러 화풍의 (여러 작가의) 이미지를 사용하는것이 좋다.


또한 캐릭터 이미지에서 벗어나거나 품질이 좋지 않거나 학습하기 어렵다고 생각되는 데이터는 과감하게 포기하는것이 좋다. 양 보다는 질.


데이터 수집이 끝나면 이렇게 모아둔 사진들의 폴더 위치를 기억해둔다. 여기서는 D:\dddd\train\toko 이다.


2. 초기 설정

먼저 설정 → Training에서 Move VAE and CLIP to RAM when training if possible. Saves VRAM. 을 선택하자.


그런 다음 stable-diffusion-webui-wd14-tagger 확장 기능을 설치한다.

확장 기능을 설치하는 방법을 모른다면 먼저 Extensions → Install from URL에서 https://github.com/toriato/stable-diffusion-webui-wd14-tagger 주소를 넣어준 다음 설치 버튼을 누르고 Extensions → Installed에 있는 Apply and restart UI를 누르면 된다.


3. 태그 달기

Tagger 라는것이 생기는데 대충 사진처럼 Batch form directory에서 사진들의 폴더 위치를 지정해두고 주황색 Interrogate 버튼을 누르면 된다.

모든것이 제대로 끝나면 이렇게 텍스트 파일들이 생긴다.


3. 학습 설정


먼저 하이퍼 파일을 생성해야한다.

이름은 하고싶은거 하면 되고


Modules은 잘 모르겠지만 그냥 기본값으로 하면 되고


Enter hypernetwork layer structure는 기본값으로 두는것을 추천. 


중간의 숫자가 클수록 파일 용량이 커지는데 파일 용량이 크면 좋은가에 대해서는 정확하지 않고 학습 속도에 영향을 주며 오히려 1, 0.1, 1이나 1, 0.05, 1이라는 극단적으로 작은 용량에서도 성공적인 하이퍼 학습이 가능하다는 보고도 있기에 나중에 어느정도 자신감이 붙으면 크고 작은 하이퍼 학습을 시도해보자. 1, 1 보다는 1, 0.1, 1 파일이 더 작고 1, 4, 1, 4, 1 같은 엄청 큰것도 가능하다. 크면 클수록 더 많은 VRAM이 요구된다.


Select activation function of hypernetwork는 Swish를 추천.


Add layer normalization도 잘 모르겠지만 나는 끄고 한다.


Use dropout는 도 잘 모르다보니 안해도 되지만 하고 싶다면 사용하도록 설정한 다음 사진처럼 0, 0.05, 0.15 해도 된다.


Overwrite Old Hypernetwork는 기존의 같은 이름의 하이퍼네트워크를 덮어쓰기 하는 옵션이다. 학습이 망해서 처음부터 다시 시작하는 경우 유용하다.


그런 다음 Create hypernetwork를 하면 파일이 생성된다.


그런 다음 Train→Train으로 들어간 다음 복잡한 설정이 기다리고 있다.


Hypernetwork - 학습할 하이퍼를 지정한다. 지정하기 전에 옆에 있는 새로고침 버튼을 누르고 지정해주자.


Hypernetwork Learning rate - 학습률 이라는 부분이다. 여러 선택지가 있지만 여기서는 날림 학습으로 0.00015:50, 0.0001:100, 0.00005:200, 0.000025:300, 0.00001:400, 0.000005:500, 0.00015:550, 0.0001:600, 0.00005:700, 0.000025:800, 0.00001:900, 0.000005:1000, 0.00015:1050, 0.0001:1100, 0.00005:1200, 0.000025:1300, 0.00001:1400, 0.000005:1500, 0.00015:1550, 0.0001:1600, 0.00005:1700, 0.000025:1800, 0.00001:1900, 0.000005:2000, 0.00015:2050, 0.0001:2100, 0.00005:2200, 0.000025:2300, 0.00001:2400, 0.000005:2500, 0.00015:2550, 0.0001:2600, 0.00005:2700, 0.000025:2800, 0.00001:2900, 0.000005:3000, 0.00015:3050, 0.0001:3100, 0.00005:3200, 0.000025:3300, 0.00001:3400, 0.000005:3500, 0.00015:3550, 0.0001:3600, 0.00005:3700, 0.000025:3800, 0.00001:3900, 0.000005:4000, 0.00015:4050, 0.0001:4100, 0.00005:4200, 0.000025:4300, 0.00001:4400, 0.000005:4500, 0.00015:4550, 0.0001:4600, 0.00005:4700, 0.000025:4800, 0.00001:4900, 0.000005:5000, 0.00015:5050, 0.0001:5100, 0.00005:5200, 0.000025:5300, 0.00001:5400, 0.000005:5500, 0.00015:5550, 0.0001:5600, 0.00005:5700, 0.000025:5800, 0.00001:5900, 0.000005:6000, 0.00015:6050, 0.0001:6100, 0.00005:6200, 0.000025:6300, 0.00001:6400, 0.000005:6500, 0.00015:6550, 0.0001:6600, 0.00005:6700, 0.000025:6800, 0.00001:6900, 0.000005:7000, 0.00015:7050, 0.0001:7100, 0.00005:7200, 0.000025:7300, 0.00001:7400, 0.000005:7500, 0.00015:7550, 0.0001:7600, 0.00005:7700, 0.000025:7800, 0.00001:7900, 0.000005:8000, 0.00015:8050, 0.0001:8100, 0.00005:8200, 0.000025:8300, 0.00001:8400, 0.000005:8500, 0.00015:8550, 0.0001:8600, 0.00005:8700, 0.000025:8800, 0.00001:8900, 0.000005:9000, 0.00015:9050, 0.0001:9100, 0.00005:9200, 0.000025:9300, 0.00001:9400, 0.000005:9500, 0.00015:9550, 0.0001:9600, 0.00005:9700, 0.000025:9800, 0.00001:9900, 0.000005:10000 을 그대로 넣어주면 된다. 


다른 학습률을 사용하고 싶다면 다른것을 사용해도 된다. 다만 다른 학습률을 사용하는 경우에는 아래에서 소개할 Max steps 설정도 변경해야한다. 정속 학습을 하는 경우에는 0.000005 처럼 넣어주면 된다. 스텝에 따른 변화를 주고 싶다면 학습률:적용할최대스텝 으로 0.00015:50, 0.0001:100은 0.00015 학습률을 50스텝 까지 적용한 다음 0.0001 학습률을 100스텝까지 적용한다는 의미이다.


Batch size는 한번에 어느정도의 학습을 동시에 진행할것인가의 의미이다. 더 높을수록 조금 더 빠른 학습이 가능해지지만 그만큼 더 많은 VRAM을 먹기에 보통은 1을 추천. Batch size를 2 이상 설정하는 경우 실제 학습 수는 Batch size × Max steps 이라서 그만큼 Max steps를 줄어야 한다.


Gradient Clipping하고 Gradient accumulation steps는 최근에 생긴 옵션인데 나도 잘 몰라서 생략하고 기본값으로.


Dataset directory에는 학습할 사진들이 있는 폴더 위치에 배정해주면 된다.


Log directory에는 백업 파일과 샘플 이미지가 생성된다. 그냥 두면 webui가 있는 위치에 생성된다.


Prompt template는 그림체를 학습하는 경우 style_filewords.txt 를 사용하고 캐릭터 같은 물체 같은것을 생성하는 경우 subject_filewords.txt를 사용하면 된다.


Max steps은 최대 학습 스텝을 설정한다. 여기서는 학습하고자 하는 이미지 수 x 100에서 500 단위의 올림으로 학습하면 되긴 하는데 정확한건 아니니 주의. 날림 학습 Learning rate는 최대 10000 스텝까지만 지원하는데 초과하는 경우에는 아마도 10000까지 해도 될듯.


다른 Hypernetwork Learning rate를 사용하는 경우에는 상황에 알맞게 변경하면 된다. 또한 Batch size를 2 이상 설정하는 경우 실제 학습 수는 Batch size × Max steps 이라서 그만큼 Max steps를 줄어야 한다.


Save an image to log directory every N steps 는 샘플 이미지를 몇스텝마다 생성할것인가 정하는 것이다. 보통은 기본값으로 두면 된다.

Save a copy of embedding to log directory every N steps는 백업을 몇스텝마다 생성할것인가 정하는 것이다. 보통은 기본값으로 두면 된다.


Shuffle tags by ',' when creating prompts는 태그 순서를 무작위로 배치하는 것인데 Tagger를 사용하지 않고 단부루나 갤부루에서 태그를 들고 와서 abc 순서로 배열된 경우에 유용함.


Choose latent sampling method는 학습 순서 같은건데 random을 쓰면 조금 더 나아질지도 모르지만 VRAM을 더 먹는것은 확실하다고.


Read parameters (prompt, etc...) from txt2img tab when making previews는 샘플 이미지를 만드는 경우 txt2img를 따른다는 의미이다. 

태그 넣어주고 시드 고정해두면 좋다.



학습을 시작하기 전에 학습 모델을 잘 지정해야하는데, 개인적으로 캐릭터 학습은 animesfw-final-pruned를 추천하지만 보통은 animefull-final-pruned를 사용한다. 별도의 퀵 세팅을 하지 않았다면 설정 → Stable Diffusion에서 한 다음 Apply settings를 누르면 된다.


4. 학습 시작

Log directory/학습시킨날/하이퍼이름/images 에서 지정한 단위로 (기본은 500스텝) 이미지가 생성될건데 이미지가 점점 이상해지거나 현대미술로 가고 있다면 과적합이 되고 있다는 의미이다.


학습을 중간에 중단하고 싶다면 Interrupt 버튼을 누르면 된다.


Log directory/학습시킨날/하이퍼이름/hypernetworks 에서는 스텝별 백업본들이 존재하는데 과적합이 발생한 경우 이것들을 챙겨서 webui의 하이퍼 넣는곳에 넣어주면 다시 학습하거나 사용할 수 있다.


5. 학습 완료후 필요한 추가 태그 확인.


학습이 끝나면 하이퍼를 적용하고 생성을 해보자. 지정하기 전에 옆에 있는 새로고침 버튼을 누르고 지정해주자. 별도의 퀵 세팅을 하지 않았다면 설정 → Stable Diffusion에서 할 수 있다.


뭔가 맞지 않은 부분이 있어 보일건데 보통은 눈 색상, 머리 색상, 머리 길이, 머리 스타일 정도를 태그로 지정해줘야 한다. 학습을 더 하면 그럴 필요가 없어지기도 한데 대신 과적합에 가까워질 위험이 있다. 만약 오래된 캐릭터라면 이름을 넣어주는것으로도 충분할 수 있다.


여기서는 blonde hair, brown eyes를 추가해주니 잘 된다. 어떤 태그가 필요한지는 태그 달기에서 생성된 텍스트 파일을 참고하면 된다.


그런데 뭔가 망했는지 몸을 이상하게 출력한다.


학습 데이터가 이상해서 그런거 같지만 귀찮으니 네거티브에 side view를 넣어 해결.


6. 소소한 팁 

Quicksettings list 설정을 sd_model_checkpoint, sd_hypernetwork, sd_vae, sd_hypernetwork_strength으로 설정하고 Apply settings 누르고 Reload UI를 누르면

모델하고 하이퍼를 빠르게 변경할 수 있다.

그리고 NAI에서 학습한 하이퍼는 NAI 기반 변형 모델에서도 호환되니 다양한 이미지를 즐길 수 있다.