Eine End-to-End-Pipeline zur Erkennung von Lungenentzündung aus Röntgenbildern
Stecken Sie hinter der Paywall? Klicken Sie hier, um die ganze Geschichte mit meinem Freund Link zu lesen!Das Risiko einer Lungenentzündung ist für viele immens, insbesondere in Entwicklungsländern, in denen Milliarden von Menschen von Energiearmut betroffen sind und auf umweltschädliche Energieformen angewiesen sind. Die WHO schätzt, dass jährlich über 4 Millionen vorzeitige Todesfälle durch luftverschmutzungsbedingte Krankheiten im Haushalt, einschließlich Lungenentzündung, auftreten. Über 150 Millionen Menschen infizieren sich jährlich mit Lungenentzündung, insbesondere Kinder unter 5 Jahren. In solchen Regionen kann sich das Problem aufgrund des Mangels an medizinischen Ressourcen und Personal weiter verschärfen. In den 57 afrikanischen Ländern besteht beispielsweise eine Lücke von 2,3 Millionen Ärzten und Krankenschwestern. Für diese Populationen bedeutet eine genaue und schnelle Diagnose alles. Es kann den rechtzeitigen Zugang zu Behandlungen garantieren und denjenigen, die bereits von Armut betroffen sind, dringend benötigte Zeit und Geld sparen.
Dieses Projekt ist Teil der Röntgenbilder des Brustkorbs (Pneumonie) auf Kaggle.
Erstellen Sie einen Algorithmus, um automatisch zu erkennen, ob ein Patient an einer Lungenentzündung leidet oder nicht, indem Sie Röntgenbilder des Brustkorbs betrachten. Der Algorithmus musste extrem genau sein, da das Leben von Menschen auf dem Spiel steht.
Umgebung und tools
scikit-learn
keras
numpy
pandas
matplotlib
Data
Der Datensatz kann von der Kaggle-Website heruntergeladen werden, die hier zu finden ist.
Wo ist der Code?
Lassen Sie uns ohne viel Aufhebens mit dem Code beginnen. Das komplette Projekt auf github finden Sie hier.
Beginnen wir mit dem Laden aller Bibliotheken und Abhängigkeiten.
Als nächstes habe ich einige normale und ähnliche Bilder angezeigt, um nur einen Blick darauf zu werfen, wie unterschiedlich sie mit bloßem Auge aussehen. Nun, nicht viel!
Beispielbilder Dann habe ich den Datensatz in drei Sätze aufgeteilt – Zug—, Validierungs- und Testsätze.
Als nächstes schrieb ich eine Funktion, in der ich eine Datenvergrößerung durchführte und die Trainings- und Testbilder an das Netzwerk weitergab. Außerdem habe ich Etiketten für die Bilder erstellt.
Die Praxis der Datenvergrößerung ist ein effektiver Weg, um die Größe des Trainingssatzes zu erhöhen. Durch die Erweiterung der Trainingsbeispiele kann das Netzwerk während des Trainings vielfältigere, aber immer noch repräsentativere Datenpunkte „sehen“.
Dann habe ich ein paar Datengeneratoren definiert: einen für Trainingsdaten und den anderen für Validierungsdaten. Ein Datengenerator ist in der Lage, die erforderliche Datenmenge (ein Mini—Stapel von Bildern) direkt aus dem Quellordner zu laden, sie in Trainingsdaten (die dem Modell zugeführt werden) und Trainingsziele (ein Vektor von Attributen – das Überwachungssignal) umzuwandeln.
Für meine Experimente setze ich normalerweise die batch_size = 64
. Im Allgemeinen sollte ein Wert zwischen 32 und 128 gut funktionieren. Normalerweise sollten Sie die Stapelgröße entsprechend den Rechenressourcen und der Leistung des Modells erhöhen / verringern.
Danach habe ich einige Konstanten für die spätere Verwendung definiert.
Der nächste Schritt bestand darin, das Modell zu erstellen. Dies kann in den folgenden 5 Schritten beschrieben werden.
Ich habe fünf Faltungsblöcke verwendet, die aus Faltungsschicht, Max-Pooling und Batch-Normalisierung bestehen.
Darüber hinaus habe ich eine Ebene abgeflacht und vier vollständig verbundene Ebenen gefolgt.
Auch zwischendurch habe ich Aussetzer verwendet, um Überanpassung zu reduzieren.
Die Aktivierungsfunktion wurde mit Ausnahme der letzten Schicht, in der sie sigmoid war, vollständig reluiert, da dies ein binäres Klassifizierungsproblem ist.
Ich habe Adam als Optimierer und Cross-Entropy als Verlust verwendet.
Vor dem Training des Modells ist es sinnvoll, einen oder mehrere Callbacks zu definieren. Ziemlich praktisch sind: ModelCheckpoint
und EarlyStopping
.
ModelCheckpoint: Wenn das Training viel Zeit benötigt, um ein gutes Ergebnis zu erzielen, sind oft viele Iterationen erforderlich. In diesem Fall ist es besser, eine Kopie des Modells mit der besten Leistung nur dann zu speichern, wenn eine Epoche endet, die die Metriken verbessert.
EarlyStopping: Manchmal können wir während des Trainings feststellen, dass die Generalisierungslücke (dh der Unterschied zwischen Trainings- und Validierungsfehler) zunimmt, anstatt abzunehmen. Dies ist ein Symptom für eine Überanpassung, das auf viele Arten gelöst werden kann (Verringerung der Modellkapazität, Erhöhung der Trainingsdaten, Datenvergrößerung, Regularisierung, Ausfall usw.). Oft besteht eine praktische und effiziente Lösung darin, das Training zu beenden, wenn sich die Verallgemeinerungslücke verschlimmert.
Als nächstes trainierte ich das Modell für 10 Epochen mit einer Losgröße von 32. Bitte beachten Sie, dass normalerweise eine höhere Batchgröße bessere Ergebnisse liefert, jedoch auf Kosten eines höheren Rechenaufwands. Einige Untersuchungen behaupten auch, dass es eine optimale Chargengröße für beste Ergebnisse gibt, die durch die Investition einiger Zeit in die Hyper-Parameter-Abstimmung gefunden werden könnte.
Lassen Sie uns die Verlust- und Genauigkeitsdiagramme visualisieren.
Genauigkeit vs Epoche / Verlust vs Epoche So weit so gut. Das Modell konvergiert, was sich aus der Abnahme des Verlusts und dem Validierungsverlust mit Epochen ergibt. Es ist auch in der Lage, 90% Validierungsgenauigkeit in nur 10 Epochen zu erreichen.
Lassen Sie uns die Verwirrungsmatrix zeichnen und einige der anderen Ergebnisse wie Präzision, Rückruf, F1-Score und Genauigkeit erhalten.
CONFUSION MATRIX ------------------ ] TEST METRICS ---------------------- Accuracy: 91.02564102564102% Precision: 89.76190476190476% Recall: 96.66666666666667% F1-score: 93.08641975308642 TRAIN METRIC ---------------------- Train acc: 94.23
Das Modell kann eine Genauigkeit von 91,02% erreichen, was angesichts der Größe der verwendeten Daten ziemlich gut ist.
Schlussfolgerungen
Obwohl dieses Projekt noch lange nicht abgeschlossen ist, ist es bemerkenswert, den Erfolg von Deep Learning bei so unterschiedlichen Problemen in der realen Welt zu sehen. Ich habe gezeigt, wie man positive und negative Pneumoniedaten aus einer Sammlung von Röntgenbildern klassifiziert. Das Modell wurde von Grund auf neu erstellt, was es von anderen Methoden unterscheidet, die stark auf dem Transferlernansatz beruhen. In Zukunft könnte diese Arbeit erweitert werden, um Röntgenbilder zu erkennen und zu klassifizieren, die aus Lungenkrebs und Lungenentzündung bestehen. Die Unterscheidung von Röntgenbildern, die Lungenkrebs und Lungenentzündung enthalten, war in letzter Zeit ein großes Problem, und unser nächster Ansatz sollte darin bestehen, dieses Problem anzugehen.