Chỉnh sửa ảnh với mô hình khuếch tán

Mô hình đa phương thức với Hugging Face

James Chapman

Curriculum Manager, DataCamp

Diffusers

Các bước của mô hình khuếch tán tạo ảnh từ nhiễu

  • Huấn luyện để ánh xạ nhiễu thành ảnh
  • CLIP + Diffusion → 2 dạng sinh có điều kiện
    • Sinh mới: Văn bản → ảnh
    • Chỉnh sửa: Văn bản+ảnh → ảnh
1 https://huggingface.co/docs/diffusers
Mô hình đa phương thức với Hugging Face

Chỉnh sửa ảnh tuỳ biến

ControlNet: sinh có điều kiện dựa trên ảnh và văn bản

Sơ đồ minh họa chỉnh sửa ảnh tuỳ biến với bộ lọc Canny và ControlNet

1 https://stable-diffusion-art.com/controlnet/
Mô hình đa phương thức với Hugging Face

Chỉnh sửa ảnh tuỳ biến

from diffusers.utils import load_image

image = load_image("http://301.nz/o81bf")

import cv2 from PIL import Image import numpy as np image = cv2.Canny(np.array(image), 100, 200)
image = image[:, :, None] image = np.concatenate([image, image, image], axis=2)

Ảnh Mona Lisa

Mô hình đa phương thức với Hugging Face

Chỉnh sửa ảnh tuỳ biến

from diffusers.utils import load_image

image = load_image("http://301.nz/o81bf")

import cv2
from PIL import Image
import numpy as np

image = cv2.Canny(np.array(image), 100, 200)
image = image[:, :, None]
image = np.concatenate([image, image, image], 
                       axis=2)
canny_image = Image.fromarray(image)

Ảnh Mona Lisa và phiên bản dùng bộ lọc Canny

Mô hình đa phương thức với Hugging Face

Chỉnh sửa ảnh tuỳ biến

from diffusers import StableDiffusionControlNetPipeline
from diffusers import ControlNetModel
import torch

controlnet = ControlNetModel.from_pretrained("lllyasviel/sd-controlnet-canny", 
                                             torch_dtype=torch.float16)


pipe = StableDiffusionControlNetPipeline.from_pretrained( "runwayml/stable-diffusion-v1-5", controlnet=controlnet, torch_dtype=torch.float16 )
pipe = pipe.to("cuda")
Mô hình đa phương thức với Hugging Face

Chỉnh sửa ảnh tuỳ biến

prompt = ["Albert Einstein, 
          best quality, 
          extremely detailed"]

generator = [ torch.Generator(device="cuda").manual_seed(2)]
output = pipe( prompt, canny_image, negative_prompt=["monochrome, lowres, bad anatomy, worst quality, low quality"], generator=generator, num_inference_steps=20)

Albert Einstein trong tư thế Mona Lisa

Mô hình đa phương thức với Hugging Face

Inpainting ảnh

  • Tạo nội dung mới tại một vùng nhất định

Mona Lisa không có mặt nạ

Mô hình đa phương thức với Hugging Face

Inpainting ảnh

  • Tạo nội dung mới tại một vùng nhất định
  • Mặt nạ nhị phân: trắng (1), đen (0)
  • Mặt nạ từ phân đoạn ảnh hoặc do người dùng tạo (ví dụ: dùng InpaintingMask-Generation)

Mona Lisa cùng mặt nạ của chúng ta

Mô hình đa phương thức với Hugging Face

Inpainting ảnh

from diffusers import StableDiffusionControlNetInpaintPipeline, ControlNetModel


controlnet = ControlNetModel.from_pretrained("lllyasviel/control_v11p_sd15_inpaint", torch_dtype=torch.float16, use_safetensors=True)
pipe = StableDiffusionControlNetInpaintPipeline.from_pretrained( "stable-diffusion-v1-5/stable-diffusion-v1-5", controlnet=controlnet, torch_dtype=torch.float16, use_safetensors=True )
Mô hình đa phương thức với Hugging Face

Inpainting ảnh

def make_inpaint_condition(image, image_mask):
    image = np.array(image.convert("RGB")).astype(np.float32) / 255.0
    image_mask = np.array(image_mask.convert("L")).astype(np.float32) / 255.0


image[image_mask > 0.5] = -1.0
image = np.expand_dims(image, 0).transpose(0, 3, 1, 2) image = torch.from_numpy(image) return image control_image = make_inpaint_condition(init_image, mask_image)
Mô hình đa phương thức với Hugging Face

Inpainting ảnh

output = pipe(
    "The head of the mona lisa in the 
  same style and quality as the original
  mona lisa with a clear smile and a 
  slightly smaller head size",

num_inference_steps=40,
eta=1.0,
image=init_image, mask_image=mask_image, control_image=control_image, ).images[0]

Mona Lisa nay mỉm cười

Mô hình đa phương thức với Hugging Face

Ayo berlatih!

Mô hình đa phương thức với Hugging Face

Preparing Video For Download...