Zephyrnet-logo

Annoteer DICOM-afbeeldingen en bouw een ML-model met behulp van het MONAI-framework op Amazon SageMaker

Datum:

DICOM (Digital Imaging and Communications in Medicine) is een beeldformaat dat visualisaties van röntgenstralen en MRI's en alle bijbehorende metadata bevat. DICOM is de standaard voor medische professionals en onderzoekers in de gezondheidszorg voor het visualiseren en interpreteren van röntgenfoto's en MRI's. Het doel van dit bericht is om twee problemen op te lossen:

  • Visualiseer en label DICOM-afbeeldingen met behulp van een aangepaste workflow voor gegevenslabeling op Amazon SageMaker Grondwaarheid, een volledig beheerd gegevenslabelservice ondersteuning van ingebouwde of aangepaste workflows voor het labelen van gegevens
  • Ontwikkel een DenseNet-model voor beeldclassificatie met behulp van de: MONA kader op Amazon Sage Maker, een uitgebreid en volledig beheerd datawetenschapsplatform met speciaal ontwikkelde tools voor het voorbereiden, bouwen, trainen en implementeren van machine learning (ML)-modellen in de cloud

Voor dit bericht gebruiken we een X-Ray DICOM-afbeeldingsgegevensset op de borst van de MIMIC thoraxröntgendatabase (MIMIC-CXR), een openbaar beschikbare database van thoraxfoto's in DICOM-formaat en de bijbehorende radiologierapporten als vrije tekstbestanden. Om toegang te krijgen tot de bestanden, moet u een geregistreerde gebruiker en onderteken de overeenkomst voor gegevensgebruik.

We labelen de afbeeldingen via het privépersoneel van Ground Truth. AWS kan professioneel beheerd personeel ook ervaring bieden met het labelen van medische beelden.

Overzicht oplossingen

Het volgende diagram toont de workflow op hoog niveau met de volgende belangrijke componenten:

  1. De DICOM-afbeeldingen worden opgeslagen in een derde partij beeldarchiverings- en communicatiesysteem (PACS) of Leverancier neutraal archief (VNA), en opgehaald via DICOMwebTM.
  2. An invoer manifest.json-bestand is geüpload naar Amazon eenvoudige opslagservice (Amazon S3). Het bestand bevat de DICOM-instantie-ID als gegevensbron en mogelijke labels die door annotators worden gebruikt wanneer ze de labeltaken uitvoeren.
  3. Twee AWS Lambda functies zijn essentieel voor het creëren van labeltaken op Ground Truth:
  4. A HTML-sjabloon met Crowd-elementen voor het aanleveren van de labeling jobs en het verwerken van het output object. Vervolgens wordt de uitvoer van labeltaken opgeslagen in een uitvoerlabel S3-emmer.
  5. A SageMaker notitieboek kan de uitvoer van labeltaken ophalen en deze gebruiken om een ​​bewaakt ML-model te trainen.

We hebben een HTML-sjabloon gebouwd die u kunt gebruiken om de röntgenfoto's van de borstkas in te delen in een of meer categorieën, van 13 mogelijke acute en chronische cardiopulmonale aandoeningen. De HTML-sjabloon die bovenop is gebouwd hoeksteen.js ondersteunt het ophalen van DICOM-afbeeldingen en interactieve visualisatie, plus verschillende annotaties en algemene Hoeksteengereedschappen als voorbeeld.

In de volgende secties lopen we door het bouwen van de DICOM-werkstroom voor gegevenslabeling en het uitvoeren van ML-modeltraining met behulp van de uitvoer van de labeltaken.

Een PACS van derden implementeren op AWS

We gebruiken Orthanc als een open-source, lichtgewicht PACS voor deze post, waarin elk PACS of VNA dat DICOMweb ondersteuntTM kan worden gebruikt. U kunt de Orthanc voor Docker container op AWS door het volgende te starten: AWS CloudFormatie stapel:

Vul de vereiste informatie in tijdens de implementatie, inclusief: Amazon Elastic Compute-cloud (Amazone EC2) sleutelpaar om toegang te krijgen tot de hosting EC2-instantie en netwerkinfrastructuur (VPC en subnetten). Er is een NGINX-server toegevoegd in de container om proxy het HTTPS-verkeer naar de Orthanc-server op poort 8042, die ook Access-Control-Allow-Origin-headers toevoegt voor Cross-Origin Resource Sharing (CORS). De Orthanc-container wordt ingezet op Amazon Elastic Container-service (Amazon ECS) en aangesloten op een Amazon Aurora PostgreSQL-database.

Nadat de CloudFormation-stack met succes is gemaakt, noteert u de Orthanc-eindpunt-URL op de Uitgangen Tab.

Maak de Lambda-functies, S3-bucket en SageMaker-notebookinstantie

De volgende CloudFormation-stack creëert de vereiste Lambda-functies met de juiste AWS Identiteits- en toegangsbeheer (IAM) rollen, S3-bucket voor invoer- en uitvoerbestanden en SageMaker-notebookinstantie met voorbeeld Jupyter-notebook:

Voor de parameter PreLabelLambdaSourceEndpointURL, voer de Orthanc-eindpunt-URL van de vorige stap in, die de pre-labeling-taak Lambda-functie gebruikt om WADO-URI te genereren voor een gegeven DICOM-instantie-ID. We raden aan om een ​​notebook-instantietype ml.m5.xlarge te maken om de ML-modellering uit te voeren na beeldannotaties.

Noteer na de stapelimplementatie de uitvoer, inclusief de SMGTLabelingExecutionRole en SageMakerAnnotationS3Bucket waarden.

De IAM-rol SMGTLabelingExecutionRole wordt gebruikt om de Ground Truth-labelingtaak te maken. Voor meer informatie over het toevoegen van deze beleidsregels, evenals een stapsgewijze zelfstudie over het uitvoeren van de Ground Truth-labelingtaak na het starten van de CloudFormation-stack, zie Bouw een aangepaste workflow voor gegevensetikettering met Amazon SageMaker Ground Truth.

Upload DICOM-afbeeldingen en bereid het invoermanifest voor

U kunt de DICOM-afbeeldingen uploaden naar de Orthanc-server via de web-UI of de WADO-RS REST-API. Nadat de DICOM-afbeeldingen zijn geüpload, kunt u de DICOM-instantie-ID's ervoor ophalen en een manifestbestand met de instantie-ID's genereren. Elk JSON-object, gescheiden door een standaard regeleinde in het manifestbestand, vertegenwoordigt een invoertaak die naar het personeel wordt gestuurd voor labeling. Het gegevensobject bevat in dit geval de instantie-ID en metagegevens voor de potentiële labels, dit zijn 13 mogelijke ziekten die door de afbeelding worden aangegeven. Ervan uitgaande dat één DICOM-instantie-ID is 502b0a4b-5cb43965-7f092716-bd6fe6d6-4f7fc3ce, ziet het bijbehorende JSON-object in het manifestbestand er als volgt uit:

{"source": "502b0a4b-5cb43965-7f092716-bd6fe6d6-4f7fc3ce", "labels": "Atelectasis,Cardiomegaly,Consolidation,Edema,Enlarged Cardiomediastinum,Fracture,Lung Lesion,Lung Opacity,Pleural Effusion,Pneumonia,Pneumothorax,Pleural Other,Support Devices,No Finding"}

Nadat het manifest.json-bestand is gecompileerd, uploadt u het naar de eerder gemaakte S3-bucket: SageMakerAnnotationS3Bucket.

Een aangepaste gegevenslabeltaak maken:

U zou nu een aangepaste labeltaak op Ground Truth moeten kunnen maken:

  1. Maak een privé-werkteam en voeg leden toe aan het team.

De werknemers ontvangen een e-mail met de inlog-URL van de labeling portal, die ook beschikbaar is op de Amazon SageMaker-console.

AWS kan ook medische beeldvormingsexperts leveren om uw gegevens te labelen. Neem voor meer informatie contact op met uw AWS-team.

  1. Specificeer de invoer- en uitvoergegevenslocaties met behulp van de SageMakerAnnotationS3Bucket eerder gemaakte emmer.
  2. Specificeren SMGTLabelingExecutionRole als de IAM-rol voor de labeltaak.
  3. Voor Taakcategorie, kiezen Eigen.

  1. Voer de inhoud in vloeistof.html in de Custom Template tekst veld.
  2. Configureer de gt-prelabel-task-lambda en gt-postlabel-task-lambda eerder gecreëerde functies.
  3. Kies creëren.

  1. Nadat u de aangepaste labeltaak hebt geconfigureerd, kiest u: Voorbeschouwing.

De volgende video toont onze preview.

Als u een eigen personeelsbestand hebt gemaakt, kunt u naar de: Werknemers labelen en zoek de link naar de annotatieconsole.

Je kunt aan de slag met een basis HTML-sjabloon, of wijzig de voorbeeld UI's van Ground Truth-taken voor het labelen van afbeeldingen, tekst en audiogegevens. De basisbouwstenen voor de aangepaste sjabloon zijn: Menigte HTML-elementen. De menigte-vorm en menigte-knop zijn essentieel voor het indienen van de annotaties bij Ground Truth. Daarnaast heb je nodig Vloeistof objecten in de sjabloon voor taakautomatisering, in het bijzonder het taakinvoerobject dat wordt ingelezen door de pre-labeling Lambda-functie:

<div id="document-text" style="display: none;" {{ task.input.text }}
</div>
<div id="document-image" style="display:none;"> {{ task.input.taskObject }}
</div>
<div id="document-labels"> {{ task.input.labels }}
</div>

We maken gebruik van de Cornerstone JavaScript-bibliotheek om de gebruikersinterface voor labels te bouwen die een DICOM-afbeelding weergeeft in moderne webbrowsers die het HTML5-canvaselement ondersteunen, en om Cornerstone-tools te gebruiken om interacties te ondersteunen en om region of interest (ROI)-annotaties in verschillende vormen mogelijk te maken. Daarnaast gebruiken we de Hoeksteen WADO Image Loader ophalen Webtoegang tot DICOM Objects (WADO) URI door de DICOMwebTM inpluggen in een externe Orthanc-server.

De volgende twee functies zijn belangrijk voor het ophalen en bekijken van het DICOM-beeld:

  • DownloadenBekijken() - Voegt toe wadouri: naar het begin van de URL zodat de cornerstone.js bestand kan de afbeeldingslader vinden
  • laadAndViewImage() - Gebruikt de Cornerstone-bibliotheek om de afbeelding weer te geven en biedt extra functionaliteiten zoals zoomen, pannen en ROI-annotatie

U zou in staat moeten zijn om elke DICOM-afbeelding te annoteren met het volgende: aangepaste HTML-sjabloon, waarin de mogelijke labels worden weergegeven als meerdere optieselecties voor de afbeeldingsclassificatietaak.

Bouw een ML-model met behulp van het MONAI-framework

Nu we een gelabelde dataset hebben in de vorm van het output-manifest.json-bestand, kunnen we het ML-modelbouwproces starten. We hebben eerder een SageMaker-notebookinstantie gemaakt via onze stackimplementatie. Als alternatief kunt u maak een nieuwe notebookinstantie. De MONAI-bibliotheek en andere aanvullende pakketten worden beheerd in requirements.txt, die in de dezelfde map van het trainingsscript.

Gegevens laden en voorverwerking

Nadat u de Jupyter-notebook hebt geopend, laadt u de output-manifest.json bestand met de DICOM-URL's en labels.

Het volgende voorbeeld van dicom_training.ipynb parseert de gelabelde dataset van output-manifest.json:

# Get SageMaker Ground Truth labeling data from annotation file
datadir = 'data'
metadata = '{}/output-manifest.json'.format(datadir)
s3 = boto3.client('s3')
s3.download_file(bucket, bucket_path, metadata) # Load Labels
with open(metadata) as f: manifest = json.load(f) class_names = list(json.loads(manifest[0]['annotations'][0]['annotationData']['content'])['disease'].keys()) for i, j in enumerate(manifest): label_dict = json.loads(json.loads(manifest[i]['annotations'][0]['annotationData']['content'])['labels']) image_url_list.extend([label_dict['imageurl']]) image_label_list.extend([class_names.index(label_dict['label'][0])])

Nu we de DICOM-URL's in image_url_list en bijbehorende labels in image_label_list, kunnen we de DICOM-bestanden van de Orthanc DICOM-server rechtstreeks naar Amazon S3 downloaden voor SageMaker-training:

import urllib3
import requests
import os
from io import BytesIO
import contextlib; image_file_list = [] #Load DICOM images to S3
for i, j in enumerate(image_url_list): file_name = image_url_list[i].split("/file")[0].split("instances/")[1] + '.dcm' response = requests.get(image_url_list[i], auth=(user, password), stream=True, verify=False) fp = BytesIO(response.content) s3.upload_fileobj(fp, bucket, file_name) image_file_list.append(file_name)

Nadat u de afbeeldingen naar uw S3-bucket hebt geladen, kunt u een voorbeeld van de afbeeldingen weergeven met labels uit het geparseerde JSON-bestand met behulp van het MONAI-framework:

import monai
from monai.transforms import Compose, LoadImage, Resize, SqueezeDim
import matplotlib.pyplot as plt #Display sample of DICOM Images
trans = Compose([LoadImage(image_only=True), Resize(spatial_size=(108,96)),SqueezeDim()])
plt.subplots(1, 3, figsize=(8, 8))
for i in range(0,3): s3.download_file(bucket, image_file_list[i], datadir+'/'+image_file_list[i]) img = trans(datadir+'/'+image_file_list[i]) plt.subplot(1, 3, i + 1) plt.xlabel(class_names[image_label_list[i]]) plt.imshow(img, cmap='gray')
plt.tight_layout()
plt.show()

De volgende afbeeldingen tonen een voorbeelduitvoer van DICOM-afbeeldingen met labels.

We gebruiken de MONAI-transformaties tijdens modeltraining om de DICOM-bestanden direct te laden en voor te verwerken. MONAI heeft transformaties die zowel woordenboek- als array-indelingen ondersteunen en is gespecialiseerd in de hoge dimensionaliteit van medische DICOM-beelden. De transformaties omvatten verschillende categorieën, zoals bijsnijden en pad, intensiteit, I/O, nabewerking, ruimtelijk en hulpprogramma's. In het volgende fragment koppelt de klasse Compose een reeks afbeeldingstransformaties aan elkaar en retourneert een enkele tensor van de afbeelding:

#Load and transform DICOM images
class DICOMDataset(Dataset): def __init__(self, image_files, labels, transforms): self.image_files = image_files self.labels = labels self.transforms = transforms def __len__(self): return len(self.image_files) def __getitem__(self, index): return self.transforms(self.image_files[index]), self.labels[index] train_transforms = Compose([ LoadImage(image_only=True), ScaleIntensity(), RandRotate(range_x=15, prob=0.5, keep_size=True), RandFlip(spatial_axis=0, prob=0.5), RandZoom(min_zoom=0.9, max_zoom=1.1, prob=0.5, keep_size=True), Resize(spatial_size=(108,96)), ToTensor()
]) dataset = DICOMDataset(trainX, trainY, train_transforms) train_sampler = torch.utils.data.distributed.DistributedSampler(dataset) if is_distributed else None train_loader = torch.utils.data.DataLoader(dataset, batch_size=batch_size, shuffle=train_sampler is None, sampler=train_sampler, **kwargs)
…

Modeltraining

MONAI omvat diepe neurale netwerken zoals UNet, DenseNet, GAN en andere, en biedt schuifvenster-inferenties voor grote medische beeldvolumes. In het DICOM-beeldclassificatiemodel trainen we het MONAI DenseNet-model op de DICOM-beelden die zijn geladen en getransformeerd met behulp van de DataLoader klasse in de vorige stappen voor 10 tijdperken tijdens het meten van verlies. Zie de volgende code:

#Instantiate model device = torch.device("cuda")
model = densenet121( spatial_dims=spatial_dims_num, in_channels=in_channels_num, out_channels=out_channels_num
).to(device)
loss_function = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), 1e-5) #Train DICOM model
for epoch in range(epoch_num): model.train() epoch_loss = 0 step = 0 for batch_data in train_loader: step += 1 inputs, labels = batch_data[0].to(device), batch_data[1].to(device) optimizer.zero_grad() outputs = model(inputs) loss = loss_function(outputs, labels) loss.backward() optimizer.step() epoch_loss += loss.item() epoch_len = len(train_loader.dataset) // train_loader.batch_size epoch_loss /= step epoch_loss_values.append(epoch_loss)

In het volgende voorbeeld ziet u hoe u de SageMaker Python SDK in een Jupyter-notebook gebruikt om een ​​trainingstaak te instantiëren en het DICOM-modeltrainingscript uit te voeren:

inputs = sagemaker_session.upload_data(path=datadir, bucket=bucket) from sagemaker.pytorch import PyTorch estimator = PyTorch(entry_point='monai_dicom.py', source_dir='source', role=role, framework_version='1.5.0', py_version='py3', instance_count=1, instance_type='ml.m5.xlarge', hyperparameters={ 'backend': 'gloo', 'epochs': 10 }) estimator.fit({'train': inputs})

Wanneer u de belt fit methode in dit voorbeeld, wordt het trainingsexemplaar gestart met een rekengrootte op basis van de instance_type parameter, instantieert de ingebouwde PyTorch deep learning-container, installeert de MONAI-afhankelijke pakketten die te vinden zijn in requirements.txten voert het trainingsscript uit waarnaar wordt verwezen door de entry_point=’monai_dicom.py’ parameter.

Voor meer informatie over het gebruik van het MONAI-framework binnen SageMaker om uw medische beeldmodellen te bouwen en te implementeren, zie: Bouw een pijplijn voor medische beeldanalyse op Amazon SageMaker met behulp van het MONAI-framework. Zie voor meer informatie over andere workflows voor het labelen van aangepaste gegevens Bouw een aangepaste workflow voor gegevensetikettering met Amazon SageMaker Ground Truth.

Conclusie

Dit bericht liet zien hoe u een DICOM-workflow voor aangepaste etikettering kunt bouwen met Ground Truth. Daarnaast hebben we u laten zien hoe u het uitvoermanifestbestand dat is gegenereerd op basis van uw labeling-workflow, kunt gebruiken als een gelabelde dataset om een ​​DenseNet-beeldclassificatiemodel te bouwen met behulp van het MONAI-framework.

Als je opmerkingen of vragen hebt over dit bericht, gebruik dan het opmerkingengedeelte. Om de laatste ontwikkelingen van deze oplossing te vinden, bekijk de GitHub repo.


Over de auteurs

Nihir Chadderwala is een AI/ML Solutions Architect in het Global Healthcare and Life Sciences-team. Zijn achtergrond is het bouwen van big data en AI-aangedreven oplossingen voor klantproblemen in verschillende domeinen, zoals software, media, automotive en gezondheidszorg. In zijn vrije tijd speelt hij graag tennis en kijkt en leest hij graag over Cosmos.

Bende Fu is Senior Healthcare Solutions Architect bij AWS. Hij heeft een PhD in Farmaceutische Wetenschappen van de Universiteit van Mississippi en heeft meer dan 10 jaar ervaring in technologie en biomedisch onderzoek. Hij is gepassioneerd door technologie en de impact die het kan hebben op de gezondheidszorg.

Brian Marsh is Senior Solutions Architect in het team van het Academisch Medisch Centrum bij Amazon Web Services. Hij heeft expertise in enterprise architectuur met een focus in het zorgdomein. Hij heeft een passie voor het gebruik van technologie om de zorgervaring en patiëntresultaten te verbeteren.

Coinsmart. Beste Bitcoin-beurs in Europa
Bron: https://aws.amazon.com/blogs/machine-learning/annotate-dicom-images-and-build-an-ml-model-using-the-monai-framework-on-amazon-sagemaker/

spot_img

Laatste intelligentie

spot_img