Radio AI
Entwicklung eines Pneumonie-Modells als Lernprojekt
Ein Hobbyprojekt zu Bildklassifikation, Transfer Learning und der Auswertung neuronaler Netze
Ich habe dieses Projekt begonnen, weil ich verstehen wollte, wie ein neuronales Netz für Bilder aufgebaut und trainiert wird. Dazu wollte ich den gesamten Ablauf selbst durchlaufen: die Architektur festlegen, Daten aufteilen, eine Verlustfunktion definieren, das Training ausführen und die Ergebnisse prüfen. Dabei interessierte mich besonders, welchen Einfluss die einzelnen Entscheidungen und scheinbar nebensächliche Eigenschaften der Bilder haben.
Das Ziel war ausdrücklich nicht, für die Erkennung von Pneumonie eine möglichst hohe Sensitivität oder Spezifität zu erreichen. Dafür wäre ein Hobbyprojekt weder der richtige Rahmen noch die richtige Datenbasis. Die medizinische Bildklassifikation diente als konkrete Aufgabe, an der sich die einzelnen Schritte nachvollziehen und prüfen ließen. Kennzahlen wie AUC und Kalibrierfehler halfen beim Vergleich der Varianten, waren aber nicht der Zweck des Projekts.
Das konkrete Modell ist ein ResNet-18 mit zwei Ausgängen. Der erste Ausgang schätzt, wie wahrscheinlich eine pneumonische Verschattung ist. Der zweite erzeugt eine räumliche Karte, die auf eine mögliche Lage der Verschattung hinweist. Fünf getrennt trainierte Modelle werden später zu einem Ensemble zusammengeführt.
Medizinischer Hinweis: Das Projekt ist ein Forschungsdemonstrator und kein Medizinprodukt. Es darf nicht für Diagnosen oder Therapieentscheidungen verwendet werden.
Modellarchitektur
Das Modell verarbeitet ein frontales Thorax-Röntgenbild und beantwortet zwei Fragen:
- Wie wahrscheinlich ist eine pneumonische Verschattung?
- Wo im Bild könnte sie liegen?
Beide Aufgaben nutzen zunächst denselben ResNet-18-Rumpf. Erst in den späteren Schichten teilt sich das Netz in einen Klassifikationskopf und einen Lokalisationskopf.
Die kleinen Bilder in Abbildung 1 sind keine verkleinerten Kopien des Röntgenbildes. Jedes zeigt einen einzelnen Kanal der jeweiligen Schicht. Ein Kanal reagiert auf ein bestimmtes Muster, das während des Trainings nützlich geworden ist. Eine einfache Bezeichnung wie „Rippenkanal“ oder „Pneumoniekanal“ lässt sich daraus in der Regel nicht ableiten.
Im Stem wird das Bild zunächst gefaltet, normalisiert und durch eine ReLU-Funktion geschickt. Max-Pooling verkleinert die räumliche Auflösung anschließend auf 56 × 56. In den frühen Karten sind Kanten und größere anatomische Formen noch gut zu erkennen. Layer 1 behält die Auflösung bei und kombiniert diese einfachen Strukturen. Layer 2 und Layer 3 verkleinern das Raster auf 28 × 28 und 14 × 14. Die Aktivierungen werden dabei gröber und stärker auf einzelne Regionen konzentriert.
Nach Layer 3 verwendet der Lokalisationskopf die 256 Kanäle, um für jede der 14 × 14 Kacheln einen Ortswert zu berechnen. Der andere Zweig wird in Layer 4 weiter auf 7 × 7 Positionen verdichtet. Erst danach werden die räumlichen Werte gemittelt und in einen einzelnen Klassifikationswert übersetzt.
Ausgangsmodell und Transfer Learning
Als Ausgangspunkt dient ResNet-18 aus der ResNet-Arbeit von He et al.. Das Training beginnt mit den Torchvision-Gewichten IMAGENET1K_V1.
Diese Gewichte stammen aus einem Training auf Fotos aus 1.000 ImageNet-Klassen. Das Modell hat dadurch noch kein Wissen über Pneumonie. Es kann aber bereits einfache visuelle Strukturen wie Kanten, Rundungen, Oberflächen und Formen verarbeiten. Beim Transfer Learning wird dieses Vorwissen als Startpunkt für eine neue Aufgabe verwendet.
Der ursprüngliche Ausgang für die 1.000 ImageNet-Klassen wird entfernt. An seine Stelle treten die beiden projektspezifischen Köpfe. Danach werden alle Schichten des ResNet-18 auf den RSNA-Röntgenbildern weitertrainiert. Dieses vollständige Anpassen des vortrainierten Netzes ist das Fine-Tuning.
Bildvorverarbeitung und gemeinsamer Modellrumpf
Der Code liest das Röntgenbild als Graustufenbild, verkleinert es auf 224 × 224 Pixel und kopiert es in drei Kanäle, weil ResNet-18 drei Eingabekanäle erwartet. Anschließend verwendet er die festen Mittelwerte und Standardabweichungen der ImageNet-Normalisierung.
Die festen Konstanten sind eine bewusste Entscheidung. Eine frühere Variante berechnete die Normalisierung für jedes Röntgenbild neu. Das klang zunächst plausibel, verstärkte im Experiment jedoch den unerwünschten Hinweis auf die Aufnahmeart.
Innerhalb des ResNet-18 sinkt die räumliche Auflösung, während die Zahl der Merkmalskarten steigt:
| Stufe | räumliche Größe | Kanäle | Funktion im Modell |
|---|---|---|---|
| Eingabe | 224 × 224 | 3 | Graustufenbild auf drei Kanälen |
| Stem / Layer 1 | 56 × 56 | 64 | Kanten und lokale Texturen |
| Layer 2 | 28 × 28 | 128 | größere Muster |
| Layer 3 | 14 × 14 | 256 | regionale Merkmale |
| Layer 4 | 7 × 7 | 512 | stark verdichtete Merkmale |
Das „Res“ in ResNet steht für Residual. Ein Residual-Block berechnet eine Korrektur zu seiner Eingabe und addiert beides. Diese kurzen Verbindungen helfen Informationen und Lernsignalen, durch das Netz zu fließen.
Klassifikationskopf
Der Klassifikationskopf verarbeitet die Ausgabe von Layer 4. Dort liegen 7 × 7 Positionen mit jeweils 512 Merkmalen. Das Modell mittelt über die 49 Positionen und erhält einen Vektor aus 512 Zahlen. Eine lineare Schicht verdichtet ihn zu einem Logit.
Ein Logit ist ein Rohwert ohne direkt verständliche Wahrscheinlichkeitsskala. Eine Sigmoid-Funktion bringt ihn in den Bereich zwischen 0 und 1. Damit sieht der Wert bereits wie eine Wahrscheinlichkeit aus, muss aber noch keine verlässliche Wahrscheinlichkeit sein. Ein Modell kann die Fälle in der richtigen Reihenfolge sortieren und trotzdem systematisch zu hohe oder zu niedrige Werte ausgeben. Die Platt-Kalibrierung korrigiert später diese Skala.
Lokalisationskopf
Der Lokalisationskopf zweigt bereits nach Layer 3 ab. Dort besitzt das Netz noch ein 14 × 14 großes Raster mit 196 Bildregionen. Eine einzelne 1 × 1-Faltung übersetzt die 256 Merkmale jeder Kachel in einen Ortswert.
Die geringe Tiefe dieses Kopfes ist Teil des Versuchsaufbaus. Ein aufwendigerer Kopf hätte gleichzeitig die Ortsaufsicht und die Modellkapazität verändert. Mit einer einzelnen 1 × 1-Faltung lässt sich besser beurteilen, ob die zusätzliche Ortsinformation selbst einen Effekt hat.
Trainiert wird der Lokalisationskopf mit den von Radiologinnen und Radiologen eingezeichneten Rechtecken. Er lernt damit direkt, in welchen Regionen eine Verschattung liegt.
Grad-CAM ist davon zu unterscheiden. Diese Karte wird erst nach der Vorhersage aus dem Klassifikationszweig berechnet. Sie zeigt, welche Regionen im letzten Faltungsblock den Diagnosewert beeinflusst haben. Auf die Radiologenrechtecke wurde Grad-CAM nicht trainiert.
Der Lokalisationskopf besitzt 14 × 14 Werte, Grad-CAM nur 7 × 7. Für die Darstellung werden beide Karten vergrößert und geglättet. Dabei entstehen keine zusätzlichen Bildinformationen.
Datengrundlage und Zielvariable
Der Hauptdatensatz ist die RSNA Pneumonia Detection Challenge auf Kaggle. Im Projekt umfasst er 26.684 frontale Thorax-Röntgenbilder mit drei Klassen:
| Klasse | Bedeutung |
|---|---|
| Lung Opacity | mögliche pneumonische Verschattung, bei positiven Fällen mit Rechteckannotation |
| Normal | kein auffälliger Befund |
| No Lung Opacity / Not Normal | auffällig, aber ohne die gesuchte Verschattung |
Für das binäre Modell gilt Lung Opacity = 1. Die beiden anderen Klassen werden als 0 behandelt.
Die dritte Klasse verhindert, dass die Aufgabe auf „krank gegen gesund“ zusammenschrumpft. Fast die Hälfte der AP-Aufnahmen gehört zu diesen auffälligen Nicht-Pneumonie-Fällen. Ohne sie könnte das Modell die Aufnahme am Krankenbett noch leichter mit Pneumonie gleichsetzen.
Die Quelldaten werden aus DICOM in 512 × 512 Pixel große PNG-Dateien konvertiert. DICOM ist ein medizinisches Bildformat, das neben den Pixeln weitere Angaben wie Aufnahmeart und Pixelabstand enthalten kann. Die Konvertierung verändert weder Kontrast noch Bildausschnitt. Solche Eingriffe bleiben im Trainingscode, damit sie in Experimenten einzeln geprüft werden können.
Weitere öffentliche Datensätze erfüllen abgegrenzte Aufgaben:
| Datensatz | Verwendung im Projekt | Link |
|---|---|---|
| RSNA Pneumonia Detection Challenge | Training, Kreuzvalidierung und interner Holdout des Klassifikators | Kaggle · Datensatz-Paper |
| Kermany Chest X-Ray | externe Prüfung; zuvor wegen eines Größen-Leaks als Trainingsbasis verworfen | Mendeley Data · Paper |
| VinDr-CXR | externe Prüfung an Erwachsenen; Klassifikation und Lokalisation | PhysioNet · Paper |
| Montgomery County und Shenzhen | Training des separaten U-Net-Lungenfinders | NIH/NLM-Datensatzseite |
Die sechs mitgelieferten Demobilder stammen aus dem RSNA/NIH-Bestand. Ihre reproduzierbare Auswahl ist im manifest.json festgehalten. Herkunft und Lizenzhinweise stehen in der NOTICE.md.
Trainings- und Evaluationsdesign
Datenteilung und Ausgleich des Trainingsstroms
Zu Beginn des Projekts wurden 3.812 Bilder, etwa 15 Prozent des Datensatzes, als Holdout weggeschlossen. Dieser Teil blieb während der Entwicklung unangetastet und wurde erst ausgewertet, nachdem die Modellentscheidungen feststanden.
Die übrigen 22.872 Bilder bilden den Entwicklungssatz. Sie werden patientenweise in fünf Folds geteilt. Bei der Fünffach-Kreuzvalidierung trainiert jedes Modell auf vier Folds und wird auf dem fünften geprüft. Nach fünf Läufen war jedes Entwicklungsbild genau einmal Prüfbild eines Modells, das dieses Bild nicht zum Training verwendet hatte.
Zusätzlich wird die Aufteilung nach Diagnose und Aufnahmeart geschichtet. AP- und PA-Aufnahmen sowie positive und negative Fälle bleiben dadurch in allen Teilen ähnlich verteilt.
Diese Schichtung sorgt für vergleichbare Folds, beseitigt aber nicht den Zusammenhang zwischen Aufnahmeart und Diagnose. Deshalb wird der Trainingsstrom zusätzlich ausgeglichen. Unterrepräsentierte Kombinationen aus Aufnahmeart und Diagnose werden häufiger gezogen, überrepräsentierte Kombinationen seltener. Mit dem „Auffüllen“ sind also keine neuen oder künstlich erzeugten Röntgenbilder gemeint. Vorhandene Bilder aus den selteneren Gruppen erscheinen lediglich häufiger im Training. Der Ausgleich betrifft nur den jeweiligen Trainingsanteil. Selektionssplit, äußerer Prüf-Fold und Holdout behalten ihre ursprüngliche Verteilung.
Der Ausgleich ist nötig, weil das Modell die Aufnahmeart sonst als Confounder nutzen kann. Von den im Projekt untersuchten Maßnahmen war dieses gewichtete Sampling die einzige, die den Einfluss der Aufnahmeart messbar verringerte. Der Abschnitt zur Kontrolle des Projektions-Confounders beschreibt die Gewichtung und ihren Effekt genauer.
Innerhalb jedes Trainingsanteils gibt es einen separaten Selektionssplit. Er bestimmt den besten Trainingszeitpunkt, die Kalibrierung und die spätere Schwelle. Der äußere Prüf-Fold bleibt von diesen Entscheidungen unberührt.
Datenaugmentation
Während des Trainings wird jedes Bild leicht verändert:
- Drehung bis 7 Grad
- Verschiebung bis 3 Prozent
- Skalierung zwischen 0,93 und 1,07
- Helligkeits- und Kontrastvariation von 0,15
Diese Augmentation soll verhindern, dass das Netz einzelne Pixelmuster auswendig lernt. Eine horizontale Spiegelung wird nicht verwendet. Sie würde links und rechts vertauschen, die Herzsilhouette und Seitenmarker spiegeln und damit anatomisch falsche Beispiele erzeugen.
Bei geometrischen Veränderungen müssen Bild und Radiologenrechteck exakt dieselbe Transformation erhalten. Zwei getrennte Zufallsbewegungen würden die Ortsangabe von der Verschattung lösen.
Verlustfunktion
Während des Trainings kennt das Modell zu jedem Bild die richtige Antwort. Es gibt beispielsweise eine Pneumonie-Wahrscheinlichkeit von 0,70 aus, während die hinterlegte Klasse entweder 1 für Pneumonie oder 0 für keine Pneumonie lautet. Damit die Gewichte angepasst werden können, muss dieser Unterschied in eine Zahl übersetzt werden. Diese Zahl ist der Loss, auf Deutsch meist Verlust oder Fehlerwert.
Ein bloßes „richtig“ oder „falsch“ wäre zu grob. Bei einem positiven Bild wären sowohl 0,51 als auch 0,99 formal richtige Entscheidungen, die zweite Vorhersage passt aber deutlich besser zur Zielklasse. Umgekehrt soll eine selbstsichere Fehlvorhersage von 0,99 auf einem negativen Bild stärker ins Gewicht fallen als ein unsicherer Wert von 0,51.
Nach jedem Trainingsbatch berechnet der Code, wie sich eine kleine Änderung jedes Modellgewichts auf den Loss auswirken würde. Diese Rückwärtsrechnung heißt Backpropagation. Der Optimierer verändert die Gewichte anschließend in die Richtung, in der der Loss kleiner wird. Eine Verlustfunktion ist also kein zusätzlicher Testwert für den fertigen Klassifikator. Sie liefert das Signal, mit dem das Modell während des Trainings überhaupt lernen kann.
Für eine Entscheidung mit zwei möglichen Klassen wird häufig die binäre Kreuzentropie verwendet. „Binär“ bezieht sich auf die beiden Zielwerte 0 und 1. Die Formel lautet:
BCE = -(y × ln(p) + (1 - y) × ln(1 - p))
Dabei ist y die richtige Klasse und p die vorhergesagte Wahrscheinlichkeit für die positive Klasse. ln bezeichnet den natürlichen Logarithmus. Weil y entweder 0 oder 1 ist, fällt jeweils eine Hälfte der Formel weg:
- Bei einem positiven Bild mit
y = 1bleibt-ln(p)übrig. Je näherpan 1 liegt, desto kleiner ist der Loss. - Bei einem negativen Bild mit
y = 0bleibt-ln(1 - p)übrig. Je näherpan 0 liegt, desto kleiner ist der Loss.
Das Verhalten lässt sich ohne Berechnung der Logarithmen zusammenfassen:
| richtige Klasse | Modellwert p |
Bewertung durch die Kreuzentropie |
|---|---|---|
| positiv | 0,90 | kleiner Loss |
| positiv | 0,10 | großer Loss |
| negativ | 0,10 | kleiner Loss |
| negativ | 0,90 | großer Loss |
Sehr sichere Fehler werden besonders stark bestraft. Das ist gewollt: Ein Modell, das bei der falschen Antwort fast sicher ist, benötigt ein deutlicheres Korrektursignal als ein Modell, das noch unentschlossen ist.
Im Projekt wird die binäre Kreuzentropie an zwei Stellen eingesetzt. Der Klassifikationskopf berechnet einen Loss pro Bild. Positive Fälle sind seltener und erhalten über pos_weight ein höheres Gewicht, damit die vielen negativen Fälle das Training nicht dominieren. Der Lokalisationskopf berechnet denselben Fehlertyp für jede Kachel des 14 × 14 großen Ortsfeldes.
Der Gesamtfehler lautet:
Gesamtfehler = Klassifikationsfehler + λ × Lokalisationsfehler
Das Lambda λ wurde nicht nach Gefühl gesetzt. Im ersten Trainingsbatch mit einer annotierten Verschattung misst der Code beide Fehler und wählt Lambda so, dass sie zu Beginn ähnlich groß sind. Danach bleibt der Wert fest.
Nur Bilder mit einer Radiologenbox tragen beim ausgelieferten Modell zum Lokalisationsfehler bei. Der Kopf lernt deshalb eine bedingte Aufgabe: Wenn eine Pneumonie vorhanden ist, wo liegt sie? Er lernt nicht zuverlässig, auf normalen Bildern überall niedrige Werte auszugeben. Die Anwendung zeigt das Ortsfeld daher als weichen Hinweis, ohne Kasten und ohne harte Schwelle.
Kontrolle des Projektions-Confounders
Die Aufnahmeart erwies sich als wichtigster Störfaktor des Projekts. AP-Aufnahmen entstehen häufig mobil am Bett und damit oft bei kränkeren Patientinnen und Patienten. PA-Aufnahmen werden eher im Stehen am Wandstativ angefertigt. Im Entwicklungssatz haben 38,3 Prozent der AP-Bilder, aber nur 9,3 Prozent der PA-Bilder eine Pneumonie. Die Aufnahmeart allein erreicht für die Diagnose eine AUC von 0,706.
Das Netz kann diesen Zusammenhang ausnutzen, obwohl die Aufnahmeart nicht der gesuchte Befund ist. Mehrere Versuche, den Projektionshinweis aus den Pixeln zu entfernen, blieben ohne ausreichenden Erfolg. Das bereits bei der Datenteilung beschriebene gewichtete Sampling war die einzige Maßnahme, die den Confounder messbar reduzierte.
Die Bilder werden so gezogen, dass Aufnahmeart und Diagnose im Trainingsstrom statistisch unabhängig sind. Der Anteil von AP und PA bleibt gleich. Auch die Gesamtzahl positiver Fälle ändert sich nicht. Nur die Verknüpfung zwischen beiden Merkmalen sinkt von einer AUC von 0,706 auf 0,500.
Die verwendeten Gewichte folgen der Formel:
w(Aufnahmeart, Diagnose) = erwartete Häufigkeit bei Unabhängigkeit / beobachtete Häufigkeit
Diese Maßnahme reduzierte den Projektionskanal am deutlichsten, kostete aber auch Diagnoseleistung. Gegenüber dem Ausgangsmodell sank der Projektionskanal um 0,0554 AUC. Gleichzeitig sank die geschichtete Diagnose-AUC um 0,0181.
Trainingskonfiguration
Jeder der fünf Läufe verwendet dieselbe Konfiguration:
- ResNet-18 mit ImageNet-Startgewichten und zwei Köpfen
- Eingabegröße 224 × 224 Pixel und Batchgröße 16
- acht Epochen
- AdamW mit Lernrate
3e-4und Weight Decay1e-4 - One-Cycle-Lernratenplan
- gewichtetes Sampling zur Entkopplung von Aufnahmeart und Diagnose
- Checkpoint-Auswahl über den inneren Selektionssplit
Der Optimierer berechnet aus dem Loss, wie die Modellgewichte verändert werden. Der Lernratenplan legt fest, wie groß diese Schritte im Verlauf des Trainings sind. Das vollständige Endrezept steht in train_final_model.ps1.
Die acht Epochen verliefen nicht in allen fünf Folds gleich. Der Klassifikationsverlust auf den Trainingsbildern sank kontinuierlich. Auf dem inneren Auswahlteil erreichte sein Mittel dagegen bereits in Epoche 2 den niedrigsten Wert und stieg danach wieder. Gleichzeitig nahm die AUC auf demselben Auswahlteil im Mittel noch etwas zu. Das ist kein Widerspruch: Die AUC bewertet nur die Reihenfolge der Fälle, während die binäre Kreuzentropie auch berücksichtigt, wie passend die ausgegebenen Zahlenwerte sind. Eine Rangfolge kann sich deshalb verbessern, obwohl die Wahrscheinlichkeitsskala schlechter wird.
Ensemblebildung und Kalibrierung
Nach der Kreuzvalidierung liegen fünf eigenständige Modelle vor. Bei einer Vorhersage beurteilen alle fünf dasselbe Bild. Bevor ihre Ergebnisse gemittelt werden, wird jedes Modell separat Platt-kalibriert.
Die fünf Pfade in Abbildung 3 stehen deshalb für fünf verschiedene Parametersätze und nicht für fünf Wiederholungen desselben Modells. Fold 0 liefert einen Rohwert, der mit der Platt-Kurve von Fold 0 korrigiert wird; für die Folds 1 bis 4 geschieht dasselbe mit den jeweils zugehörigen Kurven. Erst die fünf kalibrierten Wahrscheinlichkeiten werden zum Ensemblewert gemittelt.
Warum eine Kalibrierung notwendig ist
Ein Sigmoid-Wert von 0,70 bedeutet zunächst nur, dass das Modell einen entsprechenden Zahlenwert ausgegeben hat. Als echte Wahrscheinlichkeit wäre der Wert erst dann gut kalibriert, wenn unter vielen vergleichbaren Fällen mit einer Vorhersage um 0,70 ungefähr 70 Prozent tatsächlich positiv wären.
Das Training garantiert diese Übereinstimmung nicht. In diesem Projekt erhalten positive Fälle mit pos_weight ein höheres Gewicht, damit sie im Loss nicht von den häufigeren negativen Fällen überdeckt werden. Diese Gewichtung hilft beim Lernen der Klassentrennung, verschiebt aber die Wahrscheinlichkeitsskala. Auf den 22.872 Entwicklungsbildern lag die mittlere rohe Vorhersage bei 0,334, obwohl nur 0,225 der Bilder positiv waren. Das Modell bewertete das Risiko im Mittel also zu hoch.
Man kann sich das wie ein Thermometer mit einer falsch beschrifteten Skala vorstellen. Es kann wärmere und kältere Gegenstände zuverlässig ordnen, zeigt aber systematisch zu hohe Temperaturen an. Die Kalibrierung korrigiert die Beschriftung der Skala. Sie verändert nicht das bereits trainierte ResNet-18.
Funktionsweise der Platt-Kurve
Die Platt-Kalibrierung lernt eine einfache S-förmige Kurve mit zwei Parametern. Sie nimmt den bisherigen Modellwert p entgegen und gibt eine korrigierte Wahrscheinlichkeit zurück:
p_kalibriert = Sigmoid(a × Logit(p) + b)
Der Parameter b verschiebt die Skala nach oben oder unten. Der Parameter a verändert ihre Steilheit. Ist ein Modell zu selbstsicher, kann die Kurve extreme Werte näher zur Mitte ziehen. Beide Parameter werden aus Beispielen gelernt, bei denen Modellvorhersage und richtige Klasse bekannt sind.
Für jedes der fünf Modelle wird eine eigene Kurve auf seinem inneren Selektionssplit bestimmt. Diese Bilder hat das jeweilige Modell nicht zum Lernen seiner ResNet-Gewichte verwendet. Der äußere Prüf-Fold und der Holdout werden nicht zum Anpassen der Kurve benutzt.
Die Platt-Kurve ist monoton. Innerhalb eines Modells bleibt deshalb die Reihenfolge der Fälle erhalten: Ein Bild mit einem höheren Rohwert behält auch nach der Kalibrierung den höheren Wert. Die Kurve macht den Klassifikator also nicht nachträglich besser darin, positive und negative Fälle zu sortieren. Sie soll dafür sorgen, dass die ausgegebene Zahl als Wahrscheinlichkeit sinnvoller gelesen werden kann.
Kalibrierung und Entscheidungsschwelle sind zwei verschiedene Dinge. Die Kalibrierung korrigiert die Bedeutung der gesamten Wahrscheinlichkeitsskala. Die Schwelle legt anschließend fest, ab welchem kalibrierten Wert das System einen Fall als positiv einstuft.
Die Berechnung erfolgt in drei Schritten:
- Rohwert jedes Modells mit Sigmoid umwandeln
- jedes Modell mit seiner eigenen Platt-Kurve kalibrieren
- die fünf kalibrierten Wahrscheinlichkeiten mitteln
Nach der Kalibrierung lag die mittlere Vorhersage auf dem Entwicklungssatz bei 0,2255 und damit nahe am tatsächlichen positiven Anteil von 0,225. Auf dem Holdout sank der erwartete Kalibrierfehler von 0,1029 auf 0,0260. Erst nach dieser Korrektur werden die fünf Wahrscheinlichkeiten zum Ensemblewert gemittelt.
Die Webanwendung berechnet zusätzlich fünf minimal veränderte Bildausschnitte. Ihre Spannweite zeigt, wie empfindlich die Vorhersage auf eine Veränderung der Rahmung um zwei Prozent reagiert. Diese Spannweite ist eine Stabilitätsprobe und kein statistisches Konfidenzintervall. Die Modellbewertung verwendet weiterhin das unveränderte Vollbild.
Evaluationsergebnisse
Der Holdout wurde nach Abschluss der Entwicklung einmal ausgewertet.
| Messgröße | Ergebnis |
|---|---|
| geschichtete AUC des Ensembles | 0,8687 [0,8566; 0,8805] |
| mittlere geschichtete AUC der Einzelmodelle | 0,8473 |
| Lokalisationskopf, Punkt-AUC in der Lunge | 0,9123 |
| Grad-CAM, Punkt-AUC in der Lunge | 0,7312 |
| feste anatomische Ortsvorlage | 0,7520 |
| Kalibrierfehler nach Platt | 0,0260 |
| Modellwert verrät AP oder PA | 0,7501 |
AUC beschreibt hier, wie oft ein zufällig gewählter positiver Fall einen höheren Modellwert erhält als ein zufällig gewählter negativer Fall. Ein Wert von 1,0 wäre perfekt, 0,5 entspräche einem Münzwurf.
Die Diagnose-AUC wird getrennt für AP und PA berechnet und anschließend zusammengeführt. Diese Schichtung verhindert, dass das Modell allein von der unterschiedlichen Pneumoniehäufigkeit beider Aufnahmearten profitiert.
Der Lokalisationskopf liegt bei der Punkt-AUC vor Grad-CAM und vor einer festen Ortsvorlage. Diese Vorlage verwendet für jedes Bild dieselbe durchschnittliche Lage aller Trainingsrechtecke und berücksichtigt das aktuelle Röntgenbild nicht. Grad-CAM schneidet schwächer ab, weil es nicht auf die Radiologenboxen trainiert wurde und eine andere Größe erklärt.
Die Punkt-AUC des Lokalisationskopfs wurde in der Kreuzvalidierung über alle 5.154 positiven Entwicklungsbilder berechnet. Jedes dieser Bilder wurde dabei von einem Modell ausgewertet, das es nicht zum Training verwendet hatte.
Abbildung 4 zeigt, dass beide Karten unterschiedlich reagieren. Beim positiven Fall konzentriert sich der trainierte Lokalisationskopf deutlich auf die verschattete Region. Grad-CAM setzt teilweise andere Schwerpunkte. Beim normalen und beim auffälligen negativen Fall entstehen ebenfalls Aktivierungen, weil der Lokalisationskopf nur auf positiven Bildern einen Ortsfehler erhält.
Die letzte Zeile der Ergebnistabelle begrenzt die Aussagekraft der Diagnoseleistung. Aus dem Modellwert lässt sich die Aufnahmeart weiterhin mit einer AUC von 0,7501 rekonstruieren. Das gewichtete Sampling hat diesen Kanal verkleinert, aber nicht entfernt.
Externe Validierung
Die bisherige Holdout-Auswertung prüft das Modell zwar an zurückgehaltenen Fällen, diese stammen aber weiterhin aus derselben Datenquelle wie die Trainingsaufnahmen. Für eine strengere Prüfung habe ich deshalb das unveränderte Ensemble auf zwei externe Datensätze angewendet: zunächst auf pädiatrische Aufnahmen, anschließend auf Aufnahmen von Erwachsenen. Dabei wurden weder die Gewichte nachtrainiert noch die Kalibrierung oder der Entscheidungsschwellenwert an die neuen Daten angepasst.
Pädiatrische Röntgenaufnahmen: Kermany-Datensatz
Der Kermany-Datensatz umfasst 5.856 anteroposteriore Thorax-Röntgenaufnahmen von Kindern im Alter von ein bis fünf Jahren, die am Guangzhou Women and Children's Medical Center aufgenommen wurden. 4.273 Bilder zeigen eine Pneumonie, 1.583 gelten als unauffällig. Die Prävalenz beträgt damit 73,0 Prozent und ist wesentlich höher als im RSNA-Trainingsdatensatz. Auch Alter, Herkunft, Dateiformat und Bildentstehung unterscheiden sich von den Trainingsdaten. Diese Auswertung untersucht daher nicht nur neue Bilder, sondern einen deutlichen Wechsel der untersuchten Population und der technischen Domäne. Die medizinische Herkunft und Zusammenstellung des Datensatzes sind in der Originalpublikation beschrieben.
| Messgröße | Ergebnis |
|---|---|
| Aufnahmen | 5.856 |
| Patientengruppen | 3.054 |
| Pneumonieprävalenz | 73,0 % |
| AUC des Ensembles | 0,934 (95-%-KI: 0,928–0,941) |
| AUC nach Kontrolle des Größen-Confounders | 0,923 |
| ECE der unveränderten Kalibrierung | 0,478 |
| Sensitivität an der intern festgelegten Schwelle | 0,790 |
| Spezifität an der intern festgelegten Schwelle | 0,921 |
Die AUC von 0,934 sieht zunächst nach einer sehr guten Übertragbarkeit aus. Sie muss hier jedoch vorsichtig interpretiert werden. Allein aus Höhe und Breite der Bilddatei ließ sich die Diagnose bereits mit einer AUC von 0,915 vorhersagen. Aufnahmeformat und Diagnose waren also auch in diesem Datensatz miteinander verknüpft. Das Modell könnte einen Teil seiner Leistung aus solchen technischen Merkmalen beziehen, statt ausschließlich Lungenveränderungen zu erkennen.
Um diesen Größen-Confounder zumindest abzuschwächen, habe ich aus den Bildabmessungen zunächst einen technischen Risikoscore berechnet und den Datensatz anschließend in fünf Gruppen mit ähnlichem Score unterteilt. Innerhalb jeder Gruppe sind Bildgröße und Diagnose weniger stark gekoppelt. Die dort berechneten AUCs wurden nach der Zahl tatsächlich vergleichbarer Positiv-negativ-Paare gewichtet. So ergibt sich eine konservativere, größenbereinigte AUC von 0,923. Das Verfahren kann den Confounder nicht vollständig beseitigen, macht aber sichtbar, dass die Rangfolge des Modells nicht allein durch die Bildabmessungen erklärt wird.
Der obere Teil der Abbildung zeigt das größere Problem dieser externen Prüfung: Die Wahrscheinlichkeiten selbst ließen sich nicht übertragen. Das Modell gab im Mittel eine Pneumoniewahrscheinlichkeit von 25,1 Prozent aus, tatsächlich lag die Prävalenz bei 73,0 Prozent. Auch eine vorhergesagte Wahrscheinlichkeit von ungefähr 25 Prozent bedeutete hier in Wirklichkeit in rund 93 Prozent der Fälle Pneumonie. Die ECE stieg dadurch auf 0,478.
Eine Kontrollrechnung verschob lediglich den Achsenabschnitt der Kalibrierung auf die externe Prävalenz. Dadurch sank die ECE auf 0,164 und die mittlere Vorhersage stieg auf 70,8 Prozent. Das ist keine nachträgliche Reparatur des Modells: Die Rechnung verwendet die bereits bekannte Prävalenz des gesamten externen Datensatzes und zeigt nur, wie viel der Fehlkalibrierung durch den starken Prävalenzunterschied erklärbar ist. Vor einem realen Einsatz müsste die Kalibrierung an einer eigenen, repräsentativen Zielpopulation neu geschätzt und anschließend unabhängig geprüft werden.
Auch der intern festgelegte Schwellenwert wurde unverändert übernommen. Er erreichte eine Sensitivität von 79,0 Prozent und eine Spezifität von 92,1 Prozent. Von 2.357 als negativ eingestuften Aufnahmen zeigten dennoch 899 eine Pneumonie. Damit ist die zentrale Beobachtung: Das Modell sortiert die pädiatrischen Bilder noch vergleichsweise gut nach Risiko, aber seine Zahlenwerte und die daraus abgeleitete Ja-nein-Entscheidung sind in dieser Population nicht verlässlich übertragbar.
Der Datensatz enthält weder verlässliche Angaben zur Aufnahmeprojektion noch Bounding Boxes. Deshalb lassen sich hier weder der Projektions-Confounder noch der Lokalisationskopf extern prüfen. Außerdem handelt es sich ausschließlich um Kinder im Alter von ein bis fünf Jahren; aus diesem Ergebnis folgt ausdrücklich keine Aussage zur externen Leistung bei Erwachsenen.
Röntgenaufnahmen von Erwachsenen: VinDr-CXR
Die zweite externe Prüfung verwendet den VinDr-CXR-Datensatz. Er umfasst 18.000 frontale Thorax-Röntgenaufnahmen erwachsener Patientinnen und Patienten aus zwei Krankenhäusern in Vietnam. Für diese Auswertung habe ich die 15.000 Bilder des VinDr-Trainingssplits verwendet. „Training“ bezeichnet hier nur die Aufteilung der Datensatzautoren: Für mein Modell waren sämtliche Aufnahmen neu und wurden ausschließlich zur externen Prüfung benutzt. Jedes dieser Bilder wurde unabhängig von drei Radiologen befundet; lokale Auffälligkeiten sind zusätzlich durch Rechtecke markiert. Aufbau und Annotation des Datensatzes sind in der Originalpublikation beschrieben.
VinDr verwendet nicht genau dasselbe Ziel wie der RSNA-Datensatz. Als möglichst nahe Entsprechung habe ich die Befunde Lung Opacity, Consolidation und Infiltration zusammengefasst. Vor dem ersten Modelldurchlauf war festgelegt: Sobald mindestens einer der drei Radiologen einen dieser Befunde markiert hatte, galt das Bild als positiv. Damit ergaben sich 1.588 positive Aufnahmen. Bei 750 davon – also bei 47 Prozent – stammte die Markierung allerdings nur von einem einzigen Radiologen.
| Messgröße | Mindestens 1 von 3 Radiologen – vorab festgelegt | Mindestens 2 von 3 – nachträglich |
|---|---|---|
| Aufnahmen | 15.000 | 15.000 |
| Positive Aufnahmen | 1.588 (10,6 %) | 838 (5,6 %) |
| AUC des Ensembles | 0,837 (95-%-KI: 0,825–0,848) | 0,876 (95-%-KI: 0,863–0,888) |
| AUC nach Kontrolle der Bildgeometrie | 0,794 | 0,840 |
| Punkt-AUC des Lokalisationskopfs | 0,740 (95-%-KI: 0,727–0,752) | 0,802 (95-%-KI: 0,788–0,816) |
| ECE der unveränderten Kalibrierung | 0,024 | 0,060 |
| Sensitivität an der intern festgelegten Schwelle | 0,591 | 0,714 |
| Spezifität an der intern festgelegten Schwelle | 0,892 | 0,873 |
Die erste Spalte ist die eigentliche vorab festgelegte Auswertung. Für den Lokalisationskopf war als Mindestwert eine Punkt-AUC von 0,75 definiert. Dieser Wert stammt von einer festen Lage-Schablone, die aus den Trainingsannotationen gebildet wurde und das aktuelle Röntgenbild überhaupt nicht betrachtet. Extern erreichte der Kopf 0,740; selbst die obere Grenze des Konfidenzintervalls blieb mit 0,752 knapp auf Höhe dieser Schablone. Das primäre Kriterium wurde damit nicht bestanden. Intern hatte derselbe Kopf 0,912 erreicht.
Nach Betrachtung der vorab festgelegten binären Zielstruktur – Pneumonie gegenüber keiner Pneumonie – habe ich mich für eine zusätzliche, plausiblere Definition entschieden: Ein Bild gilt nur dann als positiv, wenn mindestens zwei der drei Radiologen den Befund gesehen haben. Eine einzelne abweichende Markierung führt damit nicht mehr automatisch zum positiven Label. Unter dieser Mehrheitsregel stieg die Punkt-AUC auf 0,802. Die Entscheidung fiel allerdings erst nach dem ersten Ergebnis. Deshalb bleibt sie eine nachträgliche Analyse und ersetzt die vorab festgelegte Auswertung nicht; beide Zahlen gehören nebeneinander in den Bericht.
Die Aufschlüsselung erklärt zumindest einen Teil des Unterschieds. Auf Bildern, bei denen nur ein Radiologe eine Verschattung markiert hatte, lag die Punkt-AUC des Lokalisationskopfs bei 0,669. Bei Zustimmung von zwei Radiologen stieg sie auf 0,754, bei Einstimmigkeit auf 0,849. Je klarer der Befund zwischen den Radiologen war, desto besser traf der Lokalisationskopf die markierte Region. Das spricht für einen starken Einfluss des Referenzstandards, beweist aber nicht, dass der Leistungsabfall ausschließlich durch uneinheitliche Beschriftungen verursacht wurde.
Auch bei VinDr ließ sich die Zielklasse bereits aus der ursprünglichen Bildgeometrie vorhersagen: Der reine Größen-Score erreichte je nach Labelregel eine AUC von 0,768 bis 0,782. Deshalb wurde die Klassifikations-AUC wieder innerhalb von fünf Gruppen ähnlicher Bildgeometrie berechnet und nach vergleichbaren Positiv-negativ-Paaren gewichtet. Danach verblieben 0,794 unter der vorab festgelegten Regel und 0,840 unter der Mehrheitsregel. Anders als der Lokalisationskopf überstand die reine Risikosortierung damit den Wechsel auf die erwachsene Population vergleichsweise gut.
Die Kalibrierung verhielt sich deutlich anders als im pädiatrischen Datensatz. Unter der vorab festgelegten Regel lag die ECE bei 0,024 und damit relativ nahe am internen Wert von 0,009. Eine rechnerische Anpassung an die niedrigere Prävalenz verschlechterte sie sogar auf 0,050. Unter der Mehrheitsregel lag die ECE zunächst bei 0,060 und sank durch dieselbe Art von Prävalenzverschiebung auf 0,026. Die Modellwerte sind also nicht nur von der untersuchten Population abhängig, sondern auch davon, welche radiologische Übereinkunft als Wahrheit definiert wird.
Bei der unveränderten internen Schwelle betrug die Sensitivität unter der vorab festgelegten Regel nur 59,1 Prozent, die Spezifität 89,2 Prozent. Unter der Mehrheitsregel waren es 71,4 beziehungsweise 87,3 Prozent. Die niedrigere Sensitivität ist hier nicht einfach eine schlechte Kalibrierung: Gerade die von nur einem Radiologen markierten und vermutlich subtileren Befunde erhielten häufig niedrige Modellwerte. Schwellenwerte sind deshalb keine festen Eigenschaften eines Modells, sondern hängen auch vom Fallspektrum und vom Referenzstandard ab.
Auch VinDr beantwortet nicht jede offene Frage. Die verwendete 512-Pixel-Fassung enthält keine DICOM-Kopfzeilen und damit keine verlässliche Angabe zur Aufnahmeprojektion. Der noch vorhandene Projektions-Confounder kann auf diesem Datensatz daher nicht extern gemessen werden. Hinzu kommt, dass VinDr ausschließlich frontale Aufnahmen enthält. Die Erwachsenen-Validierung prüft somit Klassifikation und Lokalisation in einer neuen Population, aber weder Seitaufnahmen noch die Übertragbarkeit des Projektionssignals.
Verworfene Ansätze
Mehrere Varianten wurden gemessen und anschließend verworfen:
- Eine pixelgenaue Lungenmaske verwarf 12,9 Prozent der annotierten Rechteckfläche und ließ die Herzsilhouette als neue technische Form zurück.
- Die Normalisierung jedes einzelnen Bildes und CLAHE verstärkten den Projektionshinweis.
- Ein adaptiver Zuschnitt auf die Lunge codierte die Aufnahmeart als Vergrößerungsfaktor neu. Ein fester Ausschnitt verbesserte den Zielwert ebenfalls nicht.
- Eine stärkere geometrische Augmentation entfernte nur etwa 24 Prozent des beabsichtigten Größenhinweises und veränderte den Confounder nicht zuverlässig.
- Die höhere Auflösung von 512 statt 224 Pixeln verbesserte weder Diagnose noch Confounder. Der unerwünschte Hinweis wechselte vom globalen Grauwert zu feiner Textur.
- Ein sehr starker Helligkeits- und Kontrast-Jitter erhöhte die Robustheit gegen Helligkeitsänderungen, senkte den Projektionskanal aber nicht zuverlässig.
Zu jedem verworfenen Versuch liegen Rohvorhersagen, Auswertung und Begründung im Experimentarchiv auf GitHub. Die Git-Historie dokumentiert zusätzlich, wann Vorfestlegungen, Läufe und Bewertungen entstanden sind.
Schlussfolgerung
Das Projekt hat mir gezeigt, wie eng Modell, Daten und Auswertung zusammenhängen. Technisch ließ sich das ResNet-18 auf Röntgenbilder übertragen. Der zweite Kopf lernte eine brauchbare Lokalisationskarte, und das Ensemble erreichte auf dem internen Holdout eine geschichtete AUC von 0,8687. Ohne die übrigen Prüfungen wäre diese Zahl allerdings leicht zu überschätzen.
Am meisten gelernt habe ich an den Stellen, an denen plausible Ideen nicht funktioniert haben. Das Modell nutzte die Aufnahmeart, obwohl sie nicht der gesuchte Befund war. Bildmaskierung, individuelle Normalisierung und höhere Auflösung lösten das Problem nicht. Das gewichtete Sampling reduzierte den Zusammenhang, verringerte aber zugleich die Diagnoseleistung. Auf beiden externen Datensätzen blieb die Risikosortierung erhalten: größenbereinigt 0,923 auf Kermany und 0,794 auf VinDr unter der vorab festgelegten Labelregel. Die Kalibrierung brach auf den pädiatrischen Aufnahmen ein, hielt sich bei den Erwachsenen aber wesentlich besser.
Der Lokalisationskopf zeigte eine weitere Grenze. Unter der vorab festgelegten VinDr-Auswertung blieb er knapp unter einer Schablone, die das Bild gar nicht ansieht. Mit einer erst später ergänzten Mehrheitsregel lag er darüber; dieses bessere Resultat darf das ursprüngliche Scheitern aber nicht rückwirkend ersetzen.
Genau diese Zusammenhänge wollte ich mit dem Hobbyprojekt nachvollziehen. Der verbleibende Confounder, die verworfenen Experimente, die uneinheitlichen Referenzlabels und die nur teilweise Übertragbarkeit gehören deshalb ebenso zum Ergebnis wie die AUC des Ensembles.
Glossar
| Begriff | Erklärung |
|---|---|
| AUC | Wahrscheinlichkeit, dass ein positiver Fall höher bewertet wird als ein negativer; 0,5 ist Zufall. |
| Augmentation | Künstliche, plausible Veränderung eines Trainingsbildes, etwa leichte Drehung oder Helligkeitsänderung. |
| Batch | Kleine Gruppe von Bildern, die gemeinsam durch das Netz läuft, bevor die Gewichte aktualisiert werden. |
| Backpropagation | Rückwärtsrechnung, mit der bestimmt wird, wie die Modellgewichte den Loss beeinflusst haben. |
| Binäre Kreuzentropie | Verlustfunktion für zwei Klassen, die sichere Fehlvorhersagen besonders stark gewichtet. |
| Calibration / Kalibrierung | Anpassung der Wahrscheinlichkeitsskala, damit Vorhersagen und beobachtete Häufigkeiten besser übereinstimmen. |
| CNN / Faltungsnetz | Neuronales Netz, das Bilder mit kleinen, lernbaren Filtern verarbeitet. |
| Confounder | Störfaktor, der mit der Zielklasse zusammenhängt und dem Modell eine unerwünschte Abkürzung bietet. |
| ECE | Mittlere Abweichung zwischen vorhergesagter Wahrscheinlichkeit und tatsächlich beobachteter Häufigkeit; kleiner ist besser. |
| Ensemble | Mehrere Modelle lösen dieselbe Aufgabe; ihre Antworten werden zusammengeführt. |
| Epoche | Ein vollständiger Durchgang durch alle Trainingsbeispiele. |
| Fine-Tuning | Weiterlernen eines vortrainierten Modells auf einer neuen Aufgabe. |
| Fold | Teil eines Datensatzes in der Kreuzvalidierung. |
| Grad-CAM | Nachträgliche Karte der Regionen, die den Klassifikationswert beeinflusst haben. |
| Holdout | Bis zum Schluss unangetastete Abschlussprüfung. |
| Logit | Rohwert des Netzes vor der Umwandlung in eine Wahrscheinlichkeit. |
| Loss | Zahl dafür, wie falsch die aktuelle Modellausgabe ist. |
| Parameter / Gewicht | Gelernte Zahl im Modell, die bestimmt, wie Eingangssignale verrechnet werden. |
| Platt-Kalibrierung | Monotone logistische Kurve mit zwei Parametern, die Modellwerte in besser kalibrierte Wahrscheinlichkeiten umrechnet. |
| ResNet | Netzarchitektur mit Abkürzungsverbindungen, die das Training tiefer Modelle erleichtern. |
| Sigmoid | Funktion, die einen beliebigen Rohwert in den Bereich von 0 bis 1 überführt. |
| Transfer Learning | Wiederverwendung eines Startmodells, das zuvor auf einer größeren Aufgabe trainiert wurde. |
Reproduzierbarkeit und Code
- GitHub-Repository mit Projektübersicht und Ergebnissen
- Trainingsskript des ausgelieferten Modells
- Trainingscode und Zwei-Kopf-Modell
- Modellimplementierung für die Webanwendung
- Kalibrierung, Gewichte und Schwelle
- Archiv der verworfenen Experimente
- Ergebnis des einmaligen Holdout-Laufs
- Experiment zum zweiten Kopf und zu Grad-CAM
- Auswertung der externen Kermany-Validierung
- Maschinenlesbarer Bericht der Kermany-Validierung
- Auswertung der externen VinDr-Validierung
- Vorfestlegung der VinDr-Auswertung
- Ergebnis, Mehrheitsregel und Korrektur der Kalibrierungsrechnung
- Maschinenlesbare Berichte der VinDr-Validierung
Die Architekturabbildung lässt sich mit generate_architecture_figure.py reproduzieren. Die Vergleichsgrafik mit den drei Modellbeispielen wird durch generate_example_figure.py erzeugt. Die Grafiken zur externen Validierung entstehen mit rsna_extern_kermany_bild.py und rsna_extern_vindr_bild.py unmittelbar aus den gespeicherten Vorhersagen.