학습목표
a. IP-Adapter는 무엇인가? 뭐 할때 쓰는건가?
b. IP-Adapter는 어떻게 연결해서 쓰는가?
c. IP-Adapter는 어떻게 계수값을 조절하는가?
d. IP-Adapter에는 왜 이렇게 종류가 많은 것 처럼 복잡해보이는가?
e. FaceID를 쓴 IP-Adapter와 그렇지 않은 IP-Adapter는 무슨 차이인가?
f. 1장을 넣을때와 4장을 넣을때는 어떻게 달라지는가?
g. 나는 내가 필요한 IP-Adapter를 상황에 맞게 끌어와서 사용할 수 있는가?
h. 임베딩이란 무엇인가? Embedding과 Latent 같은 어려운 개념은 어떻게 느끼면 되는가?
Plain Text
복사
워크플로우
워크플로우가 많다고 쫄지 마세요. 다 거의 비슷한 것입니다. 사용법은 매우 간단하고 한가지 방법입니다.
인덱스 | 워크플로우 이름 | 실행가능한 링크 | 요약 |
4.3.1 | IP-Adapter(Linear) | ip adapter의 기본 연결관계입니다. | |
4.3.2 | IP-Adapter(StyleTransfer) | style만 추출하는 style transfer가 가능합니다. | |
4.3.3 | IP-Adapter(StyleTransfer Precise) | 다양한 종류의 weight 조절을 할 수 있습니다. | |
4.3.4 | IP-Adapter(Compositon) | 다양한 종류의 weight 조절을 할 수 있습니다. | |
4.3.5 | IP-Adapter(Style and Composition) | 다양한 종류의 weight 조절을 할 수 있습니다. | |
4.3.6 | IP-Adapter(Multi, StyleTransfer) | 1장이 아닌 4장의 레퍼런스 이미지를 넣을 수 있습니다. | |
4.3.7 | IP-Adapter(FaceID) | 얼굴의 특정 특징 또는 스타일등에 초점을 맞추며 FaceID와 같은 보조적인 Data를 참조하기도 합니다. | |
4.3.8 | IP-Adapter(Multi, FaceID) | 얼굴도 마찬가지로 4장까지 넣을 수 있습니다. | |
4.3.9 | IP-Adapter(1Style+1Face) | Face와 Style을 중복해서 겹쳐 사용할 수 있습니다. | |
4.3.10 | IP-Adapter(4Style+4Face) | Face1장 Style1장이 아닌 Face4장 Style 4장도 가능합니다. | |
4.3.11 | IP-Adapter(Templates) | ip adapter를 사용하고자 할때 이 스니펫을 켜셔서 연결관계를 복사하시면 됩니다. | |
4.3.12 | IP-Adapter(Legacy, SDXL) | 구버전 ip adapter 입니다 | |
4.3.13 | IP-Adapter (Legacy, SD1.5) | 구버전 ip adapter 입니다 |
a. IP-Adapter는 무엇인가? 뭐 할때 쓰는건가?
창작자들에게 ‘레퍼런스 이미지’는 중요합니다. 체크포인트에게 백날 ‘말’로 이런 이미지를 만들어달라고 설명하는 것 보다, ‘이미지’를 보여주는게 나을 수 있습니다. 로라가 체크포인트의 값에 변형을 주었듯, 마찬가지로 IP-Adapter도 체크포인트의 값에 변형을 주는 유사한 방법을 활용합니다. (단, 레퍼런스와 모방은 한끗차이 입니다. 레퍼런스 이미지를 활용하실때는 표절이 아닐 수 있도록 주의해주세요.) 컨트롤넷은 노란색 컨디셔닝에 연결했었다면, IP-Adapter도 유사한 방법으로 보라색 모델에 연결해주면 됩니다. (그래서 IP-Adapter는 보라색으로 통일해두었습니다.)
더 궁금하신 분들께서는 Google에서 2023년에 발표한 프로젝트인 Style Drop 페이지에 들어가서 모식도들을 구경해보셔도 좋습니다. 기존에는 20~1000+장의 이미지를 넣어서 ‘로라’를 만들기도 했지만, 이제는 IP-Adapter를 활용해 1장만을 갖고도 원하는 스타일만 예리하게 추출할 수 있습니다. 단 아직 로라의 성능에 비해서는 떨어지기는 합니다만 그래도 적은 데이터로 레퍼런싱 할 수 있다는 측면에서의 효용은 큽니다.
b. IP-Adapter는 어떻게 연결해서 쓰는가?
일단 써보겠습니다. 여기서는 IPAdapter Advanced가 ControlNet Apply (Advanced)와 동일한 가장 중요한 역할을 합니다. 레퍼런스 이미지를 Load해주고 넣기 위하여, 필요한 IP-Adapter모델을 Unified Loader를 통해 Load해주고, Text 이해를 더 잘할 수 있도록 해주기 위하여 Clip Vision모델 또한 함께 넣어줍니다. (컨트롤넷은 XL 그리고 1.5 모델별로 구분을 해주거나 해야하는 어려움이 조금 존재했는데, IP-Adapter는 Unified Loader를 통해 그 불편함을 조금 개선했습니다.)
모델끼리 이어주세요. 체크포인트의 ‘모델’을 Unified Loader의 모델에 연결해주고, IP-Adapter Advanced를 통해 Apply해준 모델을 KSampler의 Model로 넣어주면 됩니다.
Style Transfer를 적용해서 써보겠습니다. weight값을 0.8로 주고, “cat on the car, chibi character, minimalism, white background”라고 넣어주었습니다.
1장의 레퍼런스 이미지를 넣고 만든 cat on the car
1장의 이미지를 넣는 방법이 아닌 4장의 이미지를 넣는 방법도 있습니다. 여러 방법들은 뒤에서 차근히 살펴볼 수 있도록 하겠습니다.
4장의 레퍼런스 이미지를 넣고 만든 cat on the car
c. IP-Adapter는 어떻게 계수값을 조절하는가?
일단 weight값은 0.8로 주시면 됩니다. 공식 문서에서 제작자가 0.8을 추천했습니다. 하지만 당연히 이 기준으로 낮추거나 높이시면 됩니다. 0.7, 0.6, 0.55, … 낮춰도 되고 1로 높여도 됩니다.
start_at과 end_at은 앞선 4.2의 컨트롤넷에서 설명한 것과 동일합니다. ksampler의 step에 영향을 줍니다. 별로 안 씁니다.
combine_embeds와 embeds_scaling은 뒤에서 embed에 대한 설명을 하면서 설명하겠습니다. 별로 중요하지 않습니다.
weight_type은 이제 설명하겠습니다. 중요합니다 알고 쓰셔야 합니다.
d. IP-Adapter에는 왜 이렇게 종류가 많은 것 처럼 복잡해보이는가?
우선 한줄로 요약하겠습니다. 1장을 넣을 수 있고, 4장을 넣을 수도 있습니다. IP-Adapter를 그냥 적용할수도 있고, FaceID를 통해 얼굴닮기를 강화할 수 있습니다.
이렇게 간단한 내용인데 그 조합이 다양하기 때문에 그리고 그 각각의 parameter 즉 계수값도 따로 존재하기 때문에 복잡해보입니다. 단순하게 핵심을 파악하세요.
weight_type
위에서는 style transfer를 적용해주었던 weight type에 대해 설명하겠습니다.
(일단 style transfer를 주로 쓰시면 되고, 나머지는 컨트롤넷의 다양한 프리프로세서처럼 그냥 경험치의 영역이고 변경해볼 수 있는 변수쯤으로 여기시면 됩니다.)
style transfer를 은은하게 주고 싶으면 style transfer precise, 더 강하게 주고 싶으면 strong style transfer를 씁니다.
하지만 ‘레퍼런스 이미지’에서 ‘style’만을 추출하는 것은 아닙니다. ‘composition’을 추출할 수도 있고, ‘style and composition’을 줄수도 있습니다.
•
style transfer : https://nordy.ai/basic-workflows/66b19dfbecf847aa45c8788e
•
•
style and composition : https://nordy.ai/basic-workflows/66b1a045e8c05e0008c625a5
좌측부터 차례로 : 레퍼런스 이미지, style transfer, composition, style and composition
물론 가장 기본은 linear입니다. 레퍼런스이미지와 그냥 닮게 만드는 역할을 하고 단순히 ip-adapter를 적용합니다. style transfer가 나오기 전에도 꽤 쓰였습니다.
(하지만 조금 더 깊숙히 설명하자면 ip-adapter는 unet의 특정 block에만 weight를 주는 역할을 하고, 그것들을 어떤 그래프 개형으로 넣어주느냐에 따라 ease in, ease out, weak input, … 등 다양한 변이형태가 존재하는 것 정도로 이해하시면 됩니다. 쓰실 수 있는 요소이긴 하지만 명확히 패턴화되지는 않습니다.)
e. FaceID를 쓴 IP-Adapter와 그렇지 않은 IP-Adapter는 무슨 차이인가?
얼굴을 닮게 하고 싶을때는 FaceID를 쓸 수 있습니다. 하지만 엄밀하게 똑 닮게하는 느낌보다는 은은하게 닮은 느낌을 내도록 해주는 정도입니다.
Unified Loader가 아닌 Unified Loader with FaceID를 사용하고 FaceID를 사용하기 위해서 InsightFace를 Load해오는 정도의 차이가 있습니다. 물론 그렇기에 IPAdapter Advanced가 아닌 IPAdapter FaceID를 사용해주었습니다. 그렇기 때문에 추가적으로 생긴 weight값들도 신경을 써주어야 하겠지요. 적당히 0.8 정도로 주고 GPU를 사용하고 있기 때문에 Provider를 CPU가 아닌 GPU(=CUDA는 GPU의 종류입니다.)로 설정해주었습니다. 그 이외의 사용법은 동일합니다. 모델을 꼬리물기 해주세요.0
하지만 ‘얼굴’도 사용하고 싶고, ‘스타일’도 사용하고 싶을 수 있겠지요.
‘얼굴’을 사용하게 할때는 앞서 설명했던 것 처럼 단독으로 연결해서 쓸수도 있고
‘얼굴’과 ‘스타일’을 중첩으로 연결해서 사용해주는 경우의 수도 가능합니다.
f. 1장을 넣을때와 4장을 넣을때는 어떻게 달라지는가?
사용하는 사람 입장에서 4장을 사용할때는 세부적인 구성을 모두 알 필요는 없고 4장을 갈아끼워서 사용만 하면 됩니다. 4장 이하인 2장과 3장도 가능합니다. 4장을 넣는다고 항상 더 좋아지는 것은 아닙니다. 1장의 좋은 레퍼런스 이미지를 넣는 것으로도 충분한 경우가 많습니다. (하지만 여기서 더 섬세한 조작을 하기 위해서 세부적인 구성요소를 아는 것은 필요할 경우에 한해 유효합니다. 궁금하신 분들께서는 본 문서의 가장 하단에 있는 임베딩에 대한 설명을 참고해주세요.)
스타일이미지를 4장 넣는 경우
얼굴을 4장 넣는 경우
얼굴4장과 스타일이미지4장을 넣는 경우
g. 나는 내가 필요한 IP-Adapter를 상황에 맞게 끌어와서 사용할 수 있는가?
결국 ‘모델’을 연결해주고, 선 연결을 할때 꼬리물기를 잘 해주고, 적합한 레퍼런스 이미지를 넣고, 적절한 계수값을 설정해주는 것이 전부입니다.
필요할 때 이 워크플로우에 들어가셔서, 필요하신 모듈을 복사해오셔서 사용하시면 됩니다. 더 많은 좋은 활용사례를 만들어보시길 바랍니다.
h. 임베딩이란 무엇인가?
(여기서부터는 부가적인 설명을 할테니, 실용적 측면에서는 배울 것 다 배우셨으니 가서 쓰시면 됩니다. 궁금하면 찾아오세요.)
1장일때와 4장일때를 자세히 비교해서보면, 얼추 비슷하지만, IPAdapter Encoder 그리고 IPAdapterCombineEmbeds 같은 이상한 것들이 더 생겼습니다.
‘임베딩’이라는 단어 … 어려운 단어지만, 쫄지 말고 가볍게 이해해보고 갑시다. 이해하지 못하셔도 괜찮습니다.
인공지능은 우리가 보는 픽셀을 잘 이해하지 못합니다. 그래서 Latent로 변환한다고 설명했었습니다. 그거랑 같은겁니다.
그것과 유사합니다. 인공지능이 픽셀을 이해할 수 있도록 해주기 위해, 임베딩으로 변환한 후 보내주는 겁니다.
(벡터라는 개념에 대해서까지 설명하지는 않겠지만 방향과 크기를 가진 수학적 개념이라고 이해하시면 됩니다.)
king과 queen이라는 단어는, 어느 좌표평면상에 찍힐 수 있는 점과 같은 존재입니다.
man과 woman이라는 단어 사이의 차이를 어떤 벡터로 표현할 수 있을 것입니다.
그리고 그 벡터는 king과 queen이라는 단어 사이의 벡터와 유사할 겁니다.
그래서, 위의 레퍼런스 이미지 4장을 넣어주는 것을 다음과 같이 표현할 수도 있겠습니다.
이미지1 -> clip vision으로 문장추출 (image2text) -> 임베딩벡터1
이미지2 -> clip vision으로 문장추출 (image2text) -> 임베딩벡터2
이미지3 -> clip vision으로 문장추출 (image2text) -> 임베딩벡터3
이미지4 -> clip vision으로 문장추출 (image2text) -> 임베딩벡터4
Plain Text
복사
그리고 앞서 이미지가 1장일때는 의미가 없었지만, 여러장이 되면 의미가 생겨지는 계수값 2개만 확인하겠습니다.
•
embeds_combine_method
•
embeds_scaling
embeds_combine_method는 저희가 획득한 embed들을 어떻게 combine 즉 합쳐줄 것이냐는 것입니다.
concat 하면 연결해서 더하는 것이고 average는 평균내준다는 것입니다. 아래 코드 설명은 엄밀하지 않습니다.
concat(1,2,3,4) -> 1+2+3+4
average(1,2,3,4) -> 1+2+3+4/4
concat(embed1, embed2, embed3, embed4)
average(embed1, embed2, embed3, embed4)
if
embed1 = cat, cute
embed2 = cat, angry
embed3 = cat, white
embed4 = cat, flower
concat(sen1, sen2, sen3, sen4) -> cat, cute, cat, angry, cat, white, cat, flower
average(sen1, sen2, sen3, sen4) -> cat, something
Plain Text
복사
그리고 embedding이라는 값은 key와 value를 가진 딕셔너리 형태의 자료형인데
•
그 중에서 key만 쓰냐 value만 쓰냐 key와 value를 함께 쓰냐, 채널패널티를 주느냐 등등입니다.
유의미한 결과차이가 발생했다면, 실용적으로 의미가 있었다면, 그 원리를 설명드리겠지만, 그렇지 않으므로 원리에 대한 설명은 패스합니다.
결과적으로 다음과 같은 실험가능한 경우의수가 추가적으로 생겼습니다.
(단, 이미지가 1장일 때는 이 또한 영향을 주지 않습니다. 시드픽스하고 계수값테스트 해보세요.)
•
일단 concat으로 해본다
•
average를 하는게 나은 경우의 수도 존재한다.
•
k+v를 일단 기본으로 해본다
•
v only, c penalty를 하는게 나은 경우의 수도 존재한다.