From Zero to Hero (P27): Điều khiển bố cục với Regional Prompter

Nếu đã sử dụng cả MidJourney và Stable Diffusion, bạn có thể thấy rằng trong khi chỉ bằng cách sử dụng prompt, MJ có thể đưa cho bạn gần như chính xác vị trí của các chủ thể, vị trí màu sắc,…trong khung hình, đặc biệt với sự nâng cấp trong phiên bản 6; thì SD vẫn khá lúng túng, lẫn lộn giữa các prompt. Chúng ta gần như khó có thể tạo ra 2 người riêng biệt trong cùng một khung hình với SD. Một trong những hạn chế này của mô hình Unet đã được mình mô tả trong GIỚI HẠN CỦA PROMPT.

Hãy xem xét ví dụ với prompt sau:

a man driving a red car, the cat is sitting inside

Trong cả 4 ảnh tạo ra thì MJ đều thể hiện đầy đủ nội dung được mô tả, trong khi đó SD chỉ thể hiện được 1 trong 4, những ảnh còn lại hoặc là thiếu, hoặc là sai nội dung.

Tuy nhiên, một lợi thế của Stable Diffusion chính là đây là một chương trình mở, có một cộng đồng mạnh, những extension thực sự chất lượng, và Regional Prompter đã khắc phục được những nhược điểm trên.

:one: Cách thức hoạt động

Đầu tiên, phải nói qua về lịch sử, trước Regional Prompt thì cộng đồng cũng đã nghĩ ra cách khắc phục mô hình Unet này, extension đó là Latent Couple. Mình không giới thiệu về Latent couple bới vì nhà phát triển đã ngừng hỗ trợ extension này, và vì một nhược điểm to dùng sau đây.
Ví dụ bạn muốn tạo 2 chủ thể riêng biệt ở bên trái và bên phải trong một khung hình, ta có thể mô hình hóa việc sử dụng Latent Couple bằng hình vẽ dưới đây:


Kết quả được tạo ra từ Latent Couple (Latent mode) là việc việc hoạt động của các Unet riêng biệt. Mỗi prompt sẽ có một tính toán riêng và sẽ được tổng hợp vào thành kết quả. Như vậy sẽ cần tối thiểu 3 bước, chưa kể nếu có negative prompt thì sẽ cần thêm 1 bước nữa.

Ở Regional Prompter (Attention mode), thay vì cần tính toán nhiều bước thì hệ thống sẽ tính toán cho toàn bộ cả quá trình liên quan đến prompt đó, từ đó tiết kiệm được tối đa thời gian xử lý.
Một nhược điểm nữa của Latent Couple là khi tổng hợp kết quả hay sự thiếu nhất quán của kết quả, việc mà Regional Prompter khắc phục được đáng kể. Để xem thêm ví dụ về nhược điểm này, hãy xem bài so sánh đến từ WRATHGODDESS
(bài viết bằng tiếng anh).

:two: Các chức năng

Dưới đây là giao diện của Regional Prompter

Lời nhắc: Lời nhắc được sử dụng tại vị trí thông thường, nhưng các khu vực khác nhau được phân tách bằng từ khóa “BREAK”. Lời nhắc phủ định (negative prompt) cũng có thể được đặt cho từng khu vực bằng cách phân tách chúng bằng “BREAK” , nhưng nếu “BREAK” không được nhập, phủ định sẽ áp dụng chung cho toàn bộ kết quả.

Active: bật tắt extension

Generation mode: Chuyển chế độ sử dụng Attention hoặc Latent (mặc định sử dụng Attention mode, Laten có thể gặp 1 số lỗi do vấn đề out of date).

Base prompt: Chọn tùy chọn này nếu bạn muốn sử dụng một lời nhắc cơ sở, prompt sẽ áp dụng cho tất cả các khu vực. Điều này sẽ giúp cho tất cả bức ảnh của bạn có độ ổn định cao. Do đó, khi tùy chọn này được bật, sẽ có thêm 1 dấu “BREAK” đứng trước để tách phần prompt cơ sở này.

Tự động bật BASE PROMPT khi ADDBASE được nhập.

Common prompt: Khi tích chức năng này, phần đầu tiên của lời nhắc sẽ thêm vào tất cả nội dung của lời nhắc sau. Tự động bật khi “ADDCOMM” được nhập.
Ví dụ khi bật common prompt với lời nhắc: A BREAK B BREAK C BREAK D sẽ được hiểu là

A B BREAK
A C BREAK
A D

có thể hiểu là có 4 prompt cho 3 vùng chọn. trường hợp dùng đồng thời cả base prompt và common prompt thì thứ tự prompt sẽ là:

common, base, prompt1,prompt2,…

Common negative: Tùy chọn này được bật thì nội dung phủ định cũng sẽ được chia vùng bằng BREAK. nếu không được chọn thì toàn bộ các vùng sử dụng negative prompt chung.
Base Ratio: Đặt tỷ lệ của base prompt; tỷ lệ mặc định là 0,2 thì hình ảnh thu được sẽ bao gồm “20%*BASE PROMPT + 80%*REGION PROMPT” . Nếu nhập một giá trị duy nhất, giá trị tương tự sẽ được áp dụng cho tất cả các khu vực. Nếu nhập nhiều giá trị ví dụ “0,2,0,3,0,5” thì các giá trị sẽ được áp dụng cho các vùng tương ứng.

Matrix
:jigsaw: MATRIX
Matrix là công cụ chính trong Regional Prompter, công cụ này giúp phân chia các vùng theo chiều dọc (Columns), chiều ngang (Rows), ngẫu nhiên (Random).
Divide Ratio: Mặc định số chia là “1,1” thì ảnh sẽ được chia ra hai vùng đều nhau (50%,50%), nếu bạn nhập 3,1,1 thì hình ảnh sẽ được chia thành 60%, 20% và 20%. Phân số cũng có thể được nhập: 0,1,0,1,0,1 tương đương với 1,1,1. Để có độ chính xác cao nhất, hãy nhập giá trị pixel tương ứng với chiều cao/chiều rộng (tương ứng ở chế độ dọc/ngang), ví dụ 300,100,112 → 512.
Ví dụ về Rows Divide Ratio 1,1,1
1,1,1
Vi dụ về Vertical Divide Ratio 1,2,1
1,2,1

Vùng 2D (2D region)
Vùng 2D đơn giản là việc kết hợp các vùng cả theo chiều dọc và chiều ngang. Sử dụng dấu phân cách đặc biệt ( ADDCOL/ADDROW ), khu vực có thể được chia theo chiều ngang và chiều dọc. Bắt đầu từ góc trên bên trái, khu vực được phân chia theo cột khi được phân tách bằng ADDCOL và các hàng khi được phân tách bằng ADDROW . Tỷ lệ chia được chỉ định là tỷ lệ được phân tách bằng dấu chấm phẩy “;” . Mặc dù có thể sử dụng BREAK để mô tả tỷ lệ, nhưng sẽ dễ hiểu hơn nếu COL/ROW được sử dụng. Thêm ADDBASE để sử dụng lời nhắc cơ sở. Nếu không có tỷ lệ nào được chỉ định hoặc nếu tỷ lệ không khớp với số lượng dấu phân cách thì tất cả các vùng sẽ tự động được coi là bội số bằng nhau. Trong chế độ này, hướng được chọn Main Splitting sẽ thay đổi dấu phân cách nào được áp dụng trước.

  • Coloms chế độ này, hình ảnh đầu tiên được chia thành các hàng có ADDROW hoặc ; có tỷ lệ Chia, sau đó mỗi hàng được chia thành các vùng có ADDCOL hoặc , có tỷ lệ Chia.
  • Rows chế độ này, hình ảnh trước tiên được chia thành các cột có ADDCOL hoặc , có tỷ lệ Chia, sau đó mỗi cột được chia thành các vùng có ADDROW hoặc ; có tỷ lệ Chia.
    (chế độ hàng và cột ngược nhau bởi dấu “,” và “;”)
  • Khi tùy chọn lật được bật, nó sẽ hoán đổi , và ;. Điều này cho phép bạn có được một khu vực được xoay 90 độ trong khi vẫn giữ nguyên tỷ lệ được sử dụng trong Cột/Hàng.
    flip
    Trong mọi trường hợp, việc chuyển từ prompt lên các vùng sẽ diễn ra theo thứ tự được thực hiện từ trên xuống dưới, từ trái sang phải.
    Ví dụ dưới đây minh họa cách phân chia vùng này

(blue sky:1.2) ADDCOL
green hair twintail ADDCOL
(aquarium:1.3) ADDROW
(messy desk:1.2) ADDCOL
orange dress and sofa

Active : On
Use base prompt : Off
Main splitting : Columns
Divide Ratio : 1,2,1,1;2,4,6
Base Ratio :
image

Visualize and make template
image
Sau khi nhập xong divide ratio, hãy ấn visualize and make template để hiện các vùng được chia khung. Copy phần “template” vào prompt, và thêm các prompt tương ứng theo thứ tự, phía trước phần in đậm template.

:jigsaw: MASK


Chức năng này khá giống inpaint, tức là bạn có thể vẽ các vùng và tạo ra cac vùng tách biệt nhau. Để bắt đầu, chúng ta chuyển sang tab mask.
Đặt canvas width and height theo hình ảnh mong muốn rồi nhấn create mask area
Vẽ đường viền/khu vực của vùng mong muốn trên khung vẽ, sau đó nhấn draw region+show mask . Thao tác này sẽ điền vào khu vực và tô màu theo region số bạn đã chọn. Lưu ý rằng bản vẽ chỉ có màu đen, việc tô màu và tô màu được thực hiện tự động. Mặt nạ vùng sẽ được hiển thị bên dưới, bên phải.
Nhấn draw region sẽ tự động chuyển sang vùng tiếp theo. Nó cũng sẽ lưu giữ một danh sách các khu vực sau này được sử dụng để chế tạo mặt nạ. Hiện tại có thể sử dụng tối đa 360 vùng.

Ví dụ vùng 1 là màu xanh dương, vùng 2 là màu xanh lá. Muốn vẽ thêm vùng 1, ta chọn region 1 và vẽ tiếp. Để xóa bớt 1 vùng bất kì ta chọn region -1.
Khi các vùng đã được rõ ràng, bạn có thể dùng prompt và BREAK như bình thường. ROW/COL sẽ chuyển thành BREAK.
:zap: Nếu sử dụng base prompt thì hãy lưu ý: bất kỳ vùng không có màu nào sẽ nhận được đầy đủ lời nhắc cơ sở (base ratio =1), trong khi các vùng có màu sẽ nhận được trọng số thông thường. Điều này làm cho base prompt trở thành một công cụ đặc biệt hữu ích để chỉ định cảnh/nền, với ratio = 0(không làm ảnh hưởng đến các vùng, trong khi vẫn có background). Ngược lại, nếu base prompt không được bật thì mọi vùng không có màu sẽ được thêm từ lời nhắc của vùng đầu tiên.
Mọi người có thể vẽ chính xác các vùng bằng các công cụ vẽ chuyên nghiệp và đưa vào upload mask here cus gradio.

PROMPT ((region specification by prompt (experimental))

Đây là tính năng thử nghiệm mới từ regional prompt, thay vì sử dụng các vùng được phân biệt bằng màu sắc, ta sẽ mô tả trực tiếp bằng prompt.
Ví dụ ta có muốn mô tả một cô gái mặc chiếc áo có hình logo quả táo

Prompt: lady smiling and sitting, twintails green hair, white skirt, apple printed shirt


Kết quả không hề như mong muốn, cô gái cầm quả táo thay vì được in lên áo
Thử tăng weight của cụm từ “apple printed shirt” lên 4 lần

Kết quả có táo trên áo, nhưng đi kèm táo ở rất nhiều nơi khác, lộn xộn

Điều regional prompt làm được là nó sẽ phân biệt được đâu là vùng có chiếc áo, và khoanh vùng đó là điều hiện để xuất hiện quả táo, điều này sẽ làm quả táo chỉ xuất hiện trong chiếc áo.

Cách sử dụng region by prompt

Cấu trúc như sau:
baseprompt target1 target2 BREAK
effect1, target1 BREAK
effect2 ,target2

hoặc

target2 baseprompt target1 BREAK
effect1, target1 BREAK
effect2 ,target2

Đầu tiên, viết lời base prompt. Trong base prompt, hãy viết các từ (target1, target2) mà bạn muốn tạo mask. Tiếp theo, phân tách chúng bằng BREAK. Tiếp theo, viết prompt tương ứng với target1. Sau đó nhập dấu phẩy và viết target1. Thứ tự của các mục tiêu trong base
và thứ tự của các mục tiêu được phân tách bằng BREAK có thể quay ngược lại.

Threshold
Ngưỡng được sử dụng để xác định mask được tạo bởi lời nhắc. Điều này có thể được đặt nhiều lần bằng số lượng mask, vì phạm vi rất khác nhau tùy thuộc vào prompt target. Nếu sử dụng nhiều vùng, hãy nhập chúng cách nhau bằng dấu phẩy. Ví dụ, tóc có xu hướng mơ hồ và yêu cầu một giá trị nhỏ, trong khi khuôn mặt có xu hướng lớn và yêu cầu một giá trị lớn hơn. Những thứ này phải được sắp xếp trước BREAK.
Nếu chỉ có một đầu vào được cung cấp cho nhiều vùng thì tất cả chúng đều được coi là có cùng giá trị.

a lady ,hair, face BREAK
red, hair BREAK
tanned ,face
threshold : 0.4,0.6

Prompt and Prompt-EX
Sự khác biệt là trong prompt, các vùng trùng lặp sẽ được thêm vào, trong khi ở prompt-EX, các vùng trùng lặp sẽ được ghi đè tuần tự. Vì chúng được xử lý theo thứ tự, nên việc đặt MỤC TIÊU với diện tích lớn trước tiên sẽ giúp hiệu ứng của các khu vực nhỏ không bị bóp nghẹt dễ dàng hơn.

:three: Ứng dụng của regional prompter

Trở lại ví dụ từ đầu bài viết, giờ chúng ta sẽ dùng regional prompter với baseprompt là “inside the car”, region 1 là a man driving, region 2 là the cat is sitting inside, region 3 là “red car”.
Kết quả cho ra có độ ổn định cao hơn (tuy không phải lần thử nào cũng sẽ có kết quả ưng ý)

Prompt: inside a red car ADDBASE
((a man driving in the car)) ADDCOL
a cat sit next to the man ADDROW
a red car

Ứng dụng trong việc đưa nhiều lora vào trong cùng 1 ảnh
Việc đưa nhiều lora vào trong cùng một ảnh, nhất là các ảnh về các nhân vật có khuôn mặt hoặc trang phục đặc trưng là rất khó với SD. Tuy nhiên chúng ta hoàn toàn có thể dùng regional prompt để chỉnh bố cục và inpaint các lora lại với nhau.
Mình tạo 1 prompt với parameter như bên dưới

cowboy shot, street, ((2girls)),walking together ADDBASE
and18, android 18, solo, blonde hair, blue eyes, belt, jeans, pearl_necklace, bracelet, black gloves, white shirt, short hair, short sleeves, earrings, blue pants, open vest, black vest ADDCOL
solo,gwen stacy,spider web print, spider gwen , body suit , superhero, spider girl
Negative prompt: lowres,bad anatomy,bad hands,text,error,missing fingers,extra digit,fewer digits,cropped,(worst quality:1.2),low quality,normal quality,jpeg artifacts,signature,watermark,username,blurry,lowres graffiti,(low quality lowres simple background:1.1),
Steps: 40, Sampler: Euler a, CFG scale: 7.5, Seed: 4171528298, Size: 512x512, Model hash: e3edb8a26f, Model: ghostmix_v20Bakedvae, VAE hash: 735e4c3a44, VAE: anythingKlF8Anime2VaeFtMse840000_anythingPt.pt, ADetailer model: face_yolov8n.pt, ADetailer confidence: 0.3, ADetailer dilate/erode: 4, ADetailer mask blur: 4, ADetailer denoising strength: 0.4, ADetailer inpaint only masked: True, ADetailer inpaint padding: 32, ADetailer version: 23.9.3, RP Active: True, RP Divide mode: Matrix, RP Matrix submode: Columns, RP Mask submode: Mask, RP Prompt submode: Prompt, RP Calc Mode: Attention, RP Ratios: “1,1”, RP Base Ratios: 0.4, RP Use Base: True, RP Use Common: False, RP Use Ncommon: False, RP Change AND: False, RP LoRA Neg Te Ratios: 0, RP LoRA Neg U Ratios: 0, RP threshold: 0.4, RP LoRA Stop Step: 0, RP LoRA Hires Stop Step: 0, RP Flip: False, Version: v1.7.0

Chúng ta có 2 nhân vật khác nhau tuy nhiên không giống như nhân vật mình mong muốn. Ở đây mình sẽ dùng lora Android18Gwen stacy để vẽ lại 2 nhân vật này.
Dùng inpaint cho từng nhân vật.

Inpaint cho đến khi bạn cảm thấy hài lòng, và sau đó upscale

Kết luật: Regional Prompter không phải hoàn hảo, nhưng cũng là công cụ sẽ giúp ích kha khá trong việc sáng tạo , thậm chí bố cục trong điều chỉnh sản phẩm chụp của bạn.