Logotipo de Zephyrnet

Imágenes mejoradas con Stable Diffusion en Amazon SageMaker JumpStart

Fecha:

En noviembre de 2022, nosotros anunció que los clientes de AWS pueden generar imágenes a partir de texto con Difusión estable modelos en JumpStart de Amazon SageMaker. Hoy, anunciamos una nueva función que le permite mejorar las imágenes (cambiar el tamaño de las imágenes sin perder calidad) con modelos de difusión estable en JumpStart. Una imagen de baja resolución, borrosa y pixelada se puede convertir en una imagen de alta resolución que parece más suave, clara y detallada. Este proceso, llamado ampliación de la escala, se puede aplicar tanto a imágenes reales como a imágenes generadas por modelos de difusión estable de texto a imagen. Esto se puede utilizar para mejorar la calidad de la imagen en diversas industrias, como el comercio electrónico y los bienes raíces, así como para artistas y fotógrafos. Además, la ampliación puede mejorar la calidad visual de las imágenes de baja resolución cuando se muestran en pantallas de alta resolución.

Stable Diffusion utiliza un algoritmo de inteligencia artificial para mejorar las imágenes, lo que elimina la necesidad de un trabajo manual que puede requerir el llenado manual de espacios en una imagen. Ha sido entrenado en millones de imágenes y puede predecir con precisión imágenes de alta resolución, lo que resulta en un aumento significativo en los detalles en comparación con los escaladores de imágenes tradicionales. Además, a diferencia de las técnicas que no son de aprendizaje profundo, como el vecino más cercano, Stable Diffusion tiene en cuenta el contexto de la imagen, utilizando un mensaje de texto para guiar el proceso de ampliación.

En esta publicación, brindamos una descripción general de cómo implementar y ejecutar la inferencia con el modelo de escalador Stable Diffusion de dos maneras: 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 muestran ejemplos de ampliación realizada por el modelo. A la izquierda está la imagen original de baja resolución ampliada para que coincida con el tamaño de la imagen generada por el modelo. A la derecha está la imagen generada por el modelo.

La primera imagen generada es el resultado de una imagen de gato de baja resolución y el mensaje "un gato blanco".

La segunda imagen generada es el resultado de una imagen de mariposa de baja resolución y el mensaje "una mariposa en una hoja verde".

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 brindan una descripción general de cómo implementar el modelo y ejecutar 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, demostramos cómo entrenar e implementar modelos JumpStart a través de la interfaz de usuario de Studio. El siguiente video muestra cómo encontrar el modelo de escalador Stable Diffusion preentrenado en JumpStart e implementarlo. La página del modelo contiene información valiosa sobre el modelo y cómo usarlo. Para la inferencia, usamos el tipo de instancia ml.p3.2xlarge porque proporciona la aceleración de GPU necesaria para una latencia de inferencia baja a un precio bajo. Después de configurar la instancia de alojamiento de SageMaker, elija Despliegue. Tomará de 5 a 10 minutos hasta que el punto final esté en funcionamiento y listo para responder a las solicitudes de inferencia.

Para acelerar el tiempo de inferencia, JumpStart proporciona un cuaderno de muestra que muestra cómo 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

Puede usar la interfaz de usuario de JumpStart para implementar un modelo previamente entrenado de forma interactiva con solo unos pocos clics. Sin embargo, también puede usar los modelos JumpStart mediante programación mediante las API que están integradas en SageMaker Python SDK.

En esta sección, elegimos un modelo preentrenado apropiado en JumpStart, implementamos este modelo en un punto final de SageMaker y ejecutamos la inferencia en el punto final implementado, todo usando SageMaker Python SDK. Los siguientes ejemplos contienen fragmentos de código. Para obtener el código completo con todos los pasos de esta demostración, consulte el Introducción a JumpStart: mejore la calidad de la imagen guiada por indicaciones 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-upscaling-stabilityai-stable-diffusion-x4-upscaler-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 en un modelo de SageMaker instancia e implementar un punto final:

# 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 nuestro modelo, ¡podemos obtener predicciones de él en tiempo real!

Formato de entrada

El punto final acepta una imagen de baja resolución 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, un aviso 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

Formato de salida

Los siguientes ejemplos de código le dan una idea de cómo se ven los resultados. De manera similar al formato de entrada, el punto final puede responder con los valores RGB sin procesar de la imagen o una imagen codificada en base64. Esto se puede especificar configurando accept a uno de los dos valores:

  • 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 accept = “application/json;jpeg”.

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

content_type = “application/json;jpeg” # We recommend rescaling the image of low_resolution_image such that both height and width are powers of 2.
# This can be achieved by original_image = Image.open('low_res_image.jpg'); rescaled_image = original_image.rescale((128,128)); rescaled_image.save('rescaled_image.jpg')
with open(low_res_img_file_name,'rb') as f: low_res_image_bytes = f.read() encoded_image = base64.b64encode(bytearray(low_res_image_bytes)).decode() payload = { "prompt": "a cat", "image": encoded_image, "num_inference_steps":50, "guidance_scale":7.5} 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

La respuesta del punto final es un objeto JSON que contiene las imágenes generadas y el aviso:

def parse_response(query_response): """Parse response and return the generated images and prompt.""" response_dict = json.loads(query_response) return response_dict["generated_images"], response_dict["prompt"] query_response = query(model_predictor, json.dumps(payload).encode('utf-8'), content_type, accept)
generated_images, prompt = parse_response(query_response)

Parámetros admitidos

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

  • imagen – Una imagen de baja resolución.
  • 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 indicador es una lista de cadenas, el indicador negativo 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.
  • nivel_de_ruido (opcional) – Esto añade ruido a los vectores latentes antes de escalar. Si se especifica, debe ser un número entero.

Puede mejorar recursivamente una imagen invocando el punto final repetidamente para obtener imágenes cada vez de mayor calidad.

Tamaño de imagen y tipos de instancias

Las imágenes generadas por el modelo pueden tener hasta cuatro veces el tamaño de la imagen original de baja resolución. Además, el requisito de memoria del modelo (memoria GPU) crece con el tamaño de la imagen generada. Por lo tanto, si está ampliando una imagen que ya tiene una resolución alta o está ampliando imágenes de forma recursiva, seleccione un tipo de instancia con una gran memoria de GPU. Por ejemplo, ml.g5.2xlarge tiene más memoria GPU que el tipo de instancia ml.p3.2xlarge que usamos anteriormente. Para obtener más información sobre los diferentes tipos de instancias, consulte Tipos de instancias de Amazon EC2.

Ampliación de imágenes pieza por pieza

Para disminuir los requisitos de memoria al ampliar imágenes grandes, puede dividir la imagen en secciones más pequeñas, conocidas como azulejos, y mejorar cada mosaico individualmente. Después de escalar los mosaicos, se pueden combinar para crear la imagen final. Este método requiere adaptar el mensaje para cada mosaico para que el modelo pueda comprender el contenido del mosaico y evitar crear imágenes extrañas. La parte de estilo del indicador debe permanecer constante para todos los mosaicos para facilitar la combinación. Cuando se utilizan configuraciones de eliminación de ruido más altas, es importante ser más específico en el aviso porque el modelo tiene más libertad para adaptar la imagen. Esto puede ser un desafío cuando el mosaico contiene solo un fondo o no está directamente relacionado con el contenido principal de la imagen.

Limitaciones y sesgos

A pesar de que Stable Diffusion tiene un rendimiento impresionante en el escalado, 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.

Para obtener más información sobre limitaciones y sesgos, consulte el Tarjeta de modelo de mejora de difusión estable.

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 mejora de escala Stable Diffusion pre-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 de blog:


Acerca de los autores

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.

Heiko Hotz es arquitecto sénior de soluciones para inteligencia artificial y aprendizaje automático con un enfoque especial en procesamiento de lenguaje natural (NLP), modelos de lenguaje extenso (LLM) e inteligencia artificial generativa. Antes de ocupar este puesto, fue director de ciencia de datos del servicio de atención al cliente de la UE de Amazon. Heiko ayuda a nuestros clientes a tener éxito en su viaje de IA/ML en AWS y ha trabajado con organizaciones en muchas industrias, incluidas las de seguros, servicios financieros, medios y entretenimiento, atención médica, servicios públicos y fabricación. En su tiempo libre, Heiko viaja tanto como puede.

punto_img

Información más reciente

café vc

café vc

punto_img