Pintar imagens com difusão estável usando o Amazon SageMaker JumpStart

Pintar imagens com difusão estável usando o Amazon SageMaker JumpStart

Em novembro de 2022, anunciou que os clientes da AWS podem gerar imagens de texto com Difusão Estável modelos usando JumpStart do Amazon SageMaker. Hoje, temos o prazer de apresentar um novo recurso que permite aos usuários pintar imagens com modelos de difusão estável. Inpainting refere-se ao processo de substituição de uma parte de uma imagem por outra imagem com base em um prompt textual. Ao fornecer a imagem original, uma imagem de máscara que descreve a parte a ser substituída e um prompt textual, o modelo Stable Diffusion pode produzir uma nova imagem que substitui a área mascarada pelo objeto, assunto ou ambiente descrito no prompt textual.

Você pode usar a pintura interna para restaurar imagens degradadas ou criar novas imagens com temas ou estilos novos em determinadas seções. No âmbito do projeto arquitetônico, a pintura interna Stable Diffusion pode ser aplicada para reparar áreas incompletas ou danificadas de projetos de construção, fornecendo informações precisas para as equipes de construção. No caso de imagens de ressonância magnética clínica, a cabeça do paciente deve ser contida, o que pode levar a resultados abaixo da média devido ao artefato de corte que causa perda de dados ou redução da precisão do diagnóstico. A pintura interna da imagem pode efetivamente ajudar a mitigar esses resultados abaixo do ideal.

Nesta postagem, apresentamos um guia abrangente sobre como implantar e executar inferência usando o modelo de pintura interna Stable Diffusion em dois métodos: por meio da interface do usuário (UI) do JumpStart em Estúdio Amazon SageMaker, e programaticamente por meio de APIs JumpStart disponível no SDK Python do SageMaker.

Visão geral da solução

As imagens a seguir são exemplos de pintura interna. As imagens originais estão à esquerda, a imagem da máscara está no centro e a imagem pintada gerada pelo modelo está à direita. Para o primeiro exemplo, o modelo recebeu a imagem original, uma imagem de máscara e o prompt textual “um gato branco, olhos azuis, vestindo um suéter, deitado no parque”, bem como o prompt negativo “pés mal desenhados. ” Para o segundo exemplo, o prompt textual foi “Uma modelo feminina mostra graciosamente um vestido longo casual com uma mistura de tons de rosa e azul”.

Pinte imagens com difusão estável usando Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.

A execução de modelos grandes como Stable Diffusion requer scripts de inferência personalizados. Você precisa executar testes de ponta a ponta para garantir que o script, o modelo e a instância desejada funcionem juntos com eficiência. O JumpStart simplifica esse processo fornecendo scripts prontos para uso que foram testados de forma robusta. Você pode acessar esses scripts com um clique na interface do usuário do Studio ou com poucas linhas de código no APIs JumpStart.

As seções a seguir orientam você na implantação do modelo e na execução da inferência usando a interface do usuário do Studio ou as APIs do JumpStart.

Observe que, ao usar este modelo, você concorda com os Licença CreativeML Open RAIL++-M.

Acesse o JumpStart pela interface do Studio

Nesta seção, ilustramos a implantação de modelos JumpStart usando a interface do usuário do Studio. O vídeo a seguir demonstra a localização do modelo pré-treinado Stable Diffusion no JumpStart e sua implantação. A página do modelo oferece detalhes essenciais sobre o modelo e seu uso. Para realizar a inferência, empregamos o tipo de instância ml.p3.2xlarge, que fornece a aceleração de GPU necessária para inferência de baixa latência a um preço acessível. Depois que a instância de hospedagem do SageMaker estiver configurada, escolha Implantação. O endpoint estará operacional e preparado para lidar com solicitações de inferência em aproximadamente 10 minutos.

O JumpStart fornece um notebook de exemplo que pode ajudar a acelerar o tempo necessário para executar a inferência no endpoint recém-criado. Para acessar o notebook no Studio, escolha Abra o Notebook no Usar endpoint do Studio seção da página de terminal do modelo.

Use o JumpStart programaticamente com o SDK do SageMaker

A utilização da interface do usuário do JumpStart permite implantar um modelo pré-treinado interativamente com apenas alguns cliques. Como alternativa, você pode empregar modelos JumpStart programaticamente usando APIs integradas no SageMaker Python SDK.

Nesta seção, escolhemos um modelo pré-treinado apropriado no JumpStart, implantamos esse modelo em um endpoint SageMaker e realizamos inferência no endpoint implantado, tudo usando o SageMaker Python SDK. Os exemplos a seguir contêm trechos de código. Para acessar o código completo com todos os passos incluídos nesta demonstração, consulte o Introdução à edição de imagem JumpStart – pintura interna de difusão estável caderno de exemplo.

Implante o modelo pré-treinado

O SageMaker utiliza contêineres do Docker para várias tarefas de compilação e tempo de execução. O JumpStart utiliza o Contêineres de aprendizado profundo do SageMaker (DLCs) que são específicos da estrutura. Primeiro, buscamos quaisquer pacotes adicionais, bem como scripts para lidar com treinamento e inferência para a tarefa selecionada. Em seguida, os artefatos do modelo pré-treinado são buscados separadamente com model_uris, que fornece flexibilidade à plataforma. Isso permite que vários modelos pré-treinados sejam usados ​​com um único script de inferência. O código a seguir ilustra esse processo:

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")

Em seguida, fornecemos esses recursos a um Modelo do SageMaker instância e implante um endpoint:

# 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,
)

Depois que o modelo é implantado, podemos obter previsões em tempo real dele!

Entrada

A entrada é a imagem base, uma imagem de máscara e o prompt que descreve o assunto, objeto ou ambiente a ser substituído na parte mascarada. Criar a imagem de máscara perfeita para efeitos de pintura envolve várias práticas recomendadas. Comece com um prompt específico e não hesite em experimentar várias configurações de difusão estável para obter os resultados desejados. Utilize uma imagem de máscara que se assemelhe à imagem que pretende pintar. Essa abordagem ajuda o algoritmo de pintura interna a completar as seções ausentes da imagem, resultando em uma aparência mais natural. Imagens de alta qualidade geralmente produzem melhores resultados, portanto, certifique-se de que as imagens de base e máscara sejam de boa qualidade e semelhantes entre si. Além disso, opte por uma imagem de máscara grande e suave para preservar os detalhes e minimizar os artefatos.

O endpoint aceita a imagem base e a máscara como valores RGB brutos ou uma imagem codificada em base64. O manipulador de inferência decodifica a imagem com base em content_type:

  • Escolha content_type = “application/json”, a carga de entrada deve ser um dicionário JSON com os valores RGB brutos, prompt de texto e outros parâmetros opcionais
  • Escolha content_type = “application/json;jpeg”, a carga de entrada deve ser um dicionário JSON com a imagem codificada em base64, um prompt de texto e outros parâmetros opcionais

saída

O endpoint pode gerar dois tipos de saída: uma imagem RGB codificada em Base64 ou um dicionário JSON das imagens geradas. Você pode especificar qual formato de saída deseja definindo o accept cabeçalho para "application/json" or "application/json;jpeg" para uma imagem JPEG ou base64, respectivamente.

  • Escolha accept = “application/json”, o endpoint retorna um dicionário JSON com valores RGB para a imagem
  • Escolha accept = “application/json;jpeg”, o terminal retorna um dicionário JSON com a imagem JPEG como bytes codificados com codificação base64.b64

Observe que enviar ou receber a carga útil com os valores RGB brutos pode atingir os limites padrão para a carga útil de entrada e o tamanho da resposta. Portanto, recomendamos usar a imagem codificada em base64 definindo content_type = “application/json;jpeg” e aceite = “aplicativo/json;jpeg”.

O código a seguir é um exemplo de solicitação de inferência:

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 suportados

Os modelos de pintura interna de difusão estável suportam muitos parâmetros para geração de imagens:

  • imagem – A imagem original.
  • máscara – Uma imagem em que a parte escurecida permanece inalterada durante a geração da imagem e a parte branca é substituída.
  • pronto – Um prompt para guiar a geração da imagem. Pode ser uma string ou uma lista de strings.
  • num_inference_steps (opcional) – O número de etapas de redução de ruído durante a geração da imagem. Mais etapas levam a uma imagem de maior qualidade. Se especificado, deve ser um número inteiro positivo. Observe que mais etapas de inferência levarão a um tempo de resposta mais longo.
  • guidance_scale (opcional) – Uma escala de orientação mais alta resulta em uma imagem mais próxima do prompt, prejudicando a qualidade da imagem. Se especificado, deve ser um float. guidance_scale<=1 é ignorado.
  • prompt_negativo (opcional) – Isso orienta a geração da imagem nesse prompt. Se especificado, deve ser uma string ou uma lista de strings e usado com guidance_scale. Se guidance_scale está desabilitado, isso também está desabilitado. Além disso, se o prompt for uma lista de strings, então o negative_prompt também deve ser uma lista de strings.
  • semente (opcional) – Isso corrige o estado aleatório para reprodutibilidade. Se especificado, deve ser um número inteiro. Sempre que você usar o mesmo prompt com a mesma semente, a imagem resultante será sempre a mesma.
  • batch_size (opcional) – O número de imagens a serem geradas em uma única passagem de avanço. Se estiver usando uma instância menor ou gerando muitas imagens, reduza batch_size para ser um número pequeno (1–2). O número de imagens = número de prompts*num_images_per_prompt.

Limitações e preconceitos

Embora a difusão estável tenha um desempenho impressionante na pintura interna, ela sofre de várias limitações e vieses. Estes incluem, mas não estão limitados a:

  • O modelo pode não gerar faces ou membros precisos porque os dados de treinamento não incluem imagens suficientes com esses recursos.
  • O modelo foi treinado no Conjunto de dados LAION-5B, que possui conteúdo adulto e pode não ser adequado para uso do produto sem maiores considerações.
  • O modelo pode não funcionar bem com idiomas diferentes do inglês porque o modelo foi treinado em texto no idioma inglês.
  • O modelo não pode gerar um bom texto nas imagens.
  • A pintura interna de difusão estável geralmente funciona melhor com imagens de resoluções mais baixas, como 256 × 256 ou 512 × 512 pixels. Ao trabalhar com imagens de alta resolução (768 × 768 ou superior), o método pode ter dificuldades para manter o nível desejado de qualidade e detalhes.
  • Embora o uso de uma semente possa ajudar a controlar a reprodutibilidade, a pintura de difusão estável ainda pode produzir resultados variados com pequenas alterações na entrada ou nos parâmetros. Isso pode dificultar o ajuste fino da saída para requisitos específicos.
  • O método pode ter dificuldade em gerar texturas e padrões intrincados, especialmente quando abrangem grandes áreas da imagem ou são essenciais para manter a coerência geral e a qualidade da região pintada.

Para obter mais informações sobre limitações e tendências, consulte o Cartão de modelo de pintura interna de difusão estável.

Solução de pintura interna com máscara gerada por meio de um prompt

O CLIPSeq é uma técnica avançada de aprendizado profundo que utiliza o poder de modelos CLIP (Contrastive Language-Image Pretraining) pré-treinados para gerar máscaras a partir de imagens de entrada. Essa abordagem fornece uma maneira eficiente de criar máscaras para tarefas como segmentação de imagem, pintura interna e manipulação. CLIPSeq usa CLIP para gerar uma descrição de texto da imagem de entrada. A descrição do texto é então usada para gerar uma máscara que identifica os pixels na imagem que são relevantes para a descrição do texto. A máscara pode então ser usada para isolar as partes relevantes da imagem para processamento posterior.

O CLIPSeq tem várias vantagens sobre outros métodos de geração de máscaras a partir de imagens de entrada. Primeiro, é um método mais eficiente, porque não requer que a imagem seja processada por um algoritmo de segmentação de imagem separado. Em segundo lugar, é mais preciso, porque pode gerar máscaras mais alinhadas com a descrição do texto da imagem. Em terceiro lugar, é mais versátil, porque você pode usá-lo para gerar máscaras a partir de uma ampla variedade de imagens.

No entanto, o CLIPSeq também possui algumas desvantagens. Primeiro, a técnica pode ter limitações em termos de assunto, porque depende de modelos CLIP pré-treinados que podem não abranger domínios ou áreas de especialização específicas. Em segundo lugar, pode ser um método sensível, porque é suscetível a erros na descrição do texto da imagem.

Para mais informações, consulte Estilo de moda virtual com IA generativa usando o Amazon SageMaker.

limpar

Depois de concluir a execução do notebook, certifique-se de excluir todos os recursos criados no processo para garantir que a cobrança seja interrompida. O código para limpar o endpoint está disponível no associado caderno.

Conclusão

Nesta postagem, mostramos como implantar um modelo de inpainting Stable Diffusion pré-treinado usando o JumpStart. Mostramos trechos de código nesta postagem - o código completo com todas as etapas desta demonstração está disponível no Introdução ao JumpStart – Melhore a qualidade da imagem guiada por prompt caderno de exemplo. Experimente a solução por conta própria e envie-nos seus comentários.

Para saber mais sobre o modelo e como ele funciona, consulte os seguintes recursos:

Para saber mais sobre o JumpStart, confira as seguintes postagens:


Sobre os autores

Pinte imagens com difusão estável usando Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.Vivek Madan é um cientista aplicado da equipe Amazon SageMaker JumpStart. Ele obteve seu doutorado na Universidade de Illinois em Urbana-Champaign e foi pesquisador de pós-doutorado na Georgia Tech. Ele é um pesquisador ativo em aprendizado de máquina e design de algoritmos e publicou artigos em conferências EMNLP, ICLR, COLT, FOCS e SODA.

Pinte imagens com difusão estável usando Amazon SageMaker JumpStart PlatoBlockchain Data Intelligence. Pesquisa vertical. Ai.Alfred Shen é um especialista sênior em IA/ML da AWS. Ele trabalhou no Vale do Silício, ocupando cargos técnicos e gerenciais em diversos setores, incluindo saúde, finanças e alta tecnologia. Ele é um pesquisador dedicado de AI/ML aplicado, concentrando-se em CV, PNL e multimodalidade. Seu trabalho foi apresentado em publicações como EMNLP, ICLR e Public Health.

Carimbo de hora:

Mais de Aprendizado de máquina da AWS