Course on Python Machine Learning for AI Healthcare Imaging using PyTorch and Monai

Posted by


PyTorch and MONAI Tutorial for AI Healthcare Imaging

In this tutorial, we will explore how to use PyTorch and MONAI for building machine learning models for healthcare imaging tasks. PyTorch is a popular deep learning library that provides a flexible and dynamic computational graph while MONAI is a PyTorch-based framework for deep learning in medical imaging. By combining the power of PyTorch and MONAI, we can efficiently develop and deploy AI models for healthcare imaging tasks such as image segmentation, classification, and detection.

Prerequisites:

Before we start, ensure you have the following installed:

  • Python 3
  • PyTorch
  • MONAI
  • An understanding of PyTorch basics

Setting up the Environment:

First, we need to install PyTorch and MONAI. You can install them using pip:

pip install torch
pip install monai

Introduction to MONAI

MONAI (Medical Open Network for AI) is a PyTorch-based framework for deep learning in healthcare imaging. It provides a collection of efficient, flexible, and easy-to-use tools for building AI models for medical imaging tasks.

MONAI includes functionalities such as:

  • Data loading and preprocessing
  • Image transforms
  • Deep learning models
  • Training and evaluation utilities
  • Inference and deployment

Getting Started with MONAI:

To get started with MONAI, we will build a simple image classification model using the MNIST dataset.

Loading the Dataset:

We will start by loading the MNIST dataset using MONAI’s built-in dataset class.

from monai.data import MNIST
from monai.transforms import Compose, ToTensor

# Define transforms
transforms = Compose([ToTensor()])

# Load the dataset
mnist_ds = MNIST(root='data', download=True, transform=transforms)

Building the Model:

Next, we will define a simple convolutional neural network (CNN) model for image classification.

import torch.nn as nn

class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, 3)
        self.conv2 = nn.Conv2d(32, 64, 3)
        self.fc1 = nn.Linear(64 * 12 * 12, 128)
        self.fc2 = nn.Linear(128, 10)

    def forward(self, x):
        x = nn.functional.relu(self.conv1(x))
        x = nn.functional.max_pool2d(x, 2)
        x = nn.functional.relu(self.conv2(x))
        x = nn.functional.max_pool2d(x, 2)
        x = x.view(-1, 64 * 12 * 12)
        x = nn.functional.relu(self.fc1(x))
        x = self.fc2(x)

        return x

model = SimpleCNN()

Training the Model:

Now, we will train the model using PyTorch and MONAI utilities.

from monai.data import DataLoader
from monai.data.utils import list_data_collate

# Define dataloader
batch_size = 64
train_loader = DataLoader(dataset=mnist_ds, batch_size=batch_size, shuffle=True, collate_fn=list_data_collate)

# Define optimizer and loss function
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)
criterion = nn.CrossEntropyLoss()

# Training loop
num_epochs = 5
for epoch in range(num_epochs):
    model.train()
    for batch in train_loader:
        optimizer.zero_grad()
        images, labels = batch['image'], batch['label']
        outputs = model(images)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

    print(f'Epoch {epoch+1}/{num_epochs}, Loss: {loss.item()}')

Inference:

After training the model, we can perform inference on new images.

from monai.handlers import SegmentationSaver

def predict(image):
    model.eval()
    with torch.no_grad():
        output = model(image)
        _, predicted = torch.max(output, 1)

    return predicted

# Perform inference
image = get_new_image()
image_tensor = transforms(image)
prediction = predict(image_tensor)
print(f'Predicted Label: {prediction.item()}')

Conclusion:

In this tutorial, we have learned how to use PyTorch and MONAI to build a simple image classification model for healthcare imaging tasks. By leveraging the powerful capabilities of PyTorch and the specialized tools of MONAI, we can efficiently develop and deploy AI models for medical imaging applications. Experiment with different datasets and model architectures to enhance your understanding and skills in this domain.

0 0 votes
Article Rating
34 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
@pycad
2 months ago

Hi everyone,
I hope that the course is useful, if you have any questions please let me know.

Happy learning

@samchris3793
2 months ago

It was interesting to get the understanding of what is happening. However I can't help but feel I wasted 5 hours of my time.
There was no breakdown of the code for the training part nor coding part . I feel cheated and the video is over 2 years old and the modules are out of date.

@Afrin1618
2 months ago

Nice work… No offence but you talk too much man! 😅

@carloswinkler6382
2 months ago

Excellent

@VanNguyen-co1dv
2 months ago

28:41

@truongtuankhue3156
2 months ago

can you show me Folder TestSegmentation?

@truongtuankhue3156
2 months ago

Hello, I followed your steps one by one but when I import monai the following error occurs:" AttributeError Traceback (most recent call last)

Cell In[5], line 1

—-> 1 import monai

File D:Anacodaenvsliver_segmentationLibsite-packagesmonai__init__.py:58

44 excludes = "|".join(

45 [

46 "(^(monai.handlers))",

(…)

54 ]

55 )

57 # load directory modules only, skip loading individual files

—> 58 load_submodules(sys.modules[__name__], False, exclude_pattern=excludes)

60 # load all modules, this will trigger all export decorations

61 load_submodules(sys.modules[__name__], True, exclude_pattern=excludes)

File D:Anacodaenvsliver_segmentationLibsite-packagesmonaiutilsmodule.py:212, in load_submodules(basemod, load_all, exclude_pattern)

210 try:

211 mod = import_module(name)

–> 212 importer.find_module(name).load_module(name) # type: ignore

213 submodules.append(mod)

214 except OptionalImportError:

AttributeError: 'FileFinder' object has no attribute 'find_module'"
Hope you will reply me as soon as possible so I can complete it

@sahil_sms7918
2 months ago

you fool wasted my time giving wrong dataset..

@DivyaArora-gn7fy
2 months ago

please go take some english classes

@emmanuelntumba4708
2 months ago

3:11:19' how you have 4 folders immediately?? we had juste 2 folders ''image train and labels"

@tk-og4yk
2 months ago

Notice to those following along:

AddChannel1d which is used in the preprocess inside the compose function, has been deprecated and is now the same function as EnsureChannelFirstd

@domillima
2 months ago

One thing not clear to me is what is the purpose of segmentation. If you save this segmentation how can you read it into to python so that the model focuses on features of a specific region of interest?

@ashishgautam5989
2 months ago

I watched the complete video. It was useful for me.

@ProjectileGrommet
2 months ago

Is there any actual predicting? It seems like the testing loop is just validation and still requires a train and label pair. How would I use the trained model to predict/segment a single scan to get the subsequent segmented output?

@karthikdani
2 months ago

The author's code got a bit buggy and the moved files weren't in order, whilst I wrote code that reverses the operation back to the original location: Refer here:
“`python
import os
import shutil

def move_files(input_path, output_path):
# Iterate through input subfolders
for input_subfolder in os.listdir(input_path):
input_subfolder_path = os.path.join(input_path, input_subfolder)

# Check if it's a directory
if os.path.isdir(input_subfolder_path):
# Generate the corresponding output subfolder name
output_subfolder_name = input_subfolder[:-2]
output_subfolder_path = os.path.join(output_path, output_subfolder_name)

# Check if the output subfolder exists
if os.path.exists(output_subfolder_path):
# Move all files from input to output subfolder
for file_name in os.listdir(input_subfolder_path):
file_path = os.path.join(input_subfolder_path, file_name)
shutil.move(file_path, output_subfolder_path)

# Optionally, you can remove the now-empty input subfolder
os.rmdir(input_subfolder_path)

input_folder = "/path/to/input"
output_folder = "/path/to/output"

move_files(input_folder, output_folder)

“`

@justinbenavidez1985
2 months ago

I am stuck at 31:09 converting the Kaggle datasets into 3D slicer…. please help. How long does the download take for both liver datasets???

@seongukpark-cz1dd
2 months ago

What's inside the train/test segmentation and volumes folders? What do I put in them?

@user-vn4xr1lp3q
2 months ago

His language is terribly broken I suppose it could have been better had he delivered the material in his native language

@sameepshah3835
2 months ago

Which data is being used here, the Decathlon one or the Kaggle one, someone please help me with this.

@chqrds35
2 months ago

1:39:09