Heilbronn ist vorbei. Sonderpreis „Gute Prävention und Rehabilitation” der Deutschen Gesetzlichen Unfallversicherung, 1.000 Euro. Kein Bundessieg. Für ein Projekt, das als Seminarfacharbeit angefangen hat, nehme ich das trotzdem sehr gern.
Am Anfang stand eine Zahl aus der Recherche: Die manuelle Diagnose einer Lungenentzündung auf Röntgenbildern liegt bei etwa 76 Prozent Genauigkeit, und in ländlichen Regionen fehlen Radiologen. Nico, Dustin und ich wollten wissen, ob ein neuronales Netz Ärzten da helfen kann. Daraus wurde unsere Besondere Lernleistung am Spezialschulteil des Albert-Schweitzer-Gymnasiums in Erfurt, ab der elften Klasse. Dafür haben wir mit einer Uniklinik zusammengearbeitet. Das hat vor allem Hartnäckigkeit gebraucht.
Ich habe nicht mit PyTorch angefangen, sondern mit NumPy. Erst ein eigenes Netz, Backpropagation von Hand. Langsam, aber danach war klar, was in den Frameworks eigentlich passiert. Dann kam der systematische Vergleich: ResNet, DenseNet, EfficientNet, ConvNeXt und VGG19 auf vier öffentlichen Datensätzen mit bis zu 30.000 Bildern. Dazu eine Lungensegmentierung mit Attention-U-Net und Class Activation Mapping, damit man sieht, wohin das Modell schaut. Am Ende lief alles in einem DICOM-Viewer.
Der Viewer ist der Teil, den man anfassen kann, und für mich das eigentliche Produkt. DICOM ist das Format, in dem Kliniken Röntgenbilder speichern, Bild und Patientendaten in einer Datei. Ein Modell, das nur in einem Notebook läuft, hilft keinem Arzt. Also muss das Modell dahin, wo Ärzte sowieso hinschauen. Der Viewer zeigt die Dateien und eine Patientenliste, in der Mitte das Röntgenbild. Er lässt die Modelle über das Bild laufen und zeigt das Ergebnis direkt darin: die Einschätzung Pneumonie oder gesund, die Lungenmaske aus der Segmentierung und die Class Activation Map als Heatmap. Die Heatmap zeigt, welche Regionen für die Entscheidung am meisten gezählt haben. Leuchtet sie neben der Lunge statt in ihr, stimmt etwas nicht, egal wie sicher das Modell klingt. Genau dafür ist sie da. Eine vollständige Fassung gibt es in C++ mit Qt, eine Testfassung in Python. Die Demo auf dieser Seite baut die Python-Fassung nach, mit öffentlichen Beispielbildern und einer Lupe für die Heatmap. Sie stellt keine Diagnose.