AI 이미지/워크플로 따라하기

스테이블 디퓨전으로 QR 코드 만들기

하늘이푸른오늘 2023. 6. 17. 12:27

제가 구독하고 있는 (그리고 제일 많이 참고하는) stable-diffusion-art.com에 재미있는 글이 올라왔습니다. 스테이블 디퓨전으로 QR 코드를 제작할 수 있다는 내용입니다. 흑백에 네모네모한 QR 코드가 스테이블 디퓨전과 전혀 관계가 없을 것 같은데, 아래와 같은 걸 만든다는 겁니다. 보기에는 그냥 점들이 군데 군데 있는 것 빼고는 평범한 그림일 듯 싶고,  QR 코드 냄새는 별로 안나는데도, QR코드 스캐너를 사용하면 진짜 읽히기까지 합니다!! (잘 읽히지 않으면 그림 크기를 변경하거나 카메라를 앞뒤로 움직여 보세요. 인식이 잘되는 건 아닙니다. 제 경험으로는 초점이 흐릿하게 잘 맞지 않을 때 인식이 더 잘되는 것 같더군요~ ㅎㅎ)

Stable Diffusion으로 만든 QR 코드

이 사이트의 주인장 Andrew씨도 Reddit 에 올라온 글을 참고해서 만들었다고 하는데, 맞춤형으로 학습된 ControlNet 모델을 사용하여 생성된 거라고 합니다. 그런데, 구지 이렇게 별도로 학습된 모델이 없어도 QR코드를 만드는 방법이 있다고 하네요. QR 코드에 대해서는 모두 아실 것 같지만, 혹시 잘 모르신다면 나무 위키 글을 참고하세요.

 이 글에서 다루는 내용은 다음과 같습니다.

소프트웨어

별도로 준비해야 할 소프트웨어는 없습니다. 그냥 AUTOMATIC1111 스테이블 디퓨전 Web-UI만 있으면 됩니다. 설치하는 방법은 이 글을 읽어보세요. 또한 ControlNet extension을 사용하므로, 미리 설치해 두셔야 합니다. 설치 방법은 이 글을 참고하세요.

QR 코드 생성하기

먼저 원하는 메시지가 담긴 QR 코드를 작성해야 합니다. 그런데, 다른 그림과 섞인 코드를 만들게 되므로, QR 코드를 만들 때 다음과 같은 기준을 만족해야 합니다.

  • 오류 허용수준(fault tolerance) 값을 높게 설정할 것(30%)
  • QR 코드 주변에 흰색 영역을 둘 것
  • 가장 기본적인 정사각형 채우기와 흑백 패턴을 사용할 것
  • 검은색 요소 사이로 얇은 하얀선이 생기는 QR 코드 생성기는 사용하지 말 것. 

이중에서 첫번째가 매우 중요할 것 같고... 다른 건 이해가 되는데, 맨 마지막은 무슨 뜻인지 잘 모르겠네요.

이 글에서는 이 QR 코드 생성기 사이트를 사용하겠습니다(다른 사이트에서는 오류 허용수준을 설정할 수 있는 사이트가 별로 없네요). 이 사이트에 접속해서 text 유형을 선택하고 원하는 문자를 입력합니다. 그리고 오류 허용수준(fault tolerance)을 30%로 설정하고 [Generate] 버튼을 눌러줍니다. 

QR코드 생성사이트 https://34qr.com/en/

이렇게 생성된 QR코드를 PNG 포맷으로 다운로드 받으시면 됩니다. 

방법1: 전용 ControlNet 모델을 사용한 txt2img

이 방법에서는 QR코드 장식용으로 학습된 ControlNet을 다운로드 받아야 합니다. 다음 두가지 모델 중 어떤 것을 사용해도 무방합니다.

1단계: QR 코드 콘트롤넷 설치

이 글에서는 QR Code Pattern v2를 사용합니다.  위에 있는 콘트롤넷 모델을 아래 폴더 중 하나에 다운로드 받습니다. 저는 처음에는 위의 폴더에 넣었다가 아래 폴더로 옮겨서 사용하고 있습니다. 차이는 없으니 편하신대로 하시면 됩니다.

stable-diffusion-webui\extensions\sd-webui-controlnet\models
stable-diffusion-webui\models\ControlNet

2단계: txt2img 설정

txt2img 설정은 아래와 같습니다.

체크포인트 모델: Anything v5
프롬프트: Japanese painting, mountains, 1girl
부정적 프롬프트: ugly, disfigured, low quality, blurry, nsfw
샘플러 : DPM++ 2M Karras
단계(steps) : 20
Hires Fix: On - Upscaler: Latent, Upscale by 2, Denoising Strenth: 0.7
Width/Height : 512x512
CFG 척도 : 7

txt2img 설정

3단계: ControlNet 설정

ControlNet 부분의 오른쪽 삼각형을 눌러 펼치고 아래와 같이 설정합니다. 

이미지 캔버스 : 캔버스에는 위에서 생성한 QR 코드를 넣어줍니다.
Enable: Yes
Pixel Perfect: Yes
ControlNetModel: QRPattern_v2_9500
Control Weight: 1.1 (필요에 따라 바꿔주어야 합니다.)
Control Mode: Balanced
Resize Mode: Crop and Resize

QR코드 생성을 위한 ControlNet 설정

이렇게 설정하고 [Generate] 버튼을 누르면 1024x1024 크기의 예쁜 QR 코드가 생성됩니다. 아래는 몇가지 예입니다.

https://www.internetmap.kr/ QR 코드
https://www.internetmap.kr/ QR 코드

스마트폰에서 이 이미지를 스캔해보면 QR 코드를 읽을 수 있습니다. 다만, 아주 잘 읽히는 것은 아니기 때문에 스마트폰을 앞뒤로 왔다갔다하면 읽힐 수 있습니다.

방법2: Tile resample 모델을 사용해 QR 코드를 장식하기

이 방법은 우선 img2img를 사용하여 QR 코드와 유사한 이미지를 생성합니다. 그러나 이것만으로는 유효한 QR 코드가 생성되지 않습니다. 샘플링 단계 중간에 ControlNet이 켜서 QR 코드를 이미지에 각인시켜야 합니다. 샘플링 단계가 끝나면 이미지의 일관성을 개선하기 위해 ControlNet을 꺼야 합니다. 

1단계: AUTOMATIC1111 설정

AUTOMATIC1111을 켜고 Img2img 페이지로 들어갑니다. 적절한 체크포인트 모델을 선택하고(원본 글에서는 GhostMix를 사용했다는 데, 저는 그냥 ChilloutMix를 사용했습니다.) 적당한 프롬프트를 입력합니다. 그런데, 일반적인 이미지가 아니라, QR 코드를 생성하는 것이기 때문에 프롬프트를 잘 입력해야 합니다. 아래는 이 예제에서 사용한 프롬프트입니다. 

프롬프트: a cubism painting of a town with a lot of houses in the snow with a sky background, Andreas Rocha, matte painting concept art, a detailed matte painting 
부정적 프롬프트: ugly, disfigured, low quality, blurry, nsfw

2단계: 이미지 업로드

앞에서 생성한 QR 코드를 img2img 캔버스에 업로드합니다. 

img2img 캔버스

image-to-image 설정은 아래와 같습니다.

Resize mode: Just resize
Sampling method: DPM++2M Karras
Sampling step: 50
Width: 768
Height: 768
CFG Scale: 7
Denoising strength: 0.75

3단계: ControlNet 설정

우선 ControlNet의 이미지 캔버스에 QR 코드를 업로드합니다. 그리고 아래와 같이 ControlNet 설정을 바꿔줍니다.

Enable: Yes
Control Type: Tile
Preprocessor: tile_resample
Model: control_xxx_tile
Control Weight: 0.87
Starting Control Step: 0.23
Ending Control Step: 0.9

ControlNet 설정

마지막으로 [Generate] 버튼을 눌러줍니다. 아래가 몇가지 예입니다. 

이렇게 생성한 후에는 직접 스마트폰 QR 코드 스캐너로 읽어보셔야 합니다. 위의 예제로 테스트해보시면 아시지만, 잘 인식하는 것도 있고, 잘 안되는 것도 있거든요(성공률은 대략 1/4 ~ 1/2 정도 되는 것 같습니다). 그리고 이미지를 크게 했을 때 특히 인식하지 못하는 경우가 많다고 합니다. 

짧은 텍스트일수록 QR 코드 패턴이 단순하므로 성공률이 높습니다. 

또한 이미지와 QR 코드가 섞여 있기 때문에  읽힐 수도 있고 안 읽힐 수도 있습니다. QR 코드 스캐너를 어떤 걸 쓰느냐에 따라 다를 수도 있고 거리에 따라, QR 코드의 크기에 따라 읽히는 비율이 달라질 수 있습니다. 

QR 코드와 잘 조화되는 프롬프트가 있습니다. 예를 들어 위의 예처럼 옥상에 눈이 쌓인 집과 같은 프롬프트는 시각적으로 비슷하기 때문에 QR 코드와 잘 어우러 집니다.

모델과 프롬프트에 따라 매개변수를 다르게 설정해야 할 수 있습니다. 특히 다음 파라미터를 조정해서 QR 코드와 프롬프트가 잘 섞이도록 해주어야 합니다.

  • 잡음 제거 강도(Denoising stregth): 이 값을 줄이면 초기 구성이 QR 코드를 더 많이 따르게 됩니다. 그러나 너무 많이 줄이면 QR코드만 표시됩니다. 일반적으로 0.7보다 높게 설정하는 게 좋습니다.
  • 제어 가중치(Control Weight): 이 값을 크게 하면 QR 코드가 강해집니다.
  • 제어 단계 시작(Starting Control Step): 이 값을 크게하면 QR 코드가 약해집니다. 
  • 제어 단계 종료(Ending Control Step): 이 값을 줄이면 ControlNet이 더 일찍 중지되므로, QR코드와 이미지가 더 자연스럽게 섞일 수 있습니다.

이 네가지 제어 파라미터를 한마디로 말하면 프롬프트 이미지와 QR 코드 중에서 어떤 것이 더 많이 표현되게 할 것인가를 제어하는 것입니다. 일단 설정한 값으로 많이 생성해서 테스트해본 뒤, 마음에 드는 게 없으면 조정하는 게 좋을 것 같네요.

방법3: 전용 ControlNet 모델을 사용한 img2img로 생성하기

이 방법은 방법2와 매우 비슷하지만, ControlNet 모델을 Tile 대신 QR Pattern v2, 혹은 QR Code Monster를 사용하는 방법입니다. 아래가 설정입니다.

프롬프트: A photo-realistic rendering of a busy market, ((street vendors, fruits, vegetable, shops)), (Photorealistic:1.3), (Highly detailed:1.2), (Natural light:1.2), art inspired by Architectural Digest, Vogue Living, and Elle Decor 
부정적 프롬프트: ugly, disfigured, low quality, blurry, nsfw
Enable: Yes
Control Type: All
Preprocessor: None
Model: QRPattern_v2_9500
Control Weight: 1
Starting Control Step: 0.12 (결과를 보면서 조정해야 합니다.)
Ending Control Step: 1

아래가 결과입니다. 

다른 프롬프트 사용 예

Mechanical Girl

프롬프트: 1mechanical girl,ultra realistic details, portrait, global illumination, shadows, octane render, 8k, ultra sharp,intricate, ornaments detailed, cold colors, metal, egypician detail, highly intricate details, realistic light, trending on cgsociety, glowing eyes, facing camera, neon details, machanical limbs,blood vessels connected to tubes,mechanical vertebra attaching to back,mechanical cervial attaching to neck,sitting,wires and cables connecting to head
부정적 프롬프트: ugly, disfigured, low quality, blurry
Denoising strength: 0.75
Control weight: 1
Starting Control Step: 0.23
Ending Control Step: 0.8

Outdoor Market

프롬프트: A photo-realistic rendering of a busy market, ((street vendors, fruits, vegetable, shops)), (Photorealistic:1.3), (Highly detailed:1.2), (Natural light:1.2), art inspired by Architectural Digest, Vogue Living, and Elle Decor 
부정적 프롬프트: ugly, disfigured, low quality, blurry, nsfw
Denoising strength: 0.75
Control weight: 0.87
Starting Control Step: 0.23
Ending Control Step: 0.8

흠... 여기까지는 원본 글에 있던 걸 따라해 본 거구요, 이왕이면 저 나름대로 몇가지 만들어봤습니다.ㅎㅎ 우측은 보시는 것처럼 레고인데... 조금만 더 테스트하면 괜찮은 걸 만들 수 있을 듯 싶네요. ㅎㅎ

A photo-realistic rendering of a busy street, crowds and automobiles, merchandise, street performance, vivid color A photo-realistic rendering of a lego bricks, vivid color, creator series, modular, scattered bulk, lego Architecture

이상입니다. 이 글은 Andrew님의 글을 참고로 예제는 제걸로 대체하고 이해하기 쉽도록 고쳐쓴 글입니다.

민, 푸른하늘