Zephyrnet-logo

Een voedselbeeldclassificatie bouwen met Fastai

Datum:

Dit artikel is gepubliceerd als onderdeel van het Data Science-blogathon.

Achtergrond

Social Media-platforms zijn een veelgebruikte manier om interessante en informatieve afbeeldingen te delen. Voedselbeelden, vooral gerelateerd aan verschillende keukens en culturen, zijn een onderwerp dat vaak trending lijkt te zijn. Social-mediaplatforms zoals Instagram hebben een groot aantal afbeeldingen die tot verschillende categorieën behoren. We hebben misschien allemaal de zoekopties op google afbeeldingen of Instagram gebruikt om door lekker uitziende taartafbeeldingen te bladeren voor ideeën. Maar om deze afbeeldingen beschikbaar te maken via de zoekfunctie, moeten we voor elke afbeelding een aantal relevante tags hebben.

Dit maakt het mogelijk om het trefwoord te zoeken en te matchen met de tags. Omdat het een enorme uitdaging is om elke afbeelding handmatig te labelen, gebruiken bedrijven ML- en DL-technieken om correcte labels voor afbeeldingen te genereren. Dit kan worden bereikt met behulp van een afbeeldingsclassificatie die de afbeelding identificeert en labelt op basis van enkele gelabelde gegevens.

Laten we in dit artikel een afbeeldingsclassificatie bouwen met fastai en een paar voedselafbeeldingen identificeren met behulp van een bibliotheek met de naam 'vasten'.

Inleiding tot Fastai

Fastai is een open-source Deep Learning-bibliotheek die beoefenaars hoogwaardige componenten biedt die snel en moeiteloos state-of-the-art resultaten kunnen produceren in conventionele deep learning-domeinen. Het geeft onderzoekers componenten op een laag niveau om te mixen en combineren om nieuwe technieken te creëren. Het is bedoeld om beide te bereiken zonder afbreuk te doen aan bruikbaarheid, flexibiliteit of prestaties.

Omdat fastai is geschreven in Python en gebaseerd is op PyTorch, is kennis van Python vereist om dit artikel te begrijpen. We zullen deze code uitvoeren in Google Colab. Naast fastai zullen we een grafische verwerkingseenheid (GPU) gebruiken om zo snel mogelijk resultaten te krijgen.

Een afbeeldingsclassificatie bouwen met Fastai

Laten we beginnen met het installeren van de fastai-bibliotheek met de volgende opdracht:

!pip install -Uqq fastai

Voer de volgende opdracht uit als je Anaconda gebruikt:

conda install -c fastchan fastai anaconda

Laten we de pakketten importeren die we nodig hebben voor de classificatietaak. De bibliotheek is onderverdeeld in modules, waarvan de meest voorkomende tabellen, tekst en visie zijn. Omdat onze taak visie omvat, importeren we alle functies die we nodig hebben uit de visiebibliotheek.

van fastai.vision.all import *

Veel academische datasets zijn beschikbaar via de fastai-bibliotheek. Een daarvan is FOOD, dat wordt vermeld onder URL's. VOEDSEL.

De eerste stap is het verkrijgen en extraheren van de gegevens die we nodig hebben. We zullen de functie untar_data gebruiken, die de dataset automatisch zal downloaden en uitpakken.

foodPath = untar_data(URLs.FOOD)

Deze dataset bevat 101,000 afbeeldingen verdeeld over 101 voedselcategorieën, met 250 testafbeeldingen en 750 trainingsafbeeldingen per klas. De beelden van de training zijn niet opgeschoond. Alle afbeeldingen zijn verkleind tot maximaal 512 pixels aan elke kant. U kunt de dataset downloaden van: hier.

Het volgende commando zal ons vertellen met hoeveel afbeeldingen we te maken hebben.

len(get_image_files(voedselpad))

Verder zullen we met behulp van de volgende opdracht de inhoud van de metadirectory van de Food-dataset afdrukken.

print(os.listdir(voedselpad))

De metamap bevat acht bestanden, waarvan vier tekstbestanden: train.txt, test.txt, classes.txt en labels.txt. De train.txt- en test.txt-bestanden bevatten een lijst met afbeeldingen voor respectievelijk de trainings- en testsets. Het bestand classes.txt daarentegen bevat een lijst met alle voedselklassen en labels. txt biedt een lijst met alle etiketten voor voedselafbeeldingen. De directory bevat ook een .h5-bestand met een vooraf getraind model en een afbeeldingenmap met 101,000 afbeeldingen in JPG-formaat. Ten slotte worden de trein- en testsets in JSON-formaat geleverd.

Om alle afbeeldingscategorieën te bekijken, voeren we de volgende opdracht uit:

image_dir_path = foodPath/'images' image_categories = os.listdir(image_dir_path) print(image_categories)

Vervolgens voeren we de volgende opdracht uit om een ​​voorbeeldafbeelding te zien uit de verzameling van 101,000 afbeeldingen.

img = PILImage.create('/root/.fastai/data/food-101/images/frozen_yoghurt/1942235.jpg') img.show();
Afbeeldingsclassificatie met behulp van fastai

We zullen de trein- en testbestanden in JSON-formaat lezen met behulp van de panda-functie. JSON is een gegevensindeling die informatie opslaat in een voor mensen leesbare vorm. De volgende code leest het bestand train.json uit de map en slaat het resultaat op in het dataframe df_train.

De koptekst van het dataframe kan vervolgens worden afgedrukt met de functie head() zoals hieronder weergegeven.

df_train=pd.read_json('/root/.fastai/data/food-101/train.json') df_train.head()

Op dezelfde manier zullen we door de pandas-functie te gebruiken het bestand test.json lezen en opslaan in het df_test dataframe.

df_test=pd.read_json('/root/.fastai/data/food-101/test.json') df_test.head()

We maken drie labels met voedselnamen naar keuze om de voedselafbeeldingen te classificeren.

labelA = 'cheesecake' labelB = 'donuts' labelC= 'panna_cotta'

Nu gaan we een for-lus maken die door alle afbeeldingen loopt die we hebben gedownload. Met behulp van deze lus verwijderen we de afbeeldingen die geen label A, B of C hebben. Ook hernoemen we de afbeeldingen met hun respectievelijke labels met behulp van de volgende functie.

voor img in get_image_files(foodPath): if labelA in str(img): img.rename(f"{img.parent}/{labelA}-{img.name}") elif labelB in str(img): img.rename (f"{img.parent}/{labelB}-{img.name}") elif labelC in str(img): img.rename(f"{img.parent}/{labelC}-{img.name}" ) anders: os.remove(img)

Laten we het aantal afbeeldingen controleren dat we krijgen na het uitvoeren van de lus met behulp van de volgende opdracht:

len(get_image_files(voedselpad))

Laten we een voorbeeldetiket uitproberen tussen de drie gekozen gerechten en kijken of het hernoemen correct is gedaan of niet.

def GetLabel(bestandsnaam): retourneer bestandsnaam.split('-')[0]
GetLabel("cheesecake-1092082.jpg")

Output:

De volgende code genereert een DataLoaders-object, dat een combinatie van trainings- en validatiegegevens vertegenwoordigt.

dls = ImageDataLoaders.from_name_func(foodPath, get_image_files(foodPath), valid_pct=0.2, seed=42, label_func=GetLabel, item_tfms=Resize(224)) dls.train.show_batch()
Afbeeldingsclassificatie met behulp van fastai

In dit geval zullen we-

  • Gebruik de padoptie om de locatie van de gedownloade en geëxtraheerde gegevens op te geven.
  • Gebruik de functie get_image_ files om alle bestandsnamen van de opgegeven locatie te verzamelen.
  • Gebruik een 80–20 verdeling voor de dataset.
  • Extraheer labels uit bestandsnamen met behulp van de GetLabel-functie.
  • Verklein alle afbeeldingen naar dezelfde grootte, namelijk 224 pixels.
  • Gebruik de show_batch-functie om een ​​uitvoervenster te genereren met een raster van trainingsafbeeldingen met toegewezen labels.

Het is tijd om het model op zijn plaats te zetten. Met behulp van de ResNet34-architectuur zullen we een convolutioneel neuraal netwerk bouwen door ons te concentreren op een enkele functieaanroep die bekend staat als vision_learner (). De functie vision_learner (ook bekend als cnn_learner) is nuttig voor het trainen van computervisiemodellen. Het bevat uw originele afbeeldingsgegevensset, het vooraf getrainde model resnet34 en een metrisch foutenpercentage, dat het percentage afbeeldingen bepaalt dat onjuist is geïdentificeerd op validatiegegevens. De 34 in resnet34 verwijst naar het aantal lagen in dit architecturale type (andere opties zijn 18, 50, 101 en 152). Modellen die meer lagen gebruiken, hebben meer tijd nodig om te trainen en zijn vatbaarder voor overfitting.

Fastai biedt een 'fine_tune'-functie voor het afstemmen van het vooraf getrainde model om ons specifieke probleem op te lossen met behulp van de gegevens die we hebben gekozen. Om het model te trainen, stellen we het aantal tijdperken in op 10.

leren = vision_learner(dls, resnet34, metrics=error_rate, pretrained=True) learn.fine_tune(epochs=10)
Afbeeldingsclassificatie met behulp van fastai

Hetzelfde model kan ook op nauwkeurigheid worden gecontroleerd door de metrieken te vervangen door 'nauwkeurigheid'.

Uit de bovenstaande resultaten kunnen we zeggen dat zelfs met slechts 10 tijdperken, het vooraf getrainde ResNet34-model een goede nauwkeurigheid van> 85% laat zien voor een classificatietaak met meerdere labels. Als we het aantal tijdperken verhogen, kan de nauwkeurigheid van het model waarschijnlijk verbeteren.

Laten we nu een paar voorbeeldafbeeldingen testen om te controleren hoe ons model presteert.

Voorbeeldafbeelding #1

Afbeeldingsclassificatie met behulp van fastai

Voorbeeldafbeelding #2

Afbeeldingsclassificatie met behulp van fastai

Voorbeeldafbeelding #3

Uit de bovenstaande resultaten kunnen we zeggen dat ons model de voorbeeldafbeeldingen correct kon identificeren.

Nadat we het model hebben getraind, kunnen we het inzetten als een webtoepassing die anderen kunnen gebruiken. Hoewel fastai in de eerste plaats bedoeld is voor modeltraining, kunt u het PyTorch-model snel exporteren voor gebruik in productie met behulp van de functie 'learn.export'. De code voor deze tutorial is beschikbaar op my GitHub-repository.

Conclusie

In deze zelfstudie hebben we geleerd hoe we een classificatie voor voedselafbeeldingen kunnen bouwen met behulp van fastai op basis van PyTorch. Het is mogelijk om dit model in te zetten met een dienst als Heroku of Netlify om dit model als webapp beschikbaar te maken.

Hier zijn enkele belangrijke afhaalrestaurants uit dit artikel-

  • We kunnen deep learning-modellen opzetten met minimale code met behulp van fastai. Daarom maakt fastai het gemakkelijker om PyTorch te gebruiken voor diepgaande leertaken.
  • Voedselclassificatie is een uitdagende taak voor computervisietoepassingen, aangezien hetzelfde voedsel er van plaats tot plaats aanzienlijk anders kan uitzien, afhankelijk van de manier waarop het wordt gegarneerd en geserveerd. Maar door gebruik te maken van de kracht van transfer learning, kunnen we een vooraf getraind model gebruiken om een ​​voedingsmiddel te identificeren en correct te classificeren.
  • We gebruikten een vooraf getraind model, ResNet34, voor deze classificatie. U kunt echter een ander voorgetraind model zoals VGG, Inception, DenseNet, etc. gebruiken om uw eigen model te bouwen.

Ik hoop dat je mijn artikel over beeldclassificatie met fastai leuk vond. Delen in de reacties hieronder?

De in dit artikel getoonde media zijn geen eigendom van Analytics Vidhya en worden naar goeddunken van de auteur gebruikt.

spot_img

Laatste intelligentie

spot_img

Chat met ons

Hallo daar! Hoe kan ik u helpen?