Die Radiologie ist ein Fachgebiet, das in hohem Maße von der Expertise hochqualifizierter Fachkräfte abhängt. Radiologen analysieren medizinische Bilder, um eine Reihe von Erkrankungen zu diagnostizieren und zu überwachen, von einfachen Frakturen bis hin zu komplexen Krankheiten wie Krebs. Doch angesichts der zunehmenden medizinischen Bildgebung und der dringenden Notwendigkeit schneller, genauer Diagnosen stehen Radiologen unter enormem Druck. Hier kommt künstliche Intelligenz (KI) ins Spiel, die das Fachgebiet verändert, indem sie die menschlichen Fähigkeiten erweitert. Am Ende dieses Artikels haben Sie Ihr eigenes Bildklassifizierungsmodell entwickelt, das bei der Erkennung von Lungenentzündungen in medizinischen Bildern hilft.
Bevor wir mit dem Programmieren beginnen, müssen wir sicherstellen, dass unsere Umgebung bereit ist. Wir beginnen mit der Installation der erforderlichen Bibliotheken:
%pip install --upgrade tensorflow keras numpy pandas sklearn pillow
Diese Bibliotheken sind für den Aufbau und das Training unseres Modells unerlässlich:
tensorflow
und keras
zum Erstellen und Trainieren neuronaler Netzwerke.numpy
für numerische Operationen.pandas
zur Datenmanipulation.sklearn
zur Vorverarbeitung von Daten.pillow
zur Bildbearbeitung.Nachdem wir die Bibliotheken installiert haben, importieren wir sie:
import os from tensorflow import keras from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, Flatten from tensorflow.keras.preprocessing.image import ImageDataGenerator import numpy as np
Wir beginnen mit dem Importieren mehrerer wichtiger Bibliotheken und Module, die zum Erstellen und Trainieren eines neuronalen Netzwerkmodells für Bildverarbeitungsaufgaben erforderlich sind. Wir verwenden TensorFlow und seine Untermodule zum Erstellen und Verwalten unserer Deep-Learning-Modelle. Insbesondere importieren wir Keras als unsere High-Level-API, Sequential zum Erstellen eines linearen Schichtenstapels und Module wie Dense, Conv2D, MaxPool2D und Flatten zum Erstellen und Konfigurieren verschiedener neuronaler Netzwerkschichten. Darüber hinaus hilft uns ImageDataGenerator dabei, unsere Bilddaten zu erweitern und die Generalisierungsfähigkeit des Modells zu verbessern. Schließlich importieren wir Numpy wegen seiner Unterstützung für numerische Operationen, die besonders nützlich für die Handhabung von Arrays und die Ausführung mathematischer Funktionen ist.
Unser KI-Radiologe braucht Daten, aus denen er lernen kann. Wir verwenden ImageDataGenerator, um unsere Trainings- und Validierungsdaten zu laden und zu erweitern. Zum Herunterladen der Daten verwenden wir unseren Open-Source-Datenfreund Kaggle. Laden Sie den beschrifteten Datensatz über den Link hier herunter.
Im Kontext des überwachten Lernens stellt der beschriftete Datensatz die Grundwahrheit dar, die das maschinelle Lernmodell vorhersagen soll.
trdata = ImageDataGenerator() traindata = trdata.flow_from_directory(directory="data-task1/train", target_size=(224, 224)) tsdata = ImageDataGenerator() testdata = tsdata.flow_from_directory(directory="data-task1/val", target_size=(224, 224))
Dieser Codeausschnitt richtet Datengeneratoren für unsere Trainings- und Validierungsdatensätze ein. Die Größe der Bilder wird auf 224 x 224 Pixel angepasst, die Standardeingabegröße für das VGG16-Modell.
Jetzt kommt der spaßige Teil: das Erstellen des VGG16-Modells. VGG16 ist eine beliebte Convolutional Neural Network (CNN)-Architektur, die für ihre Einfachheit und Effektivität bekannt ist, dank ihrer einzigartigen Architektur, die hauptsächlich auf 13 Convolutional-Schichten und 3 vollständig verbundenen Schichten basiert. Was VGG16 auszeichnet, ist die Verwendung kleiner 3x3-Convolutional-Filter innerhalb eines tiefen Netzwerks. Dieses Design erfasst komplizierte Muster in Bildern und gewährleistet gleichzeitig Rechenleistung. So erstellen wir es:
model = Sequential() model.add(Conv2D(input_shape=(224,224,3), filters=64, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=64, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=128, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=256, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(Conv2D(filters=512, kernel_size=(3,3), padding="same", activation="relu")) model.add(MaxPool2D(pool_size=(2,2), strides=(2,2))) model.add(Flatten()) model.add(Dense(units=4096, activation="relu")) model.add(Dense(units=4096, activation="relu")) model.add(Dense(units=2, activation="softmax")) model.summary()
Lassen Sie es uns aufschlüsseln:
Nachdem wir die Architektur unseres Modells definiert haben, müssen wir sie kompilieren:
opt = keras.optimizers.Adam(learning_rate=0.001) model.compile(optimizer=opt, loss=keras.losses.binary_crossentropy, metrics=['accuracy'])
Hier verwenden wir den Adam-Optimierer mit einer Lernrate von 0,001 und binärer Kreuzentropie als Verlustfunktion, die für binäre Klassifizierungsaufgaben geeignet ist. Lassen Sie uns die Vor- und Nachteile dieser Auswahlmöglichkeiten aufschlüsseln:
Komponente | Vorteile | Nachteile |
---|---|---|
Adam-Optimierer | 1. Adaptive Lernraten. 2. Funktioniert gut mit den Standardeinstellungen. | Mögliche Überanpassung bei komplexen Modellen. |
Binärer Kreuzentropieverlust | Ideal für die binäre Klassifizierung | nicht sehr kompatibel mit meiner Aktivierungsfunktion der Ausgabeebene, warum? (schreiben Sie es in die Kommentare!) |
Experimentieren Sie ruhig mit verschiedenen Optimierern, Lernraten und Verlustfunktionen, denn auf diese Weise sammeln Sie tolle Erfahrungen.
Es ist Zeit, unseren KI-Radiologen zu trainieren! Wir richten Rückrufe ein, um das beste Modell zu speichern und vorzeitig zu stoppen, wenn sich die Validierungsgenauigkeit nicht mehr verbessert:
from keras.callbacks import ModelCheckpoint, EarlyStopping checkpoint = ModelCheckpoint("vgg16_1.h5", monitor='val_accuracy', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1) early = EarlyStopping(monitor='val_accuracy', min_delta=0, patience=20, verbose=1, mode='auto') hist = model.fit_generator(steps_per_epoch=20, generator=traindata, validation_data=testdata, validation_steps=10, epochs=10, callbacks=[checkpoint, early])
Um die Leistung unseres Modells zu sehen, können wir den Trainings- und Validierungsverlust sowie die Genauigkeit grafisch darstellen:
import matplotlib.pyplot as plt # Training loss plt.plot(hist.history['loss']) plt.legend(['Training']) plt.title('Training loss') plt.ylabel('loss') plt.xlabel('epoch') plt.show() # Validation loss plt.plot(hist.history['val_loss']) plt.legend(['Validation']) plt.title('Validation loss') plt.ylabel('validation loss') plt.xlabel('epoch') plt.show() # Training and validation accuracy plt.plot(hist.history['accuracy']) plt.plot(hist.history['val_accuracy']) plt.legend(['Training', 'Validation']) plt.title('Training & Validation accuracy') plt.xlabel('epoch') plt.show()
Diese Diagramme helfen uns zu verstehen, wie gut unser Modell lernt und ob es zu Über- oder Unteranpassung kommt.
Nach dem Training ist unser KI-Radiologe bereit, Vorhersagen zu treffen. So können Sie ein Bild laden und die Vorhersage des Modells abrufen:
from tensorflow.keras.preprocessing import image # Load and preprocess image img_path = 'path_to_your_image.jpg' img = image.load_img(img_path, target_size=(224, 224)) img_array = image.img_to_array(img) img_array = np.expand_dims(img_array, axis=0) # Create batch axis # Make prediction prediction = model.predict(img_array) print('Prediction:', prediction)
Die Entwicklung eines KI-Radiologen ist nur der Anfang. Hier sind ein paar Tipps zur Feinabstimmung und Verbesserung Ihres Modells:
Wow, tolle Arbeit! 🎉 Sie haben ein Modell erstellt, das medizinische Bilder analysieren und Vorhersagen treffen kann – was für eine großartige medizinische Leistung! :) Indem Sie tief in die Komplexität neuronaler Netzwerkarchitekturen eingetaucht sind, haben Sie gesehen, wie wirkungsvoll ein fein abgestimmtes KI-Modell sein kann. Gehen Sie weiter an Grenzen, experimentieren Sie weiter und genießen Sie vor allem jeden Moment der Arbeit mit Ihren KI-Projekten!