Compartilhar via


Como usar o modelo de IA MedImageParse para segmentação de imagens médicas

Importante

Os itens marcados (versão prévia) neste artigo estão atualmente em versão prévia pública. Essa versão prévia é fornecida sem um contrato de nível de serviço e não recomendamos isso para cargas de trabalho de produção. Alguns recursos podem não ter suporte ou podem ter restrição de recursos. Para obter mais informações, consulte Termos de Uso Complementares de Versões Prévias do Microsoft Azure.

Importante

Os modelos de IA para serviços de saúde destinam-se à exploração de pesquisa e desenvolvimento de modelos. Os modelos não são projetados ou destinados a serem implantados em ambientes clínicos no estado em que se encontram, nem para uso no diagnóstico ou tratamento de qualquer condição médica ou de saúde, e o desempenho dos modelos individuais para tais finalidades não foi estabelecido. Você é o único responsável por qualquer uso dos modelos de IA para serviços de saúde, incluindo a verificação de resultados e incorporação em qualquer produto ou serviço destinado a fins médicos ou para informar a tomada de decisões clínicas, conformidade com as leis e regulamentações de assistência médica aplicáveis ​​e obtenção de quaisquer autorizações ou aprovações necessárias.

Neste artigo, você aprenderá como implantar o MedImageParse como um ponto de extremidade online para inferência em tempo real e emitir uma chamada básica para a API. As etapas são:

  • Implantar o modelo em uma computação gerenciada auto-hospedada.
  • Conceda permissões ao ponto de extremidade.
  • Enviar dados de teste para o modelo, receber e interpretar resultados.

MedImageParse - segmentação baseada em prompt de imagens médicas

A análise de imagens biomédicas é crucial para a descoberta em campos como biologia celular, patologia e radiologia. Tradicionalmente, tarefas como segmentação, detecção e reconhecimento de objetos relevantes são abordadas separadamente, o que pode limitar a eficácia geral da análise de imagens. No entanto, o MedImageParse unifica essas tarefas por meio da análise de imagens, conduzindo conjuntamente segmentação, detecção e reconhecimento em vários tipos de objetos e modalidades de geração de imagens. Ao aplicar as interdependências entre essas subtarefas, como os rótulos semânticos dos objetos segmentados, o modelo aprimora a exatidão e possibilita novas aplicações. Por exemplo, permite que usuários segmentem todos os objetos relevantes em uma imagem, usando uma solicitação de texto simples. Essa abordagem elimina a necessidade de especificar manualmente caixas delimitadoras para cada objeto.

A imagem a seguir mostra a arquitetura conceitual do modelo MedImageParse, em que um modelo de inserção de imagem é aumentado com uma camada de adaptação de tarefa para produzir máscaras de segmentação e descrições textuais.

Animação do fluxo de dados pelo modelo MedImageParse mostrando a imagem passando pelo modelo emparelhada com um adaptador de tarefa e transformando-se em um conjunto de máscaras de segmentação.

Notavelmente, as máscaras de segmentação e descrições textuais foram alcançadas usando apenas conjuntos de dados de segmentação padrão, aumentados por rótulos em linguagem natural ou descrições harmonizadas com ontologias de objetos biomédicos estabelecidas. Essa abordagem não apenas melhorou o desempenho de tarefas individuais, mas também ofereceu uma ferramenta tudo em um para análise de imagens biomédicas, abrindo caminho para uma descoberta biomédica baseada em imagens mais eficiente e precisa.

Pré-requisitos

Para usar o modelo MedImageParse, você precisa dos seguintes pré-requisitos:

Uma implantação de modelo

Implantação em uma computação gerenciada auto-hospedada

O modelo MedImageParse pode ser implantado em nossa solução de inferência gerenciada auto-hospedada, que permite personalizar e controlar todos os detalhes sobre como o modelo é servido. Você pode implantar o modelo por meio da interface do usuário do catálogo (no Azure AI Foundry ou no Azure Machine Learning Studio) ou implantar programaticamente.

Para implantar o modelo por meio da interface do usuário:

  1. Vá para o catálogo.

  2. Pesquise MedImageParse e selecione o cartão de modelo.

  3. Na página de visão geral do modelo, selecione Implantar.

  4. Se houver a opção de escolher entre implantação de API sem servidor e implantação usando uma computação gerenciada, selecione Computação Gerenciada.

  5. Preencha os detalhes na janela de implantação.

    Observação

    Para implantação em uma computação gerenciada auto-hospedada, você deve ter cota suficiente em sua assinatura. Se você não tiver cota suficiente disponível, poderá usar nosso acesso temporário de cota selecionando a opção Quero usar cota compartilhada e reconheço que esse ponto de extremidade será excluído em 168 horas.

  6. Selecione Implantar.

Para implantar o modelo programaticamente, confira Como implantar e inferir uma implantação de computação gerenciada com código.

Trabalhar com um modelo de segmentação

Nesta seção, você consumirá o modelo e fará chamadas básicas para ele.

Use a API REST para consumir o modelo

Consumir o modelo de segmentação MedImageParse como uma API REST, usando solicitações GET simples ou criando um cliente da seguinte maneira:

from azure.ai.ml import MLClient
from azure.identity import DeviceCodeCredential

credential = DefaultAzureCredential()

ml_client_workspace = MLClient.from_config(credential)

Na configuração de implantação, você pode escolher o método de autenticação. Este exemplo usa a autenticação baseada em token do Azure Machine Learning. Para mais opções de autenticação, confira a página de documentação correspondente. Além disso, observe que o cliente é criado a partir de um arquivo de configuração que é criado automaticamente para máquinas virtuais (VMs) do Azure Machine Learning. Saiba mais na página de documentação da API correspondente.

Fazer chamadas básicas para o modelo

Depois que o modelo for implantado, use o seguinte código para enviar dados e recuperar máscaras de segmentação.

import base64
import json
import os

sample_image_xray = os.path.join(image_path)

def read_image(image_path):
    with open(image_path, "rb") as f:
        return f.read()

sample_image =  "sample_image.png"
data = {
    "input_data": {
        "columns": [ "image", "text" ],
        "index": [ 0 ],
        "data": [
            [
                base64.encodebytes(read_image(sample_image)).decode("utf-8"),
                "neoplastic cells in breast pathology & inflammatory cells"
            ]
        ]
    }
}
data_json = json.dumps(data)

# Create request json
request_file_name = "sample_request_data.json"
with open(request_file_name, "w") as request_file:
    json.dump(data, request_file)

response = ml_client_workspace.online_endpoints.invoke(
    endpoint_name=endpoint_name,
    deployment_name=deployment_name,
    request_file=request_file_name,
)

Usar API REST do MedImageParse

O modelo MedImageParse assume uma interação simples de turno único em que uma solicitação produz uma resposta.

Esquema de solicitação

O conteúdo da solicitação é uma cadeia de caracteres formatada em JSON contendo os seguintes parâmetros:

Chave Tipo Obrigatório/Padrão Descrição
input_data [object] Y Um objeto contendo o conteúdo de dados de entrada

O input_data objeto contém os seguintes campos:

Chave Tipo Obrigatório/Padrão Valores permitidos Descrição
columns list[string] Y "image", "text" Um objeto contendo as cadeias de mapeamento de dados para entradas passadas para o modelo.
index integer Y 0 a 256 Contagem de entradas passadas para o modelo. Você está limitado pela quantidade de dados que pode ser passada em uma única solicitação POST, o que depende do tamanho das suas imagens. Portanto, é razoável manter esse número nas dezenas.
data list[list[string]] Y "" A lista contém os itens passados para o modelo que é definido pelo parâmetro de índice. Cada item é uma lista de duas cadeias de caracteres. A ordem é definida pelo parâmetro columns. A cadeia de caracteres text contém o texto da solicitação. A cadeia de caracteres image são os bytes da imagem codificados usando base64 e decodificados como cadeia de caracteres UTF-8.
OBSERVAÇÃO: A imagem deve ser redimensionada para 1024x1024 pixels antes de ser enviada para o modelo, preservando a taxa de proporção. O espaço vazio deve ser preenchido com pixels pretos. Confira o notebook de exemplo Gerando Segmentação para uma Variedade de Modalidades de Imagem para um exemplo de código de redimensionamento e preenchimento.

O texto de entrada é uma cadeia de caracteres contendo várias sentenças separadas pelo caractere especial &. Por exemplo: tumor core & enhancing tumor & non-enhancing tumor. Neste caso, há três sentenças, portanto a saída consiste em três imagens com máscaras de segmentação.

Exemplo de solicitação

Solicitando a segmentação de todas as células em uma imagem de patologia

{
  "input_data": {
    "columns": [
      "image",
      "text"
    ],
    "index":[0],
    "data": [
      ["iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAAXNSR0IArs4c6QAAAARnQU1BAACx\njwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAAbSURBVBhXY/gUoPS/fhfDfwaGJe///9/J8B8A\nVGwJ5VDvPeYAAAAASUVORK5CYII=\n",
      "neoplastic & inflammatory cells "]
    ]
  }
}

Esquema de resposta

O conteúdo de resposta é uma lista de cadeias de caracteres formatadas em JSON, cada uma correspondente a uma imagem enviada. Cada cadeia de caracteres contém um objeto segmentation_object.

segmentation_object contém os seguintes campos:

Chave Type Descrição
image_features segmentation_mask Um objeto representando as máscaras de segmentação para uma determinada imagem
text_features list[string] Lista de cadeias de caracteres, uma para cada cadeia de caracteres de texto enviada, classificando as máscaras de segmentação em uma das 16 categorias de segmentação biomédica cada: liver, lung, kidney, pancreas, heart anatomies, brain anatomies, eye anatomies, vessel, other organ, tumor, infection, other lesion, fluid disturbance, other abnormality, histology structure, other

segmentation_mask contém os seguintes campos:

Chave Type Descrição
data string Uma matriz NumPy codificada em base64 contendo a máscara de segmentação codificada em um único bit. Pode haver várias instâncias de objetos na matriz retornada. Decodifique e use np.frombuffer para desserializar. A matriz contém uma matriz tridimensional. O tamanho da matriz é 1024x1024 (correspondendo às dimensões da imagem de entrada), com a terceira dimensão representando o número de sentenças de entrada fornecidas. Confira os notebooks de exemplo fornecidos para exemplos de decodificação e uso.
shape list[int] Uma lista representando a forma da matriz (tipicamente [NUM_PROMPTS, 1024, 1024])
dtype string Uma instância da classe NumPy dtype serializada para uma cadeia. Descreve o empacotamento de dados na matriz de dados.

Exemplo de resposta

Uma inferência simples solicitando a segmentação de dois objetos

[
  {
    "image_features": "{ 
    'data': '4oCwUE5HDQoa...',
    'shape': [2, 1024, 1024], 
    'dtype': 'uint8'}",
    "text_features": ['liver', 'pancreas']
  }
]

Formatos de imagem compatíveis

A API do modelo implantado dá suporte a imagens codificadas no formato PNG. Para resultados ideais, recomendamos usar PNGs não compactados/sem perdas com imagens RGB.

Conforme descrito na especificação da API, o modelo só aceita imagens na resolução de 1024x1024pixels. As imagens precisam ser redimensionadas e preenchidas (no caso de taxa de proporção não quadrada).

Confira o notebook Gerando Segmentação para uma Variedade de Modalidades de Imagem para técnicas e código de exemplo úteis para enviar imagens de vários tamanhos armazenadas usando vários formatos de imagem biomédica.

Saiba mais com exemplos

O MedImageParse é um modelo versátil que pode ser aplicado a uma ampla gama de tarefas e modalidades de imagem. Para mais exemplos, confira os seguintes Notebooks Python interativos:

Introdução

Técnicas e exemplos de inferência avançada