Pintar imágenes con difusión estable mediante Amazon SageMaker JumpStart

Pintar imágenes con difusión estable mediante Amazon SageMaker JumpStart

En noviembre de 2022, nosotros anunció que los clientes de AWS pueden generar imágenes a partir de texto con Difusión estable modelos usando JumpStart de Amazon SageMaker. Hoy, nos complace presentar una nueva función que permite a los usuarios pintar imágenes con modelos de difusión estable. Repintar se refiere al proceso de reemplazar una parte de una imagen con otra imagen basada en un mensaje de texto. Al proporcionar la imagen original, una imagen de máscara que describe la parte que se va a reemplazar y un mensaje de texto, el modelo de difusión estable puede producir una nueva imagen que reemplaza el área enmascarada con el objeto, el sujeto o el entorno descrito en el mensaje de texto.

Puede usar inpainting para restaurar imágenes degradadas o crear nuevas imágenes con temas o estilos novedosos en ciertas secciones. Dentro del ámbito del diseño arquitectónico, la pintura de difusión estable se puede aplicar para reparar áreas incompletas o dañadas de los planos de construcción, proporcionando información precisa para los equipos de construcción. En el caso de imágenes de resonancia magnética clínica, la cabeza del paciente debe estar restringida, lo que puede conducir a resultados deficientes debido al artefacto de recorte que provoca la pérdida de datos o reduce la precisión del diagnóstico. Repintar imágenes puede ayudar de manera efectiva a mitigar estos resultados subóptimos.

En esta publicación, presentamos una guía completa sobre la implementación y ejecución de la inferencia utilizando el modelo de pintura de difusión estable en dos métodos: a través de la interfaz de usuario (UI) de JumpStart en Estudio Amazon SageMaker, y programáticamente a través de API JumpStart disponible en el SDK de SageMaker Python.

Resumen de la solución

Las siguientes imágenes son ejemplos de inpainting. Las imágenes originales están a la izquierda, la imagen de la máscara está en el centro y la imagen sin pintar generada por el modelo está a la derecha. Para el primer ejemplo, a la modelo se le proporcionó la imagen original, una imagen de máscara y el mensaje textual "un gato blanco, ojos azules, con un suéter, acostado en el parque", así como el mensaje negativo "pies mal dibujados". ” Para el segundo ejemplo, el mensaje textual fue "Una modelo femenina luce elegantemente un vestido largo casual con una combinación de tonos rosa y azul".

Pinte imágenes con Difusión estable utilizando Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.

Ejecutar modelos grandes como Stable Diffusion requiere scripts de inferencia personalizados. Debe ejecutar pruebas de extremo a extremo para asegurarse de que el script, el modelo y la instancia deseada funcionen juntos de manera eficiente. JumpStart simplifica este proceso al proporcionar secuencias de comandos listas para usar que se han probado de forma exhaustiva. Puede acceder a estos scripts con un clic a través de la interfaz de usuario de Studio o con muy pocas líneas de código a través de la API JumpStart.

Las siguientes secciones lo guían a través de la implementación del modelo y la ejecución de la inferencia mediante la interfaz de usuario de Studio o las API de JumpStart.

Tenga en cuenta que al utilizar este modelo, acepta las Licencia CreativeML Open RAIL++-M.

Acceda a JumpStart a través de la interfaz de usuario de Studio

En esta sección, ilustramos la implementación de modelos JumpStart mediante la interfaz de usuario de Studio. El video adjunto muestra cómo ubicar el modelo Stable Diffusion inpainting entrenado previamente en JumpStart e implementarlo. La página del modelo ofrece detalles esenciales sobre el modelo y su uso. Para realizar la inferencia, empleamos el tipo de instancia ml.p3.2xlarge, que ofrece la aceleración de GPU necesaria para la inferencia de baja latencia a un precio asequible. Después de configurar la instancia de hospedaje de SageMaker, elija Despliegue. El terminal estará operativo y preparado para gestionar solicitudes de inferencia en aproximadamente 10 minutos.

JumpStart proporciona un cuaderno de muestra que puede ayudar a acelerar el tiempo que lleva ejecutar la inferencia en el punto final recién creado. Para acceder al cuaderno en Studio, seleccione cuaderno abierto existentes Usar Endpoint desde Studio sección de la página de punto final del modelo.

Utilice JumpStart mediante programación con el SDK de SageMaker

El uso de la interfaz de usuario de JumpStart le permite implementar un modelo previamente entrenado de forma interactiva con solo unos pocos clics. Como alternativa, puede emplear modelos JumpStart mediante programación mediante el uso de API integradas en SageMaker Python SDK.

En esta sección, elegimos un modelo preentrenado adecuado en JumpStart, implementamos este modelo en un punto final de SageMaker y realizamos inferencias en el punto final implementado, todo usando el SDK de Python de SageMaker. Los siguientes ejemplos contienen fragmentos de código. Para acceder al código completo con todos los pasos incluidos en esta demostración, consulte el Introducción a la edición de imágenes JumpStart: pintura de difusión estable ejemplo de cuaderno.

Implementar el modelo preentrenado

SageMaker utiliza contenedores Docker para varias tareas de compilación y tiempo de ejecución. JumpStart utiliza el Contenedores de aprendizaje profundo de SageMaker (DLC) que son específicos del marco. Primero buscamos cualquier paquete adicional, así como scripts para manejar el entrenamiento y la inferencia para la tarea seleccionada. Luego, los artefactos del modelo preentrenado se obtienen por separado con model_uris, lo que proporciona flexibilidad a la plataforma. Esto permite utilizar varios modelos preentrenados con un solo script de inferencia. El siguiente código ilustra este proceso:

model_id, model_version = "model-inpainting-stabilityai-stable-diffusion-2-inpainting-fp16", "*"
# Retrieve the inference docker container uri
deploy_image_uri = image_uris.retrieve( region=None, framework=None, # automatically inferred from model_id image_scope="inference", model_id=model_id, model_version=model_version, instance_type=inference_instance_type,
)
# Retrieve the inference script uri
deploy_source_uri = script_uris.retrieve(model_id=model_id, model_version=model_version, script_scope="inference") base_model_uri = model_uris.retrieve(model_id=model_id, model_version=model_version, model_scope="inference")

A continuación, proporcionamos esos recursos a un modelo de SageMaker instancia e implementar un punto final:

# Create the SageMaker model instance
# Create the SageMaker model instance
model = Model( image_uri=deploy_image_uri, source_dir=deploy_source_uri, model_data=base_model_uri, entry_point="inference.py", # entry point file in source_dir and present in deploy_source_uri role=aws_role, predictor_cls=Predictor, name=endpoint_name,
) # deploy the Model - note that we need to pass the Predictor class when we deploy the model through the Model class,
# in order to run inference through the SageMaker API
base_model_predictor = model.deploy( initial_instance_count=1, instance_type=inference_instance_type, predictor_cls=Predictor, endpoint_name=endpoint_name,
)

Después de implementar el modelo, ¡podemos obtener predicciones en tiempo real de él!

Entrada

La entrada es la imagen base, una imagen de máscara y el mensaje que describe el sujeto, el objeto o el entorno que se sustituirá en la parte enmascarada. La creación de la imagen de máscara perfecta para los efectos de pintura implica varias prácticas recomendadas. Comience con un aviso específico y no dude en experimentar con varias configuraciones de difusión estable para lograr los resultados deseados. Utilice una imagen de máscara que se asemeje mucho a la imagen que pretende pintar. Este enfoque ayuda al algoritmo de pintura a completar las secciones faltantes de la imagen, lo que da como resultado una apariencia más natural. Las imágenes de alta calidad generalmente producen mejores resultados, así que asegúrese de que las imágenes base y de máscara sean de buena calidad y se parezcan entre sí. Además, opte por una imagen de máscara grande y suave para preservar los detalles y minimizar los artefactos.

El punto final acepta la imagen base y la máscara como valores RGB sin procesar o una imagen codificada en base64. El controlador de inferencias decodifica la imagen basándose en content_type:

  • content_type = “application/json”, la carga útil de entrada debe ser un diccionario JSON con los valores RGB sin procesar, la indicación textual y otros parámetros opcionales
  • content_type = “application/json;jpeg”, la carga útil de entrada debe ser un diccionario JSON con la imagen codificada en base64, un indicador de texto y otros parámetros opcionales

Salida

El punto final puede generar dos tipos de salida: una imagen RGB codificada en Base64 o un diccionario JSON de las imágenes generadas. Puede especificar el formato de salida que desea configurando el accept encabezado a "application/json" or "application/json;jpeg" para una imagen JPEG o base64, respectivamente.

  • accept = “application/json”, el punto final devuelve un diccionario JSON con valores RGB para la imagen
  • accept = “application/json;jpeg”, el extremo devuelve un diccionario JSON con la imagen JPEG como bytes codificados con codificación base64.b64

Tenga en cuenta que enviar o recibir la carga útil con los valores RGB sin procesar puede alcanzar los límites predeterminados para la carga útil de entrada y el tamaño de la respuesta. Por lo tanto, recomendamos usar la imagen codificada en base64 configurando content_type = “application/json;jpeg” y aceptar = “aplicación/json;jpeg”.

El siguiente código es un ejemplo de solicitud de inferencia:

content_type = "application/json;jpeg" with open(input_img_file_name, "rb") as f: input_img_image_bytes = f.read()
with open(input_img_mask_file_name, "rb") as f: input_img_mask_image_bytes = f.read() encoded_input_image = base64.b64encode(bytearray(input_img_image_bytes)).decode()
encoded_mask = base64.b64encode(bytearray(input_img_mask_image_bytes)).decode() payload = { "prompt": "a white cat, blue eyes, wearing a sweater, lying in park", "image": encoded_input_image, "mask_image": encoded_mask, "num_inference_steps": 50, "guidance_scale": 7.5, "seed": 0, "negative_prompt": "poorly drawn feet",
} accept = "application/json;jpeg" def query(model_predictor, payload, content_type, accept): """Query the model predictor.""" query_response = model_predictor.predict( payload, { "ContentType": content_type, "Accept": accept, }, ) return query_response query_response = query(model_predictor, json.dumps(payload).encode("utf-8"), content_type, accept)
generated_images = parse_response(query_response)

Parámetros admitidos

Los modelos de pintura de difusión estable admiten muchos parámetros para la generación de imágenes:

  • imagen – La imagen original.
  • máscara – Una imagen en la que la parte oscurecida permanece sin cambios durante la generación de la imagen y se reemplaza la parte blanca.
  • puntual – Un aviso para guiar la generación de la imagen. Puede ser una cadena o una lista de cadenas.
  • num_inference_steps (opcional) – El número de pasos de eliminación de ruido durante la generación de imágenes. Más pasos conducen a una imagen de mayor calidad. Si se especifica, debe ser un entero positivo. Tenga en cuenta que más pasos de inferencia conducirán a un tiempo de respuesta más largo.
  • guía_escala (opcional) – Una escala de guía más alta da como resultado una imagen más estrechamente relacionada con el aviso, a expensas de la calidad de la imagen. Si se especifica, debe ser un flotante. guidance_scale<=1 se ignora.
  • mensaje_negativo (opcional) – Esto guía la generación de imágenes contra este indicador. Si se especifica, debe ser una cadena o una lista de cadenas y debe usarse con guidance_scale. Si guidance_scale está deshabilitado, esto también está deshabilitado. Además, si el aviso es una lista de cadenas, entonces el negative_prompt también debe ser una lista de cadenas.
  • semilla (opcional) – Esto corrige el estado aleatorio para la reproducibilidad. Si se especifica, debe ser un número entero. Siempre que use el mismo indicador con la misma semilla, la imagen resultante siempre será la misma.
  • tamaño_lote (opcional) – El número de imágenes a generar en un solo paso hacia adelante. Si usa una instancia más pequeña o genera muchas imágenes, reduzca batch_size ser un número pequeño (1–2). El número de imágenes = número de avisos*num_images_per_prompt.

Limitaciones y sesgos

Aunque Stable Diffusion tiene un rendimiento impresionante en la pintura, adolece de varias limitaciones y sesgos. Estos incluyen pero no se limitan a:

  • Es posible que el modelo no genere caras o extremidades precisas porque los datos de entrenamiento no incluyen suficientes imágenes con estas características.
  • El modelo fue entrenado en el Conjunto de datos LAION-5B, que tiene contenido para adultos y puede no ser apto para el uso del producto sin más consideraciones.
  • Es posible que el modelo no funcione bien con idiomas que no sean inglés porque el modelo se entrenó en texto en inglés.
  • El modelo no puede generar un buen texto dentro de las imágenes.
  • La pintura de difusión estable normalmente funciona mejor con imágenes de resoluciones más bajas, como 256 × 256 o 512 × 512 píxeles. Cuando se trabaja con imágenes de alta resolución (768 × 768 o superior), el método puede tener dificultades para mantener el nivel deseado de calidad y detalle.
  • Aunque el uso de una semilla puede ayudar a controlar la reproducibilidad, la difusión estable en la pintura aún puede producir resultados variados con ligeras alteraciones en la entrada o los parámetros. Esto puede dificultar el ajuste fino de la salida para requisitos específicos.
  • El método puede tener dificultades para generar texturas y patrones intrincados, especialmente cuando abarcan grandes áreas dentro de la imagen o son esenciales para mantener la coherencia y calidad general de la región pintada.

Para obtener más información sobre limitaciones y sesgos, consulte el Tarjeta modelo Stable Diffusion Repinting.

Solución de pintura con máscara generada a través de un mensaje

CLIPSeq es una técnica avanzada de aprendizaje profundo que utiliza el poder de los modelos CLIP (Contrastive Language-Image Pretraining) previamente entrenados para generar máscaras a partir de imágenes de entrada. Este enfoque proporciona una forma eficiente de crear máscaras para tareas como la segmentación de imágenes, la pintura y la manipulación. CLIPSeq usa CLIP para generar una descripción de texto de la imagen de entrada. A continuación, la descripción del texto se utiliza para generar una máscara que identifica los píxeles de la imagen que son relevantes para la descripción del texto. Luego, la máscara se puede usar para aislar las partes relevantes de la imagen para su posterior procesamiento.

CLIPSeq tiene varias ventajas sobre otros métodos para generar máscaras a partir de imágenes de entrada. Primero, es un método más eficiente, porque no requiere que la imagen sea procesada por un algoritmo de segmentación de imagen separado. En segundo lugar, es más preciso porque puede generar máscaras que se alinean más estrechamente con la descripción del texto de la imagen. En tercer lugar, es más versátil porque puede usarlo para generar máscaras a partir de una amplia variedad de imágenes.

Sin embargo, CLIPSeq también tiene algunas desventajas. En primer lugar, la técnica puede tener limitaciones en cuanto al tema, ya que se basa en modelos CLIP previamente entrenados que pueden no abarcar dominios o áreas de especialización específicos. En segundo lugar, puede ser un método sensible, porque es susceptible de errores en la descripción del texto de la imagen.

Para obtener más información, consulte Estilo de moda virtual con IA generativa usando Amazon SageMaker.

Limpiar

Una vez que haya terminado de ejecutar el cuaderno, asegúrese de eliminar todos los recursos creados en el proceso para garantizar que se detenga la facturación. El código para limpiar el punto final está disponible en el asociado cuaderno.

Conclusión

En esta publicación, mostramos cómo implementar un modelo de pintura de Difusión estable previamente entrenado usando JumpStart. Mostramos fragmentos de código en esta publicación: el código completo con todos los pasos de esta demostración está disponible en el Introducción a JumpStart: mejore la calidad de la imagen guiada por indicaciones cuaderno de ejemplo. Pruebe la solución usted mismo y envíenos sus comentarios.

Para obtener más información sobre el modelo y cómo funciona, consulte los siguientes recursos:

Para obtener más información sobre JumpStart, consulte las siguientes publicaciones:


Acerca de los autores

Pinte imágenes con Difusión estable utilizando Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.Dr. Vivek Madan es un científico aplicado del equipo JumpStart de Amazon SageMaker. Obtuvo su doctorado en la Universidad de Illinois en Urbana-Champaign y fue investigador posdoctoral en Georgia Tech. Es un investigador activo en aprendizaje automático y diseño de algoritmos y ha publicado artículos en conferencias EMNLP, ICLR, COLT, FOCS y SODA.

Pinte imágenes con Difusión estable utilizando Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence. Búsqueda vertical. Ai.alfredo shen es especialista sénior en inteligencia artificial y aprendizaje automático en AWS. Ha estado trabajando en Silicon Valley, ocupando cargos técnicos y gerenciales en diversos sectores, incluidos el de la salud, las finanzas y la alta tecnología. Es un investigador dedicado de AI/ML aplicado, que se concentra en CV, NLP y multimodalidad. Su trabajo ha sido exhibido en publicaciones como EMNLP, ICLR y Public Health.

Sello de tiempo:

Mas de Aprendizaje automático de AWS