Come usare il modello di intelligenza artificiale medImageParse per la segmentazione di immagini mediche
Importante
Gli elementi contrassegnati (anteprima) in questo articolo sono attualmente disponibili in anteprima pubblica. Questa anteprima viene fornita senza un contratto di servizio e non è consigliabile per i carichi di lavoro di produzione. Alcune funzionalità potrebbero non essere supportate o potrebbero presentare funzionalità limitate. Per altre informazioni, vedere le Condizioni supplementari per l'uso delle anteprime di Microsoft Azure.
Importante
I modelli di intelligenza artificiale per il settore sanitario sono destinati alla ricerca e all'esplorazione dello sviluppo di modelli. I modelli non sono progettati o destinati a essere distribuiti in impostazioni cliniche così come sono, né per l'uso nella diagnosi o nel trattamento di qualsiasi condizione sanitaria o medica, e le prestazioni dei singoli modelli per tali scopi non sono state stabilite. L'utente si assume responsabilità e responsabilità esclusiva per qualsiasi uso dei modelli di IA sanitaria, inclusa la verifica degli output e l'incorporazione in qualsiasi prodotto o servizio destinato a uno scopo medico o per informare il processo decisionale clinico, la conformità alle leggi e alle normative sanitarie applicabili e ottenere eventuali autorizzazioni o approvazioni necessarie.
Questo articolo illustra come distribuire MedImageParse come endpoint online per l'inferenza in tempo reale ed eseguire una chiamata di base all'API. I passaggi da eseguire sono:
- Distribuire il modello in un ambiente di calcolo gestito self-hosted.
- Concedere le autorizzazioni all'endpoint.
- Inviare dati di test al modello, ricevere e interpretare i risultati.
MedImageParse - segmentazione basata su richiesta di immagini mediche
L'analisi delle immagini biomediche è fondamentale per la scoperta in campi come biologia cellulare, patologia e radiologia. Tradizionalmente, le attività come la segmentazione, il rilevamento e il riconoscimento degli oggetti pertinenti vengono indirizzate separatamente, che possono limitare l'efficacia complessiva dell'analisi delle immagini. Tuttavia, MedImageParse unifica queste attività tramite l'analisi delle immagini, eseguendo congiuntamente segmentazione, rilevamento e riconoscimento in numerosi tipi di oggetti e modalità di imaging. Applicando le interdipendenze tra queste sottoattività, ad esempio le etichette semantiche degli oggetti segmentati, il modello migliora l'accuratezza e abilita nuove applicazioni. Ad esempio, consente agli utenti di segmentare tutti gli oggetti pertinenti in un'immagine usando una semplice richiesta di testo. Questo approccio elimina la necessità di specificare manualmente i rettangoli di selezione per ogni oggetto.
L'immagine seguente mostra l'architettura concettuale del modello MedImageParse in cui un modello di incorporamento di immagini è aumentato con un livello di adattamento delle attività per produrre maschere di segmentazione e descrizioni testuali.
Notevolmente, le maschere di segmentazione e le descrizioni testuali sono state ottenute usando solo set di dati di segmentazione standard, incrementati da etichette in linguaggio naturale, o descrizioni armonizzate con le onlogie degli oggetti biomedici stabiliti. Questo approccio non solo ha migliorato le prestazioni delle singole attività, ma ha anche offerto uno strumento all-in-one per l'analisi delle immagini biomediche, aprendo la strada alla scoperta biomedica più efficiente e accurata basata su immagini.
Prerequisiti
Per usare il modello MedImageParse, sono necessari i prerequisiti seguenti:
Una distribuzione modello
Distribuzione in un ambiente di calcolo gestito self-hosted
Il modello MedImageParse può essere distribuito nella soluzione di inferenza gestita self-hosted, che consente di personalizzare e controllare tutti i dettagli su come viene gestito il modello. È possibile distribuire il modello tramite l'interfaccia utente del catalogo (in AI Studio o studio di Azure Machine Learning) o distribuire a livello di codice.
Per distribuire il modello tramite l'interfaccia utente:
Passare al catalogo.
Cercare MedImageParse e selezionare la scheda del modello.
Nella pagina di panoramica del modello selezionare Distribuisci.
Se si ha la possibilità di scegliere tra la distribuzione dell'API serverless e la distribuzione usando un calcolo gestito, selezionare Calcolo gestito.
Compilare i dettagli nella finestra di distribuzione.
Nota
Per la distribuzione in un ambiente di calcolo gestito self-hosted, è necessario disporre di una quota sufficiente nella propria sottoscrizione. Se non è disponibile una quota sufficiente, è possibile usare l’accesso temporaneo alla quota selezionando l'opzione Voglio usare la quota condivisa e accetto che questo endpoint venga eliminato tra 168 ore.
Seleziona Distribuisci.
Per distribuire il modello a livello di codice, vedere Come distribuire e dedurre una distribuzione di calcolo gestita con codice.
Usare un modello di segmentazione
In questa sezione si utilizza il modello e si effettuano chiamate di base.
Usare l'API REST per usare il modello
Utilizzare il modello di segmentazione MedImageParse come API REST, usando richieste GET semplici o creando un client come indicato di seguito:
from azure.ai.ml import MLClient
from azure.identity import DeviceCodeCredential
credential = DefaultAzureCredential()
ml_client_workspace = MLClient.from_config(credential)
Nella configurazione di distribuzione è possibile scegliere il metodo di autenticazione. Questo esempio usa l'autenticazione basata su token di Azure Machine Learning. Per altre opzioni di autenticazione, vedere la pagina della documentazione corrispondente. Si noti anche che il client viene creato da un file di configurazione creato automaticamente per le macchine virtuali di Azure Machine Learning. Per altre informazioni, vedere la pagina della documentazione dell'API corrispondente.
Effettuare chiamate di base al modello
Dopo aver distribuito il modello, usare il codice seguente per inviare dati e recuperare maschere di segmentazione.
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,
)
Usare l'API REST MedImageParse
Il modello MedImageParse presuppone una semplice interazione a turno singolo in cui una richiesta produce una risposta.
Schema della richiesta
Il payload della richiesta è una stringa in formato JSON contenente i parametri seguenti:
Chiave | Type | Obbligatorio/Predefinito | Descrizione |
---|---|---|---|
input_data |
[object] |
Y | Oggetto contenente il payload dei dati di input |
L'oggetto input_data
contiene i campi seguenti:
Chiave | Type | Obbligatorio/Predefinito | Valori consentiti | Descrizione |
---|---|---|---|---|
columns |
list[string] |
Y | "image" , "text" |
Oggetto contenente le stringhe che esegue il mapping dei dati agli input passati al modello. |
index |
integer |
Y | 0 - 256 | Numero di input passati al modello. È possibile limitare la quantità di dati che è possibile passare in una singola richiesta POST, che dipende dalle dimensioni delle immagini. Pertanto, è ragionevole mantenere questo numero nelle decine. |
data |
list[list[string]] |
Y | "" | L'elenco contiene gli elementi passati al modello definito dal parametro index. Ogni elemento è un elenco di due stringhe. L'ordine è definito dal columns parametro . La text stringa contiene il testo del prompt. La image stringa è i byte di immagine codificati usando base64 e decodificati come stringa utf-8. NOTA: l'immagine deve essere ridimensionata in 1024x1024 pixel prima dell'invio al modello, mantenendo le proporzioni. Lo spazio vuoto deve essere riempito con pixel neri. Per un esempio di ridimensionamento e riempimento del codice, vedere il notebook di esempio Generazione di segmentazione per un'ampia gamma di modalità di imaging.Il testo di input è una stringa contenente più frasi separate dal carattere & speciale . Ad esempio: tumor core & enhancing tumor & non-enhancing tumor . In questo caso, sono presenti tre frasi, quindi l'output è costituito da tre immagini con maschere di segmentazione. |
Esempio di richiesta
Richiesta di segmentazione di tutte le cellule in un'immagine patologia
{
"input_data": {
"columns": [
"image",
"text"
],
"index":[0],
"data": [
["iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAAXNSR0IArs4c6QAAAARnQU1BAACx\njwv8YQUAAAAJcEhZcwAAFiUAABYlAUlSJPAAAAAbSURBVBhXY/gUoPS/fhfDfwaGJe///9/J8B8A\nVGwJ5VDvPeYAAAAASUVORK5CYII=\n",
"neoplastic & inflammatory cells "]
]
}
}
Schema della risposta
Il payload della risposta è un elenco di stringhe in formato JSON, ognuna corrispondente a un'immagine inviata. Ogni stringa contiene un segmentation_object
oggetto .
segmentation_object
contiene i campi seguenti:
Chiave | Type | Descrizione |
---|---|---|
image_features |
segmentation_mask |
Oggetto che rappresenta le maschere di segmentazione per una determinata immagine |
text_features |
list[string] |
Elenco di stringhe, una per ogni stringa di testo inviata, classificando le maschere di segmentazione in una delle 16 categorie di segmentazione biomedica ognuna: liver , heart anatomies lung kidney pancreas brain anatomies eye anatomies vessel other organ tumor infection other lesion fluid disturbance other abnormality histology structure other |
segmentation_mask
contiene i campi seguenti:
Chiave | Type | Descrizione |
---|---|---|
data |
string |
Matrice NumPy con codifica base64 contenente la maschera di segmentazione con codifica one-hot. Potrebbero essere presenti più istanze di oggetti nella matrice restituita. Decodificare e usare np.frombuffer per deserializzare. La matrice contiene una matrice tridimensionale. La dimensione della matrice è 1024x1024 (corrispondente alle dimensioni dell'immagine di input), con la terza dimensione che rappresenta il numero di frasi di input fornite. Vedere i notebook di esempio forniti per esempi di decodifica e utilizzo. |
shape |
list[int] |
Elenco che rappresenta la forma della matrice (in [NUM_PROMPTS, 1024, 1024] genere ) |
dtype |
string |
Istanza della classe dtype NumPy serializzata in una stringa. Descrive la compressione dei dati nella matrice di dati. |
Risposta di esempio
Una semplice inferenza che richiede la segmentazione di due oggetti
[
{
"image_features": "{
'data': '4oCwUE5HDQoa...',
'shape': [2, 1024, 1024],
'dtype': 'uint8'}",
"text_features": ['liver', 'pancreas']
}
]
Formati di immagine supportati
L'API del modello distribuito supporta immagini codificate in formato PNG. Per ottenere risultati ottimali, è consigliabile usare i gruppi di sicurezza APN non compressi/senza perdita con immagini RGB.
Come descritto nella specifica DELL'API, il modello accetta solo immagini nella risoluzione dei 1024x1024
pixel. Le immagini devono essere ridimensionate e riempite (nel caso di proporzioni non quadrate).
Per le tecniche e il codice di esempio utili per l'invio di immagini di immagini di varie dimensioni archiviate usando vari formati di imaging biomedico, vedere il notebook Generazione di segmentazione.
Altre informazioni dagli esempi
MedImageParse è un modello versatile che può essere applicato a un'ampia gamma di attività e modalità di imaging. Per altri esempi, vedere i notebook Python interattivi seguenti:
Introduzione
- Distribuzione e uso di MedImageParse: informazioni su come distribuire il modello MedImageParse e integrarlo nel flusso di lavoro.
Tecniche e esempi avanzati di inferenza
- Generazione di segmentazione per una varietà di modalità di imaging: comprendere come usare MedImageParse per segmentare un'ampia gamma di immagini mediche diverse e apprendere alcune tecniche di richiesta.