MultiLabel-Klassifizierung für Single-Label-Klassifizierungsproblem mit fastai | von Adityarawat | Juni 2023

0
24


Bei der Entwicklung eines Modells für eine Bärentyp-Erkennungsaufgabe unter Verwendung einer Einzeletikettenklassifizierung. Ich bin auf ein Downside gestoßen. Das Modell erzeugt eine Ausgabe, die das Bild als Bärenart kategorisiert, selbst wenn ich ein Bild ohne Bären eingefügt habe.

Bild von mir aufgenommen

Dies liegt daran, dass das Modell bisher nur Bilder gesehen hat, die mit Bären zu tun haben. Auf jedem Bild ist ein Bär zu sehen. Wir müssen noch weiter daran arbeiten, einen neuen Typ zu erstellen, der keinem der oben genannten entsprechen kann, um ein Modell zu erstellen, das auch Bilder klassifizieren kann, die keine Bären enthalten, und ein akzeptables Ergebnis liefert.

Auf der Suche nach einer einfacheren Lösung verwies ich auf die Fastbook Kapitel 6. Es wird empfohlen, die Multi-Label-Klassifizierung für Probleme mit der Single-Label-Klassifizierung zu verwenden. Dies wird bei der Entwicklung eines Modells hilfreich sein, das ein Bild klassifiziert, das keine Bären enthält.

Vereinfacht ausgedrückt kann ein einzelnes Bild in einer Kategorisierung mit mehreren Labels unter mehreren Überschriften kategorisiert werden.

Der Vorschlag stand im Buch, wurde aber nicht umgesetzt. So setze ich die Lösung in die Praxis um. Der Quellcode des Projekts ist verfügbar unter GitHubund eine Gradio-basierte App wurde verfügbar gemacht Huggingface Spaces. Bitte schauen Sie sich die App und den Code an, da ich offen für Ideen bin.

Der folgende Codeausschnitt enthält alle für das Projekt erforderlichen Importe:

from fastdownload import download_url
from duckduckgo_search import ddg_images
from fastcore.all import *
from fastai.imaginative and prescient.all import *
import timm
from time import sleep

Der nächste Schritt besteht darin, die Daten abzurufen, was mit duckduckgo_search erfolgen wird:

def search_images(time period, max_images=40):
print(f"Trying to find '{time period}'")
return L(ddg_images(time period,max_results=max_images)).itemgot('picture')

searches = ['grizzly',"black",'teddy','panda','polar']
path = Path("Bears")
from time import sleep

for o in searches:
dest = (path/o)
dest.mkdir(exist_ok=True,mother and father = True)
download_images(dest, urls=search_images(f'{o} bear'))
sleep(10)
download_images(dest, urls=search_images(f'{o} bear picture'))
sleep(10)
download_images(dest, urls=search_images(f'{o} bear forest'))
sleep(10)
resize_image(path/o, max_size=400, dest=path/o)

Es ist möglich, dass einige der von uns heruntergeladenen Fotos fehlerhaft waren. Wir werden daher den Code verwenden, um die nicht erfolgreichen Fotos zu entfernen und so das Downside zu verringern. Es gibt zwei Funktionen in Fastai, die uns dabei unterstützen können. Dies sind die Possibility „Verknüpfung aufheben“, mit der die fehlerhaften Bilder entfernt werden, und „Verify_images“, mit der anhand der heruntergeladenen Bilder überprüft wird, ob sie korrekt sind oder nicht.

fns = get_image_files(path)
failed = verify_images(fns)
failed.map(Path.unlink)

Der wichtigste Schritt beim Coaching eines Modells mit Fastai ist die Erstellung eines Datenblock Dadurch wird die Größe von Bildern geändert und eine Datenerweiterung durchgeführt. Hier definieren wir den Block von MultiCategoryBlock und den ImageBlock, der Fastai mitteilt, dass die Eingabe ein Bild sein wird und die Beschriftungen in Multi-Labelled vorliegen.

bears = DataBlock(
blocks = (ImageBlock,MultiCategoryBlock),
get_items=get_image_files,
get_y = parent_label,
splitter = RandomSplitter(valid_pct=0.3,seed=20),
item_tfms = RandomResizedCrop(460, min_scale = 0.5),
batch_tfms=aug_transforms(measurement=224)
)

Als Nächstes erstellen wir einen DataLoader, der die verarbeiteten Daten lädt und Stapel für Trainingsmodelle erstellt.

dls = bears.dataloaders(path,bs= 10)
dls.prepare.show_batch(max_n=6,distinctive=True)
Von Fastai-Datenladern erstellte Stapel

Wie wir sehen können, lautet die Bezeichnung des Eisbären „a;l;o;p;r“, was eine Teilmenge von polar ist, da wir die Ausgabe als „Multi-Label“ spezifiziert haben.

Jetzt werden wir das Modell definieren und trainieren. Aufgrund des schnellen Trainings wurde das Modell zunächst auf resnet18 trainiert. Dann wurde aber für eine bessere Genauigkeit auf convnext_small umgestellt. Wir haben die Methode lr_find verwendet, um die beste Lernrate für das Coaching des Modells zu erhalten. Wir haben eine benutzerdefinierte Funktion „precision_multi“ erstellt, um die Genauigkeit in einer Umgebung mit mehreren Etiketten zu ermitteln.

def accuracy_multi(inp, targ, thresh=0.5, sigmoid=True):
"Compute accuracy when `inp` and `targ` are the identical measurement."
if sigmoid: inp = inp.sigmoid()
return ((inp>thresh)==targ.bool()).float().imply()

study = vision_learner(dls, 'convnext_small', metrics = partial(accuracy_multi,thresh=0.6))
study.lr_find(suggest_funcs=(minimal, steep))

Diagramm der Lernrate

Wir werden die Daten mit der Funktion „fine_tune()“ von Fastai trainieren. Diese Funktion hat 4 Epochen, in denen nur die oberste Schicht trainiert wurde und in den nächsten 5 Epochen wurden die Gewichte aller Schichten angepasst.

study.fine_tune(5, base_lr=3e-3, freeze_epochs=4)

Der Trainingsverlust und der Gültigkeitsverlust sind sehr gering. Dies wurde erreicht, nachdem mehrere Modelle verwendet und die Lernraten einige Male angepasst wurden.

Wir erhalten eine Ausgabe, die für andere unverständlich ist. Ich habe eine benutzerdefinierte Funktion erstellt, um eine Ausgabe zu liefern, die für andere verständlich ist.

def show_predict(img):
l = study.predict(img)
if l[0] == ['a','d','n','p']:
res = 'Panda bear'
elif l[0] == ['g','i','l','r','y','z']:
res = 'Grizzly Bear'
elif l[0] == ['d','e','t','y']:
res = 'Teddy Bear'
elif l[0] == ['a','l','o','p','r']:
res = 'Polar Bear'
elif l[0] == ['a','b','c','k','l']:
res = 'Black Bear'
else:
res = "Others"
return res



Source link

HINTERLASSEN SIE EINE ANTWORT

Please enter your comment!
Please enter your name here