Tumoren, bei denen es sich um abnormale Wucherungen handelt, die sich im Gehirngewebe entwickeln können, stellen eine erhebliche Herausforderung für das Zentralnervensystem dar. Um ungewöhnliche Aktivitäten im Gehirn zu erkennen, setzen wir auf fortschrittliche medizinische Bildgebungsverfahren wie MRT- und CT-Scans. Allerdings kann die genaue Identifizierung von Tumoren aufgrund ihrer unterschiedlichen Formen und Texturen komplex sein und erfordert eine sorgfältige Analyse durch medizinisches Fachpersonal. Hier kommt die Leistungsfähigkeit von MRT-Scans mit Radiomics ins Spiel. Durch die Implementierung einer manuellen Merkmalsextraktion gefolgt von Klassifizierungstechniken können wir die Geschwindigkeit und Effizienz steigern, mit der Ärzte Bilddaten analysieren, was letztendlich zu präziseren Diagnosen und besseren Patientenergebnissen führt.

Lernziele

  • Tauchen Sie tief in die Welt der handgefertigten Funktionen ein.
  • Verstehen der Bedeutung von Radiomics für die Extraktion handgefertigter Merkmale.
  • Erhalten Sie Einblicke, wie MRT-Scans mithilfe von Radiomics die Erkennung und Klassifizierung von Tumoren verbessern und so genauere medizinische Diagnosen ermöglichen.
  • Verwendung der extrahierten Options zur Klassifizierung in verschiedene Klassen.
  • Nutzung der Leistungsfähigkeit von Radiomics und Multi Layer Perceptron zur Klassifizierung.

Dieser Artikel wurde im Rahmen der veröffentlicht Knowledge Science-Blogathon.

Radiomics zur Merkmalsextraktion verstehen

Radiomics ist die Technik, die im medizinischen Bereich zur Erkennung handgefertigter Merkmale eingesetzt wird. Mit handgefertigten Merkmalen meinen wir die Textur, Dichte, Intensität usw. Diese Merkmale sind hilfreich, da sie helfen, die komplexen Muster der Krankheiten zu verstehen. Zur Berechnung der Merkmalswerte werden grundsätzlich mathematische und statistische Operationen eingesetzt. Die endgültigen Werte liefern uns tiefe Erkenntnisse, die später für weitere klinische Beobachtungen genutzt werden können. Hier müssen wir eines beachten. Der Merkmalsextraktion erfolgt im Wesentlichen auf der Area of Curiosity.

Gemeinsame radiomische Merkmale zur Tumorerkennung

Hier besprechen wir die Funktionen, die mit Radiomics extrahiert werden. Einige davon sind wie folgt:

  • Formmerkmale: Dabei extrahiert Radiomics die geometrischen Merkmale der interessierenden Area. Es umfasst Volumen, Fläche, Länge, Breite, Kompaktheit usw.
  • Statistische Merkmale: Wie der Identify schon sagt, nutzt es statistische Techniken wie Mittelwert, Standardabweichung, Schiefe, Kurtosis und Zufälligkeit. Anhand dieser können wir die Intensität des ROI bewerten.
  • Texturmerkmale: Diese Merkmale konzentrieren sich auf die Homogenität und Heterogenität der Oberfläche der Area von Interesse. Einige Beispiele sind wie folgt:
    • GLCM oder Graustufen-Kookkurrenzmatrix: Misst den Kontrast und die Korrelation der Pixel oder Voxel im ROI
    • GLZSM oder Graustufenzonengrößenmatrix: Wird verwendet, um den zonalen Prozentsatz der homogenen Bereiche im ROI zu berechnen.
    • GLRLM oder Graustufen-Lauflängenmatrix: Wird verwendet, um die Gleichmäßigkeit der Intensitäten im gesamten interessierenden Bereich zu messen.
  • Erweiterte mathematische Funktionen: Fortgeschrittene mathematische Techniken wie Laplace-, Gauß- und Gradientenformeln erfassen Muster durch die Anwendung von Filtern in der Tiefe.

Datensatzübersicht

Hier verwenden wir den auf Kaggle vorhandenen Hirntumor-Datensatz. Der Hyperlink zum Herunterladen des Datensatzes lautet Hier. Der Datensatz hat zwei Kategorien oder Klassen: Ja oder Nein. Jede Klasse hat 1500 Bilder.

  • Ja bedeutet das Vorhandensein des Tumors.
  • Nein bedeutet, dass der Tumor nicht vorhanden ist.

Unten finden Sie einige Beispielbilder:

MRT-Scans mit Radiomics
Tumorbilder

Umgebungseinrichtung und Bibliotheken

Wir verwenden die PyRadiomics-Bibliothek zum Extrahieren von Funktionen und haben uns für Google Colab für diesen Prozess entschieden, da es die neueste Python-Model bereitstellt und so einen reibungslosen Betrieb von PyRadiomics gewährleistet. Bei Verwendung älterer Versionen kann es sonst zu Fehlern kommen. Abgesehen von PyRadiomics haben wir andere verwendet Bibliotheken wie SITK, NumpyTaschenlampe zum Erstellen mehrschichtiger Perzeptrone. Wir haben auch verwendet Pandas um die Options im Datenrahmen zu speichern.

Wie bereits erwähnt, werden wir den Hirntumor-Datensatz verwenden. Aber hier gibt es keine Masken, mit denen man das Gehirngewebe, das unsere Area von Interesse darstellt, hervorheben kann. Daher erstellen wir Binärmasken und extrahieren Options aus dem maskierten Bereich. Zuerst laden wir den Bilddatensatz mithilfe der OS-Bibliothek und erstellen einen Datenrahmen, der Bildpfade und Beschriftungen umfasst.

# 1. Import crucial libraries
import os
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, accuracy_score
from radiomics import featureextractor
import SimpleITK as sitk

# 2. Mount Google Drive
from google.colab import drive
drive.mount('/content material/drive')

# 3. Outline the dataset path
base_path="/content material/drive/MyDrive/mind"

# 4. Put together a DataFrame with picture paths and labels
knowledge = ()
for label in ('sure', 'no'):
    folder_path = os.path.be part of(base_path, label)
    for filename in os.listdir(folder_path):
        if filename.endswith(('.png', '.jpg', '.jpeg')):  # Make sure you're studying picture recordsdata
            image_path = os.path.be part of(folder_path, filename)
            knowledge.append({'image_path': image_path, 'label': label})

df = pd.DataFrame(knowledge)

Wir verwenden die Easy Picture Device Equipment (SITK)-Bibliothek zum Lesen von Bildern, da SITK Voxelintensitäten und -ausrichtung beibehält – Funktionen, die von OpenCV oder Pillow nicht verwaltet werden. Darüber hinaus wird SITK von Radiomics unterstützt, was die Konsistenz gewährleistet. Nachdem wir das Bild gelesen haben, konvertieren wir es in Graustufen und erstellen mithilfe der Otsu-Schwellenwertanalyse eine binäre Maske, die optimale Werte für Graustufenbilder liefert. Schließlich extrahieren wir die Radiomic-Options, kennzeichnen jedes Function mit „Ja“ oder „Nein“, speichern sie in einer Liste und konvertieren die Liste in einen DataFrame.

# 5. Initialize the Radiomics characteristic extractor
extractor = featureextractor.RadiomicsFeatureExtractor()
ok=0
# 6. Extract options from photos
features_list = ()
for index, row in df.iterrows():
    image_path = row('image_path')
    label = row('label')

    # Load picture
    image_sitk = sitk.ReadImage(image_path)

    # Convert picture to grayscale whether it is an RGB picture
    if image_sitk.GetNumberOfComponentsPerPixel() > 1:  # Test if the picture is colour (RGB)
        image_sitk = sitk.VectorIndexSelectionCast(image_sitk, 0)  # Use the primary channel (grayscale)

    # Apply Otsu threshold to phase mind from background
    otsu_filter = sitk.OtsuThresholdImageFilter()
    mask_sitk = otsu_filter.Execute(image_sitk)  # Create binary masks utilizing Otsu's methodology

    # Make sure the masks has the identical metadata because the picture
    mask_sitk.CopyInformation(image_sitk)

    # Extract options utilizing the generated masks
    options = extractor.execute(image_sitk, mask_sitk)
    options('label') = label  # Add label to options
    features_list.append(options)
    print(ok)
    ok+=1

# 7. Convert extracted options right into a DataFrame
features_df = pd.DataFrame(features_list)

# 8. Cut up the dataset into coaching and testing units
X = features_df.drop(columns=('label'))  # Options
y = features_df('label')  # Labels

Vorverarbeitung der Function-Daten

Wenn Radiomics die Options aus Bildern extrahiert, hängt es auch Versionen der Funktionen an die Function-Arrays an. Daher müssen wir die Function-Werte einschließen, deren Function-Identify „original_“ lautet. Für nicht numerische Merkmalswerte erzwingen wir die Daten und füllen sie später mit 0. Für den Beschriftungsteil konvertieren wir die Zeichenfolgen in 0 oder 1. Danach teilen wir die Daten im Verhältnis 80:20 in Prepare und Take a look at auf. Zuletzt werden die Funktionen mit StandardScaler standardisiert. Wir prüfen auch, ob die Klassen unausgeglichen sind oder nicht.

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.knowledge import DataLoader, TensorDataset
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
import pandas as pd
import matplotlib.pyplot as plt

# Assuming features_df is already outlined and processed

feature_cols = (col for col in features_df.columns if col.startswith('original_'))

# Convert the chosen columns to numeric, errors="coerce" will substitute non-numeric values with NaN
features_df(feature_cols) = features_df(feature_cols).applymap(lambda x: x.merchandise() if hasattr(x, 'merchandise') else x).apply(pd.to_numeric, errors="coerce")

# Exchange NaN values with 0 (you need to use different methods if applicable)
features_df = features_df.fillna(0)

# Cut up the dataset into coaching and testing units
X = features_df(feature_cols).values  # Options as NumPy array
y = features_df('label').map({'sure': 1, 'no': 0}).values  # Labels as NumPy array (0 or 1)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.remodel(X_test)


class_counts = pd.Sequence(y_train).value_counts()

# Get the bulk and minority lessons
majority_class = class_counts.idxmax()
minority_class = class_counts.idxmin()
majority_count = class_counts.max()
minority_count = class_counts.min()

print(f'Majority Class: {majority_class} with depend: {majority_count}')
print(f'Minority Class: {minority_class} with depend: {minority_count}')
Ausgabe

Verwendung von mehrschichtigem Perzeptron zur Klassifizierung

In diesem Schritt erstellen wir eine Mehrschichtiges Perzeptron. Zuvor konvertieren wir jedoch die Zug- und Testdaten in Tensoren. DataLoader werden auch mit der Batchgröße 32 erstellt.

X_train_tensor = torch.tensor(X_train, dtype=torch.float32)
y_train_tensor = torch.tensor(y_train, dtype=torch.lengthy)
X_test_tensor = torch.tensor(X_test, dtype=torch.float32)
y_test_tensor = torch.tensor(y_test, dtype=torch.lengthy)

# Create PyTorch datasets and dataloaders
train_dataset = TensorDataset(X_train_tensor, y_train_tensor)
test_dataset = TensorDataset(X_test_tensor, y_test_tensor)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)  # Alter batch dimension as wanted
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)

Das unten definierte MLP verfügt über zwei verborgene Schichten: ReLU als Aktivierungsfunktion und eine Dropout-Charge von 50 %. Die verwendete Verlustfunktion ist Cross Entropy Loss und der verwendete Optimierer ist Adam mit einer Lernrate von 0,001.

class MLP(nn.Module):
    def __init__(self, input_size, hidden_size1, hidden_size2, output_size):
        tremendous(MLP, self).__init__()
        self.fc1 = nn.Linear(input_size, hidden_size1)
        self.relu1 = nn.ReLU()
        self.dropout1 = nn.Dropout(0.5)  # Dropout layer with 50% dropout fee
        self.fc2 = nn.Linear(hidden_size1, hidden_size2)
        self.relu2 = nn.ReLU()
        self.dropout2 = nn.Dropout(0.5)
        self.fc3 = nn.Linear(hidden_size2, output_size)

    def ahead(self, x):
        x = self.fc1(x)
        x = self.relu1(x)
        x = self.dropout1(x)
        x = self.fc2(x)
        x = self.relu2(x)
        x = self.dropout2(x)
        x = self.fc3(x)
        return x

# Create an occasion of the mannequin
input_size = X_train.form(1)  # Variety of options
hidden_size1 = 128  # Alter hidden layer sizes as wanted
hidden_size2 = 64
output_size = 2  # Binary classification (sure/no)
mannequin = MLP(input_size, hidden_size1, hidden_size2, output_size)

# Outline loss perform and optimizer
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(mannequin.parameters(), lr=0.001)  # Alter studying fee as wanted

# Initialize an inventory to retailer loss values
loss_values = ()

# Prepare the mannequin
epochs = 200  # Alter variety of epochs as wanted
for epoch in vary(epochs):
    mannequin.prepare()  # Set mannequin to coaching mode
    running_loss = 0.0

    for i, (inputs, labels) in enumerate(train_loader):
        # Zero the gradients
        optimizer.zero_grad()

        # Ahead go
        outputs = mannequin(inputs)

        # Compute the loss
        loss = criterion(outputs, labels)

        # Backward go and optimization
        loss.backward()
        optimizer.step()

        # Accumulate the operating loss
        running_loss += loss.merchandise()

    # Retailer common loss for this epoch
    avg_loss = running_loss / len(train_loader)
    loss_values.append(avg_loss)  # Append to loss values
    print(f"Epoch ({epoch+1}/{epochs}), Loss: {avg_loss:.4f}")

# Take a look at the mannequin after coaching
mannequin.eval()  # Set mannequin to analysis mode
right = 0
complete = 0

with torch.no_grad():  # Disable gradient computation for testing
    for inputs, labels in test_loader:
        outputs = mannequin(inputs)
        _, predicted = torch.max(outputs.knowledge, 1)
        complete += labels.dimension(0)
        right += (predicted == labels).sum().merchandise()

# Calculate and print accuracy
accuracy = 100 * right / complete
print(f'Take a look at Accuracy: {accuracy:.2f}%')

# Plot the Loss Graph
plt.determine(figsize=(10, 5))
plt.plot(loss_values, label="Coaching Loss", colour="blue")
plt.title('Coaching Loss Curve')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.grid()
plt.present()

Wie wir sehen können, wird das Modell für 200 Epochen trainiert und der Verlust in jeder Epoche aufgezeichnet, der später für die Darstellung verwendet wird. Der Optimierer dient der Optimierung der Gewichte. Jetzt testen wir das Modell, indem wir die Gradientenberechnungen deaktivieren.

Ausgabe: MRT-Scans mit Radiomics

Wie wir der folgenden Ausgabe entnehmen können, beträgt die Genauigkeit des Testdatensatzes 94,50 %. Daraus können wir schließen, dass sich das Modell basierend auf den radiomischen Merkmalen intestine verallgemeinern lässt.

Abschluss

Der Einsatz von Radiomics und Multi-Layer-Perceptrons (MLP) bei der Klassifizierung von Hirntumoren kann den Diagnoseprozess für medizinisches Fachpersonal rationalisieren und verbessern. Durch die Extraktion handgefertigter Merkmale aus der Bildgebung des Gehirns können wir subtile Muster und Merkmale erfassen, die bei der genauen Identifizierung des Vorhandenseins eines Tumors helfen. Dieser Ansatz minimiert den Bedarf an manuellen Analysen und ermöglicht es Ärzten, schneller fundierte, datengesteuerte Entscheidungen zu treffen. Die Integration der Merkmalsextraktion mit der MLP-Klassifizierung zeigt das Potenzial von KI in der medizinischen Bildgebung und stellt eine effiziente, skalierbare Lösung dar, die Radiologen und Gesundheitsdienstleister bei der Diagnose komplexer Fälle erheblich unterstützen könnte.

Klicken Sie hier für den Google Collab-Hyperlink.

Wichtige Erkenntnisse

  • Radiomics erfasst detaillierte Bildmerkmale und ermöglicht so eine präzisere Hirntumoranalyse.
  • Mehrschichtige Perzeptrone (MLPs) verbessern die Klassifizierungsgenauigkeit durch die Verarbeitung komplexer Datenmuster.
  • Die Merkmalsextraktion und die MLP-Integration optimieren die Erkennung von Hirntumoren und tragen so zu einer schnelleren Diagnose bei.
  • Die Kombination von KI und Radiologie bietet einen skalierbaren Ansatz zur Unterstützung von medizinischem Fachpersonal.
  • Diese Technik veranschaulicht, wie KI die diagnostische Effizienz und Genauigkeit in der medizinischen Bildgebung verbessern kann.

Häufig gestellte Fragen

Q1. Was ist Radiomics in der Hirntumoranalyse?

A. Radiomics umfasst die Extraktion quantitativer Daten aus medizinischen Bildern und bietet detaillierte Einblicke in die Tumoreigenschaften.

Q2. Warum werden bei der Klassifizierung Multi-Layer-Perceptrons (MLPs) verwendet?

A. MLPs können komplexe Muster in Daten erkennen und so die Genauigkeit der Tumorklassifizierung verbessern.

Q3. Wie unterstützt KI die Erkennung von Hirntumoren?

A. KI verarbeitet und interpretiert umfangreiche Bilddaten und ermöglicht so eine schnellere und genauere Tumoridentifizierung.

This fall. Welche Vorteile bietet die Merkmalsextraktion in der Radiomics?

A. Die Merkmalsextraktion hebt spezifische Tumormerkmale hervor und erhöht so die diagnostische Präzision.

F5. Welche Rolle spielt Radiomics bei der Analyse von MRT-Scans?

A. Radiomics spielt eine entscheidende Rolle bei der Analyse von MRT-Scans, indem es quantitative Merkmale aus medizinischen Bildern extrahiert, die Muster und Biomarker aufdecken können. Diese Informationen verbessern die diagnostische Genauigkeit, helfen bei der Behandlungsplanung und ermöglichen eine personalisierte Medizin, indem sie Einblicke in die Tumoreigenschaften und das Ansprechen auf die Therapie liefern.

Die in diesem Artikel gezeigten Medien sind nicht Eigentum von Analytics Vidhya und werden nach Ermessen des Autors verwendet.

Von admin

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert