pintor-de-anime

xinsir
Texto a imagen

Este es un modelo controlnet-scribble-sdxl-1.0 que puede generar imágenes de muy alta calidad a partir de un boceto de anime. Puede soportar cualquier tipo y ancho de líneas. Como se puede ver en los ejemplos, el boceto puede ser muy simple e impreciso. Suponemos que solo eres un niño o una persona que no sabe nada de dibujo, puedes simplemente garabatear y escribir algunas etiquetas de danbooru para generar una ilustración de anime hermosa. En nuestra evaluación, el modelo logra un rendimiento de última generación, obviamente mejor que el SDXL1.5 Scribble original entrenado por lvming Zhang. El modelo ha sido entrenado con trucos complejos y un conjunto de datos de alta calidad. Además del puntaje estético, la capacidad de seguir indicaciones y la tasa de deformidad de la imagen también han mejorado mucho. AIGC remodelará la industria de la animación, el modelo que lanzamos puede generar imágenes de anime con una puntuación estética más alta que casi todos los sitios web de anime populares en promedio, así que disfrútalo. Si deseas generar imágenes especialmente atractivas visualmente, debes usar etiquetas de danbooru junto con el lenguaje natural.

Como usar

from diffusers import ControlNetModel, StableDiffusionXLControlNetPipeline, AutoencoderKL
from diffusers import DDIMScheduler, EulerAncestralDiscreteScheduler
from controlnet_aux import PidiNetDetector, HEDdetector
from diffusers.utils import load_image
from huggingface_hub import HfApi
from pathlib import Path
from PIL import Image
import torch
import numpy as np
import cv2
import os

def nms(x, t, s):
    x = cv2.GaussianBlur(x.astype(np.float32), (0, 0), s)
    f1 = np.array([[0, 0, 0], [1, 1, 1], [0, 0, 0]], dtype=np.uint8)
    f2 = np.array([[0, 1, 0], [0, 1, 0], [0, 1, 0]], dtype=np.uint8)
    f3 = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]], dtype=np.uint8)
    f4 = np.array([[0, 0, 1], [0, 1, 0], [1, 0, 0]], dtype=np.uint8)
    y = np.zeros_like(x)
    for f in [f1, f2, f3, f4]:
        np.putmask(y, cv2.dilate(x, kernel=f) == x, x)
    z = np.zeros_like(y, dtype=np.uint8)
    z[y > t] = 255
    return z

controlnet_conditioning_scale = 1.0
prompt = "your prompt, the longer the better, you can describe it as detail as possible"
negative_prompt = 'longbody, lowres, bad anatomy, bad hands, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality'
eulera_scheduler = EulerAncestralDiscreteScheduler.from_pretrained("gsdf/CounterfeitXL", subfolder="scheduler")
controlnet = ControlNetModel.from_pretrained("xinsir/anime-painter", torch_dtype=torch.float16)
vae = AutoencoderKL.from_pretrained("gsdf/CounterfeitXL", subfolder="vae", torch_dtype=torch.float16)
pipe = StableDiffusionXLControlNetPipeline.from_pretrained(
    "gsdf/CounterfeitXL",
    controlnet=controlnet,
    vae=vae,
    safety_checker=None,
    torch_dtype=torch.float16,
    scheduler=eulera_scheduler,
)

if random.random() > 0.5:
    image_path = Image.open("your image path, the image can be real or anime, HED detector will extract its edge boundery")
    processor = HEDdetector.from_pretrained('lllyasviel/Annotators')
    controlnet_img = processor(image_path, scribble=False)
    controlnet_img.save("a hed detect path for an image")
    controlnet_img = np.array(controlnet_img)
    controlnet_img = nms(controlnet_img, 127, 3)
    controlnet_img = cv2.GaussianBlur(controlnet_img, (0, 0), 3)
    random_val = int(round(random.uniform(0.01, 0.10), 2) * 255)
    controlnet_img[controlnet_img > random_val] = 255
    controlnet_img = Image.fromarray(controlnet_img)
else:
    control_path = "the sketch image you draw with some tools, like drawing board, the path you save it"
    controlnet_img = Image.open(control_path)
    width, height  = controlnet_img.size
    ratio = np.sqrt(1024. * 1024. / (width * height))
    new_width, new_height = int(width * ratio), int(height * ratio)
    controlnet_img = controlnet_img.resize((new_width, new_height))

images = pipe(
    prompt,
    negative_prompt=negative_prompt,
    image=controlnet_img,
    controlnet_conditioning_scale=controlnet_conditioning_scale,
    width=new_width,
    height=new_height,
    num_inference_steps=30,
).images

images[0].save(f"your image save path, png format is usually better than jpg or webp in terms of image quality but got much bigger")

Funcionalidades

Soporte de cualquier tipo de boceto de anime
Generación de imágenes de alta calidad incluso a partir de bocetos simples
Entrenado con datos complejos y de alta calidad
Mejora en la puntuación estética y la capacidad de seguir indicaciones
Reducción de la tasa de deformidad de la imagen

Casos de uso

Creación de ilustraciones de anime a partir de bocetos simples
Generación de imágenes de alta calidad para contenido visual
Facilitación de la creación de arte para personas sin experiencia en dibujo
Expansión de los límites de la creatividad y la imaginación