AI 그림으로 머리속 상상을 시각화하는 것이 매우 편리해진 것이 사실이지만, 막상 원하는 문구나 글자 등을 그림 속에 새겨넣는 것을 해보면 쉽지 않다는 것을 알 수 있습니다. 오늘은 스테이블 디퓨전으로 내가 원하는 AI 글자를 만들고 이를 그림 속에 삽입하는 작업을 해보도록 하겠습니다.
T2I로 AI 글자 만들기
AI는 다 잘 하니까, 막연히 스테이블 디퓨전을 실행하고 프롬프트에 OOO라는 글씨를 작성해달라고 하면 해줄 것 같습니다. 그런데 현실은 어떨까요? 아래 그림은 다른 아무런 설정 없이 프롬프트만 입력하여 테이블 위에 Aipoque라는 단어의 형상으로 초콜렛이 놓여있는 그림을 그려달라고 했을 때 얻은 결과입니다.
결과 이미지들을 보면 테이블 위에 놓인 초콜렛이긴 하지만, 글자가 초콜렛으로 만들어진 것이 아니라, 초콜렛 위에 새겨져있고, 또 정확히 Aipoque라는 글자를 표현하지도 못하고 있습니다.
이번에는 스테이블 디퓨전의 만능 기술 컨트롤넷(ControlNet)의 도움을 받아 초콜렛으로 된 Aipoque를 만들어본 결과입니다. 물론 프롬프트를 자세히 제어하지 않아서 글자 외의 상황을 온전히 컨트롤하지는 못했지만, 적어도 초콜렛으로 만들어진 Aipoque라는 글자를 생성해내기는 했습니다. 컨트롤넷이 익숙하지 않은 분들은 아래를 참고하시면 설치 및 기본 사용법을 숙지하실 수 있습니다.
컨트롤넷 설정
위의 이미지를 만들 때 사용한 컨트롤넷 설정은 다음과 같습니다.
검은 배경에 만들고자 하는 글자를 흰색으로 하여 그림 ConrolNet의 컨트롤 이미지로 사용하고, Depth 또는 Canny를 활용해서 프롬프트와 함께 이미지를 생성합니다. 아래는 동일 세팅으로 프롬프트를 조금씩 바꿔가면서 만들어본 이미지들입니다.
Depth로 생성한 AI 글자 이미지
Depth를 사용할 때는 주의할 점이 있습니다. 바로 전처리기에 none을 선택해줘야 한다는 점인데요, Depth 자체가 거리감을 계산할 때 검은색을 뒤로, 흰색을 앞으로 인식하기 때문입니다. 따라서 우리가 컨트롤 이미지로 넣어준 글자 이미지 자체가 사실은 Depth 전처리가 이미 마쳐진 상태랑 동일하므로 전처리기를 다시 사용할 필요가 없습니다.
Canny로 생성한 AI 글자 이미지
컨트롤넷의 Canny를 사용해서도 Depth와 비슷한 결과물을 만들어낼 수 있습니다. 단, Canny의 경우 전처리기를 사용해주셔야 글자의 외곽선을 제대로 인식해서 그림을 생성해줍니다.
AI 글자 Depth vs Canny 비교분석
Canny와 Depth 모두 베스트샷만 보면 꽤 그럴사한 이미지를 만들어주지만, 사실 둘의 동작 방식에 차이가 있기 때문에 원하는 결과물에 따라 사용자가 세팅값을 잘 설정하여 활용해야 합니다. 예를 들어 Depth는 말 그대로 그림의 깊이감을 표현하는데 도움이 되기 때문에 글자를 만들때도 깊이감 있는 글자를 만드는데 도움이 됩니다. 3번째 이미지는 사아피어(sapphire)로 만들어달라고 프롬프트를 작성했는데요, Canny에 비해 Depth가 조금 더 사파이어의 깊이감(부피감)을 잘 살리고 있는 모습입니다. 이외에도 전반적으로 Depth로 만든 이미지들이 글자의 두께감이 더 강합니다.
이런 원리를 잘 이해하면 음각으로 AI 글자를 새기는 것은 Depth가 더욱 유리하다는 것을 알 수 있습니다. 위 그림은 앞서 사용한 컨트롤 이미지와 달리 글자를 검은 색으로, 바탕을 흰색으로 만든 컨트롤 이미지를 사용해 AI 글자를 음각으로 새긴 결과입니다.
반면 평면에 글자만 그려넣는 것은 아무래도 Canny가 조금 더 유리할 수 밖에 없습니다. 위 그림은 앞서 Depth 음각과 마찬가지로 같은 컨트롤 이미지를 사용하여 Canny로 그린 그림입니다. 평면위에 깔끔하게 AI 글씨가 작성된 모습입니다.
I2I로 AI 글자 새기기
이번에는 Image to Image로 원본 이미지 위에 AI 글자를 새기는 작업을 해보고자 합니다. T2I에서 한 것과는 조금은 상황이 다른데요, I2I에서는 원본 이미지의 영향력을 고려해서 작업을 해야한다는 점입니다.
글자를 바로 새기기
아래에서는 인물의 T-Shirt에 AIPOQUE라는 글자를 새겨보도록 하겠습니다.
먼저 원본 이미지와 결과 이미지를 비교해보면, T-shirt 위에 AIPOQUE라는 글자를 잘 그려넣은 것을 볼 수 있습니다. 중요한 것은 이 때 셔츠 위의 빛에 의한 음영이 글자에도 함께 적용이 되었다는 점입니다. 위 그림의 작업과정 및 설정은 다음과 같습니다.
먼저 앞서 T2I에서 글자를 만들었던 것처럼 원본 이미지와 동일한 크기의 검은 바탕에 흰색 글자로 컨트롤 이미지를 만들어줍니다. 예시에서는 티셔츠 위에 글자를 작성하기 위해 티셔츠 부위에 맞도록 글자 크기와 위치를 조정했습니다.
컨트롤넷은 2개를 조합해서 사용했는데요, 여기서는 Depth와 Tile Resample을 사용했습니다. Depth로는 글자 자체를 생성하기 위함이고 Tile Resmaple은 원본 티셔츠를 그대로 잘 살리면서 글자를 잘 합성되도록 하기 위해 사용했습니다.
두 조합이 절대적인 것은 아닙니다. 상황에 따라 Canny와 타일리샘플을 함께 사용하셔도 무방하며, 타일리샘플이 필요없는 경우라면 사용하지 않고서도 글자를 새길 수 있습니다.
마지막으로 원본 이미지 티셔츠를 마스킹한 뒤 프롬프트를 작성하고 그림을 생성합니다. 프롬프트는 간단한 퀄리티 태그와 함께 white t-shirt, simple t-shirt with writings, black writings 정도만 입력했습니다. 여기서 컨트롤넷에 설정해준 타일 리샘플은 인페인트 마스킹 영역인 T-Shirt를 대상으로 타일링 + 디테일링을 하게 되고, 동시에 Depth 또한 티셔츠 영역에서 컨트롤 이미지로 제공한 글자를 만들게 됩니다. 두 기술이 동시에 적용되어 티셔츠 위에 컨트롤 이미지로 작성했던 글자를 새길 수 있었습니다.
글자를 합성한 뒤 새기기
이번에는 다른 방식으로 한 번 글자를 새겨보고자 합니다. 앞선 방식에서 AI 글자를 새기기 위해 컨트롤넷을 써야하는 상황이라면 어차피 컨트롤 이미지(글자만 있는 이미지)를 만들어서 진행해야 합니다. 그럼 아예 원본 이미지에 글자를 합성한 뒤 그 합성 이미지를 원본으로 사용하여 컨트롤 이미지 없이 자연스럽게 바꾸는 방식은 어떨까요?
위 이미지는 이 아이디어를 바탕으로 앞서 생성했던 글자 이미지 중 가장 마음에 들었던 그래피티 글자를, 머그컵 및 티셔츠 위에 새겨본 결과 이미지입니다. 꽤 그럴사한 이미지가 생성된 것 같아 마음에 듭니다. 작업과정은 위에서 설명드린 그대로 입니다. 먼저 원본 이미지와 새겨넣을 글자 이미지를 준비한 뒤 이미지 편집 프로그램에서 아래 그림과 같이 1차 합성을 해줍니다.
여기서 글자의 투명도를 50% 정도로 낮춰 원본 티셔츠가 잘 보이도록 해줍니다. 추가로 뒤틀기를 통해 글자의 모양을 조금 변형한다든지, 마스킹을 통해 글자 주변을 조금 다듬어주는 등의 1차 리터칭을 해주시면 더욱 좋은 결과물을 얻을 수 있습니다. 하지만 리터칭 기술이 없는 분들도 결국 최종적으로는 WebUI에서 컨트롤넷으로 자연스럽게 만들 것이므로 걱정할 필요가 없습니다. 이제 이 이미지를 WebUI i2i의 inpaint로 불러옵니다.
이미지의 티셔츠 부위를 마스킹한 뒤 컨트롤넷은 타일리샘플을 설정해줍니다. 프롬프트는 마찬가지로 간단하게 작성합니다. 예시에서는 퀄리티 태그와 함께 girl, simple white t-shirt, colorful graffiti on the t-shirt, graffiti printed t-shirt, 정도만 작성했습니다.
이렇게 설정하고 이미지를 여러장 생성해보시면 꽤 괜찮은 이미지들을 얻으실 수 있습니다. 글자의 합성 수준이 자연스럽지 못하거나 마음에 들지 않는다면 Control Weight와 Denoising Strength 값을 바꿔가며 시도해보시기 바랍니다. 이 두 변수는 정해진 최적 설정값이 있는 것이 아니라 생성하려는 그림의 상태에 따라 사용자가 유연하게 대처해야 하는 부분이므로, 자연스러운 이미지를 만들기 위해 많이 시도해보시고 경험을 쌓는 것이 중요합니다.