Hautkrebs mittels Künstlicher Intelligenz erkennen — ResNet-50 und fast.ai

Im Mai 2019 wurde das Paper “Deep learning outperformed 136 of 157 dermatologists in a head-to-head dermoscopic melanoma image classification task” im “European Journal of Cancer” veröffentlicht. In dieser Studie wurde das vortrainierte CNN Modell ResNet50 zur Bilderkennung von Hautkrebs verwendet und verfeinert. In diesem Artikel werden zunsächst zusätzlich verschiedene Einflussfaktoren für das Modell erläutert. Im Anschluss wird ein einfacher aber dennoch effektiver Nachbau in nur 6 Zeilen Code beschrieben.

Maligner Tumor der Haut? (Quelle: International Skin Imaging Collaboration Archiv)

Die Erkennung von bösartigem Hautkrebs allein anhand von Bildern erweist sich als sehr schwierig. Bei malignen Tumoren existieren keine typischen Formen und Größen. Auch die Färbung der Wucherungen sind nicht immer ein eindeutiger Hinweis. Daher entfernt der Arzt bei einem Verdacht die erkrankte Haut operativ und lässt die Probe im Anschluss zusätzlich histologisch untersuchen.

Ziel von Brinker et al. war ein Vergleich zwischen 157 Experten von 14 Universitätskliniken und einem “Machine Learning” Modell bei der Bildanalyse zu ziehen. Dafür wurden zunächst 100 Bilder (jeweils 80 gutartige und 20 bösartige Wucherungen) randomisiert aus der Datenbank von ISIC (“International Skin Imaging Collaboration”) ausgewählt. Im Anschluss mussten die Hautärzte die Bilder klassifizieren.

Evaluation

Als Metrik wurde die allgemeine Fehlerrate, Sensitivität und Spezifität betrachtet. Die Fehlerrate betrachtet, wie viele Bilder falsch eingeordnet wurden. Dabei wird nicht die Art des Fehlers betrachtet: Ob nun eine in Wirklichkeit gutartige Wucherung als bösartig eingestuft wurde oder andersherum ist nicht von Belang.

Die Sensitivität (auch: “True positive rate”) betrachtet wie viele bösartige Tumore auch als malignes Karzinom eingeordnet wurden. Dies ist daher besonders wichtig, da ein bösartige Tumor nicht als gutartiger Tumor klassifiziert werden sollte!

Sensitivität = Anzahl der klasssifizierten Bilder mit bösartigen Tumoren / Anzahl der Bilder mit tatsächlich bösartigen Hauttumoren

Die Spezifität (auch: “True negative rate”) hingegen bewertet, wieviel Bilder als Bilder mit gutartigen Tumoren bewertet wurden und stellt das in Relation zur Gesamtanzahl an tatsächlich benignen Tumorbildern:

Spezifität = Anzahl der klassifizierten Bilder mit gutartigem Tumor / Anzahl der Bilder mit tatsächlich gutartigen Hauttumoren

Bei den Hautärzten lag der Median bei einer Sensitivität von 74,1% und Spezifität von 60%. Die ResNet-50 Modelle erzielten dazu im Vergleich bei einer Sensitivität von 74,1% eine Spezifität von 86,5%.

Damit wurden bei einer gleichen Sensitivität deutlich mehr “nicht bösartige Tumore” auch als “nicht bösartig” klassifiziert. Es wird ersichtlich, dass Hautärzte im Zweifel eher zu einer Einordung als “malignes Karzinom” tendiert haben. Dies ist auch sinnvoll, denn ein fälschlicherweise böser Hautkrebs, der als “nicht malign” klassifiziert wird, ist schlimmer als ein gutartiger Hautkrebs, der vorsorglich als bösartige Wucherung bewertet wird.

Dennoch wurden im Median nur ca. 75% aller wirklich bösartigen Tumore als bösartig klassifiziert. Dies zeigt, dass eine histologische Untersuchung des Gewebes nach der Entfernung unbedingt nötig ist!

ResNet-50: Daten und Infos

Im Paper wurde ein ResNet-50 Modell verwendet. Wir werden dies schnell und einfach mit der fast.ai Bibliothek und Pytorch jetzt nachbauen. Als Datenquelle dient uns dabei auch hier die öffentlich zugänglich Bilddatenbank ISIC.

In meinem passenden Github Repository biete ich die im Folgenden verwendeten 600 Bilder zum Download an. Der Quellcode für das Projekte steht auch als Jupyter Notebook bereit.

Zu beachten ist, dass in meinem Datensatz ca. 73% aller Bilder gutartige Verwachsungen zeigen. Dahingehend wird beim Testen des Modells auch dieses Verhältnis erhalten bleiben. In dem Paper lag das Verhältnis im Testsatz bei 80:20 (gutartig/bösartig).

Laden der Bibliotheken

Zuerst importieren wir fastai von fast.ai . Jeremy Howard hat mit seinen Onlinekursen und der Programmbibliothek einen tollen Einstieg in Deep Learning geschaffen:

from fastai.vision import *
from fastai.metrics import error_rate

Importieren der Daten

Im Anschluss adressieren wir den Speicherort für Bilder und die CSV-Datei, die die Labels (benign, malignat) für die Bilder beinhaltet.

path = Path(“data”)

Im nächsten Schritt laden wir die Labels aus der CSV in einen DataFrame:

df = pd.read_csv(path/’metadata.csv’)
df = df[[‘name’,’meta.clinical.benign_malignant’]]
df = df.loc[(df[‘meta.clinical.benign_malignant’] != ‘indeterminate’) & (df[‘meta.clinical.benign_malignant’] != ‘indeterminate/malignant’)]

Wir entfernen dabei Bilder, die nicht als gut- oder bösartige Tumore definiert wurden (“indeterminate”).

Danach laden wir die Dateien in ein “ImageDataBunch” Objekt. Dadurch werden die Daten automatisch in Train- und Testdaten aufgeteilt und es werden keine weiteren Preprocessing Schritte erforderlich:

np.random.seed(42)
bs = 16
#bs = 64
data = ImageDataBunch.from_df(path, df=df, ds_tfms=get_transforms(), suffix=’.jpg’, size=700, bs=bs).normalize(imagenet_stats)

Modellerstellung und -training

Wir können damit schon das Modell erstellen:

learn = cnn_learner(data, models.resnet50, metrics=error_rate)

… und trainieren:

learn.fit_one_cycle(10)

Erkenntnisse

Mit einem Bruchteil der Daten (600 statt 20.000 Fotos wie im Originalpaper) ergab das CNN folgende Werte:

# ResNet50 - 500px Bildgrößeepoch       train_loss       valid_loss       error_rate       time                       0       1.176972       0.747693       0.243697       00:50                 1       1.217858       1.338248       0.445378       00:38                 2       1.073678       0.790751       0.260504       00:38                 3       0.888978       0.603722       0.218487       00:39                 4       0.733704       0.563326       0.235294       00:38                 5       0.651154       0.597901       0.235294       00:38                 6       0.559720       0.502858       0.184874       00:38                 7       0.487279       0.519738       0.218487       00:39                 8       0.444007       0.494015       0.193277       00:39                 9       0.390069       0.484067       0.184874       00:40
Train- und Validation Loss über die Anzahl der verarbeiteten Batches

Die Fehlerrate betrug im Minimum 18,5%. Die Sensitivät bei 66% erzielte eine Spezifität von 93% (siehe Klassifikationsmatrix):

Binäre Klassifikationsmatrix

Wie wirkt sich eine Reduzierung der Modellgröße (ResNet-34) aus?

# Resnet34 - 600 Bilderepoch       train_loss       valid_loss       error_rate       time                       0       1.188662       0.645911       0.285714       00:36                 1       1.006285       0.654783       0.302521       00:36                 2       0.898887       0.800139       0.268908       00:36                 3       0.801402       0.660271       0.268908       00:36                 4       0.726627       0.625567       0.268908       00:35                 5       0.640710       0.505276       0.210084       00:35                 6       0.550985       0.546546       0.243697       00:36                 7       0.497960       0.522388       0.226891       00:35                 8       0.455487       0.504230       0.193277       00:36                 9       0.424492       0.509144       0.210084       00:35

Eine Verkleinerung der Layerstruktur von 50 auf 34 verschlechtert die Ergebnisse: Die Sensitivität minimierte sich auf 50% bei einer ebenfalls sinkenden Spezifität von 90,5%. Der Anwendungsfall profitiert von einem größeren Algorithmenmodell.

Wie wirkt sich eine Reduzierung der Bildermenge aus?

ResNet-34 300 Bilderepoch       train_loss       valid_loss       error_rate       time                       0       1.388758       1.014975       0.525424       00:28                 1       1.154910       0.914468       0.355932       00:21                 2       1.052586       1.064909       0.288136       00:21                 3       0.936718       0.796608       0.254237       00:21                 4       0.820141       0.583715       0.203390       00:21                 5       0.681445       0.689949       0.254237       00:20                 6       0.612125       0.704821       0.288136       00:21                 7       0.554546       0.632347       0.220339       00:21                 8       0.483023       0.624757       0.237288       00:20                 9       0.459009       0.632007       0.254237       00:21

Durch die künstliche Verminderung der Datenpunkte um 50% verschlechtert sich das Modell. Die Fehlerrate erhöht sich.

Auch die Reduzierung der Bildergröße von 700 auf 500 Pixel verminderte im Test die Qualität des Modells. Je größer das Bild, desto besser können Muster vom Modell aufgegriffen werden.

Allerdings hatte Progressive Resizing einen positiven Einfluss: Dabei wird schrittweise die Größe der Bilder im Fortschreiten des Trainings langsam erhöht. Dadurch kann das Modell besser generalisieren und von kleinen Bildern bis hin zu größeren Bildern besser lernen.

Fazit

Künstliche Intelligenz kann ein zusätzliches Hilfsmittel in der Erkennung von Hautkrebs sein. Im Zweifel sollte aber immer auch eine Biopsie erfolgen!

Das Modell im Beispiel reduziert die Fehlerrate von 27% (Raten durch Zufall) auf bis zu 19%. Die Sensitivät bei 66% erzielte eine Spezifität von 93%. Für die überschaubare Menge an Bildern (600 Datenpunkte) ein bemerkenswertes Ergebnis. Der Algorithmus scheint bereits bei einer kleinen Datensatz Anhaltspunkte für einen bösartigen Tumor wiederzuerkennen.

ResNet-Modelle profitierten in diesem Beispiel von

  • einer hohen Bildqualität
  • große Anzahl an Bilddaten
  • großen Anzahl von Schichten (50 statt 34)
  • Progressive Resizing

Data Science | Python | Qlik Sense | Kaffee | Frankfurt | Kontakt: stefan-preusler.de

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store