Am veröffentlicht

Die fast.ai Deep Learning Library – Erfahrungen anhand eines simplen Image Classifiers

Der Bereich des maschinellen Lernens sowie dessen Teilgebiete, werden in vielen Bereichen immer relevanter. Vor allem der Bereich des Deep Learning, also der tiefen neuronalen Netze, findet nun auch in immer mehr Einsatzbereichen wirtschaftliche Anwendungen und entwächst der rein akademischen Forschung. Erst kürzlich konnte die Firma Deep Mind, eine Tochter von Alphabet Inc., dem Mutterkonzern von Google bahnbrechende Erfolge in dem sehr relevanten Bereich der Proteinfaltung verzeichnen. Dem Deep Mind Team gelang es dabei sehr präzise Vorhersagen zu der Faltung von verschiedenen Proteinen zu treffen, die bisher in einem aufwändigen Prozess und meist manuell identifiziert werden mussten.

Neuronale Netze werden jedoch auch in vielen anderen Bereichen, allen voran der Bilderkennung und der Verarbeitung von natürlicher Sprache verwendet. Daraus ergeben sich vielversprechende Anwendungen für Unternehmen. Von der automatischen Erkennung fehlerhafter Teile in der Industrie mittels Bilderkennung bis hin zu intelligenten Chatbots, die im Handel ohne menschliches Zutun die Fragen der Kunden beantworten können.

In vielen Unternehmen gibt es jedoch noch diverse Barrieren, die dazu führen, dass diese Technik noch immer nicht sehr weit verbreitet ist. Eines der Hindernisse ist sicherlich die Komplexität des Themas und die damit verbundene nötige Expertise im Umgang mit neuronalen Netzen. Genau an diesem Punkt setzt fast.ai an.

fast.ai – eine kurze Vorstellung

Die Website von fast.ai bietet einen sehr populären und praktisch orientierten Onlinekurs zum Thema Deep Learning. Dieser baut auf der gleichnamigen high-level Python Bibliothek namens “fast.ai” auf. Bei der fast.ai Bibliothek handelt es sich um eine mehrschichtige Bibliothek, die auf PyTorch, einer der zwei bekanntesten Deep Learning Libraries (TensorFlow/Google & PyTorch/Facebook), aufbaut. Die Bibliothek wurde von anerkannten Forschern auf dem Gebiet der neuronalen Netze entwickelt, die sie bereits in zahllosen Projekten angewendet und verfeinert haben.

Fast.ai – Warum sich der Einsatz lohnt

Der enorme Nutzen von fast.ai, besonders im Unternehmensumfeld, liegt in mehreren Tatsachen begründet. Zum einen erlaubt fast.ai durch die mehrschichtige Architektur einen vergleichsweise schnellen und einfachen Einstieg in das Themenfeld der neuronalen Netze und bietet eine erstaunliche Flexibilität mit tiefgreifenden Funktionen. Abbildung 1 zeigt die Architektur der Bibliothek, die auf der obersten Ebene direkten Zugriff auf die leistungsstarke und anwendungsorientierte Schicht bietet, aber darunter viele weiter reichende Eingriffsmöglichkeiten zulässt. Mit dieser Herangehensweise können bereits sehr gute Ergebnisse erzielt werden, auch ohne bereits einen Experten auf dem Gebiet im Unternehmen zu haben.

Abbildung 1 – fast.ai mehrschichtige Architektur. (Quelle: https://arxiv.org/pdf/2002.04688.pdf)

Weiterhin erlaubt der Einsatz einer Bibliothek wie fast.ai auch größtmögliche Unabhängigkeit von (Cloud-)Anbietern, welche heutzutage einige der “klassischen” Deep Learning Aufgaben, wie die Bilderkennung in ihr Serviceangebot mit aufgenommen haben und mit ihren proprietären Deep Learning Modellen betreiben.

Bisherige Erfahrung

Die bisherigen Erfahrungen orientieren sich primär an der obersten Abstraktionsschicht der fast.ai Library, also den Applications. Aufgrund des zugehörigen Kurses, sowie der großen Community an Lernenden, ist die Dokumentation ausgesprochen gut. Somit gibt es zu praktisch jeder Frage bereits eine Antwort. Die Dokumentation ist klar verständlich und auch ohne tiefgreifende Vorkenntnisse leicht nachzuvollziehen. Darüber hinaus gibt es viele Beispiele, die man auf einfache Art und Weise nachbauen und an seine Bedürfnisse anpassen kann.
Dies gilt nicht nur für einen einzelnen speziellen Bereich, sondern für alle Teile der Bibliothek. Darüber hinaus wird die Bibliothek mittlerweile von vielen Cloud Anbietern unterstützt, sodass auch ohne eigene Hardware aufwendige Modelle trainiert und benutzt werden können. Als einer der größten Anbieter sei hier Paperspace genannt.

Beispiel von fast.ai anhand eines simplen Image Classifiers

Ziel der Übung soll es sein, zu demonstrieren, wie schnell und einfach sich mit Hilfe der fast.ai Bibliothek ein simpler Image Classifier mit erstaunlich guter Treffsicherheit trainieren lässt. In dem simplen Beispiel soll es darum gehen, dass der resultierende Classifier zwischen einem Elefanten und einem Nashorn unterschieden kann. Das gesamte Beispiel läuft in einer interaktiven Jupyter Notebook Umgebung und bedient sich dem Teil der Bibliothek, der sich mit der Bilderkennung beschäftigt. Das Beispiel orientiert sich an Kapitel zwei des Buches “Deep Learning for Coders with Fastai and Pytorch: AI Applications Without a PhD”, Howard, J. und Gugger, S., 2020, O’Reilly Media, Incorporated.

Schritt 0: Setup

Wir gehen davon aus, dass die fast.ai Library mit allen Abhängigkeiten bereits installiert und eingerichtet ist. Am einfachsten ist dies sicherlich bei einem Cloud Anbieter, der fast.ai offiziell unterstützt, so z.B. gradient von Paperspace. Sollte man die Bibliothek jedoch lokal benutzen wollen, so findet man auch dazu viele hilfreiche Ressourcen auf der offiziellen fast.ai Website. Ist alles installiert, müssen wir anfänglich nur die nötigen Bibliotheken einbinden.

from fastai.vision import *
from fastai.vision.utils import *
from fastai.vision.data import *
from requests import *
from pathlib import Path

Schritt 1: Daten sammeln

Um den Image Classifier zu trainieren, benutzen wir die Bing Image Search API. Mit dieser können wir automatisiert Bilder zum Trainieren unseres Modells beziehen. Dafür wird für unser Beispiel lediglich ein kostenloser API Key benötigt, der sich hier erstellen lässt: https://docs.microsoft.com/en-us/bing/search-apis/bing-web-search/create-bing-search-service-resource.

Mit diesem Schlüssel und einem geeigneten Suchbegriff kann nun schnell und einfach eine ausreichend große Menge an Bildmaterial für das Training gewonnen werden. Dafür erstellen wir mit folgendem Code und unserem API Schlüssel eine Liste mit Tieren, die wir identifizieren wollen und dann die restlichen Ordner, in die wir die Bilder herunterladen. Dadurch wird für jedes Tier ein eigener Ordner im Oberordner “Tiere” angelegt und die Bilder werden automatisch über Bing gesucht und dort hinein geladen.

api_key = ‘[Hier den API Schlüssel eintragen]’
tiere = ['cat','dog','rhino']
path = Path('tiere')

if not path.exists():
path.mkdir()
for o in tiere:
dest = (path/o)
dest.mkdir(exist_ok=True)
params = {'q':o, 'count':150, 'min_height':128, 'min_width':128}
headers = {"Ocp-Apim-Subscription-Key":api_key}
search_url = "https://api.bing.microsoft.com/v7.0/images/search"
response = requests.get(search_url, headers=headers, params=params)
response.raise_for_status()
search_results = response.json()
results = L(search_results['value'])
download_images(dest, urls=results.attrgot('contentUrl'))

Nach der Ausführung dieses Code Blocks sollten zu jedem der Tiere 150 Bilder heruntergeladen worden und in dem Ordner “Tiere” abgelegt worden sein.

Schritt 2: Daten verifizieren

Im nächsten Schritt wollen wir die Daten, die wir heruntergeladen haben, rudimentär auf ihre Korrektheit prüfen. Dies ist vor allem bei dem automatisierten Sammeln von Daten wichtig, da es hierbei schnell zu Fehlern beim Download oder dergleichen kommen kann.

Dafür führen wir folgenden Code aus, welcher alle Bilder in dem Ordner “Tiere” und dessen Unterordner untersucht und überprüft, ob diese geöffnet werden können.

failed_images = verify_images(vision.data.get_image_files(path))

Über den folgenden Befehl können wir nun die nicht einzulesenden Bilder entfernen und damit vom weiteren Training ausschließen.

failed.map(Path.unlink)

Schritt 3: Daten Vorbearbeiten

Im nächsten Schritt müssen die Bilder in Trainings und Test Gruppen eingeteilt werden. Dazu werden sie auf eine für das Training optimale Größe skaliert.
Dies geschieht mit Hilfe eines Data Loaders aus der fast.ai Bibliothek.

tiere = DataBlock(
blocks=(ImageBlock, CategoryBlock),
get_items=get_image_files,
splitter=RandomSplitter(valid_pct=0.2, seed=159),
get_y=parent_label,
item_tfms=Resize(128))

Mit Hilfe des Dataloaders lassen sich über die Pfadangaben einige zufällige Bilder anzeigen.

dls = tiere.dataloaders(path)
dls.valid.show_batch(max_n=4, nrows=1)

Abbildung 2 – Beispiele der geladenen Bilder

Zuletzt werden mittels “Data Augmentation” einige transformierte Varianten der Bilder erzeugt. Somit generieren wir zusätzliches Trainingsmaterial für das neuronale Netz und sorgen dafür, dass das Netz eine möglichst generelle Struktur erlernt, auch wenn die Eingabe nicht dem Ideal entspricht.

Dafür bietet die fast.ai Bibliothek auch sehr einfache Funktionen. Wir benutzen hier die vorgefertigte Funktion RandomResizedCrop. Diese wählt zufällig einen Bildbereich aus, der ausgeschnitten wird und skaliert diesen dann auf die angegebene Größe.

tiere = tiere.new(
item_tfms=RandomResizedCrop(224, min_scale=0.6),
batch_tfms=aug_transforms())
dls = tiere.dataloaders(path)

Schritt 4: Modell Trainieren

Im letzten Schritt gilt es das Modell zu trainieren und anschließend die Performance anhand der Test Daten zu verifizieren.

Hierfür wird auch ein fertiger Lerner auf Basis von CNNs (Convolutional Neural Networks) zur Verfügung gestellt, welcher auch bereits vortrainierte Classifier Modelle, wie etwa resnet18 als Ausgangsbasis nutzen kann. Dieses Modell wird auch gleich automatisch heruntergeladen, wenn es nicht schon geladen wurde.
Mit folgenden Befehlen wird das Basismodell gewählt und dieses dann in 5 Iterationen auf unsere Tierbilder angepasst.

lerner = cnn_learner(dls, resnet18, metrics=error_rate)
lerner.fine_tune(5)

Nach kurzer Zeit ist das Training beendet und wir können uns eine Konfusionsmatrix mit der Treffergenauigkeit des trainierten Modells anschauen.

interpretation = ClassificationInterpretation.from_learner(lerner)
interpretation.plot_confusion_matrix()

Abbildung 3 – Konfusionsmatrix zur Treffersicherheit nach dem Training des Modells

An der Matrix lässt sich erkennen, dass lediglich ein einziges Bild nicht korrekt klassifiziert worden ist. Unsere Testklassen sind sicherlich auch einfacher als andere auseinander zu halten, dennoch lässt sich erkennen mit wie wenigen Zeilen Code, sich ein funktionsfähiger und treffsicherer Image Classfier erstellen lässt.

Fazit

Zusammenfassend lässt sich sagen, dass die exzellent dokumentierte fast.ai Bibliothek sich zum einen hervorragend für den Einstieg in das Thema Deep Learning eignet und zum anderen auch versierte Deep Learning Spezialisten bei ihrer Arbeit unterstützt. Sie eignet sich sehr gut für ein schnelles Prototyping und kann selbst in produktiven Umgebungen verwendet werden.