Intelligence artificielle

Approche ML sur la façon de faire de la «sauce verte» allemande – Pia Scharf

Approche ML sur la façon de faire de la «sauce verte» allemande - Pia Scharf


Ovotre problème est un problème de classification. Nous voulons donc savoir si les herbes que nous trouvons sont pertinentes pour faire la sauce verte. Nous avons l'intention de les classer en persil, ciboulette, cerfeuil, bourrache, oseille, cresson alénois et burnet de salade. Comme entrée pour notre petit assistant algorithmique, nous sélectionnons des images. Une fois dans les champs, nous pouvons prendre une photo de la plante ou des feuilles que nous voulons identifier et la «montrer» à notre programme. En bref, nous voulons construire un modèle (une abstraction mathématique) qui, en classant une image d'entrée, nous indique à quelle classe l'image correspond.

L'environnement dans lequel nous allons travailler est un cahier jupyter. Fastai est une bibliothèque (bibliothèque = collection d'outils / parties de code) située au-dessus de Pytorch - une bibliothèque d'apprentissage automatique très puissante, fonctionnant avec du code Python. Si vous n'avez jamais entendu parler de l'une de ces choses: Python est le langage dans lequel nous écrivons notre code, Pytorch et fastai sont les outils que nous utilisons et le bloc-notes jupyter nous aide à organiser notre code. Pour plus d'informations sur la configuration, visitez le site Web de fastai.

Nous commençons notre cahier jupyter et saisissons:

de l'importation fastai *
de fastai.vision import *

De cette façon, nous avons toutes les fonctions de reconnaissance d'image de la bibliothèque fastai. Ensuite, nous voulons être sûrs que nous pouvons former notre réseau. En fournissant des données au réseau neuronal, nous voulons construire une représentation mathématique (modèle) avec laquelle nous pouvons ensuite catégoriser de nouvelles photos de plantes / feuilles découvertes.

Notre modèle ne sait pas ce qu'est le persil, il n'a jamais vu la sauce verte ou quelque chose de similaire. Pour former un modèle, nous lui montrons une série de photos avec un étiquetage correct. C’est pourquoi nous devons d’abord créer sept dossiers avec sept étiquettes différentes: Persil, ciboulette, cerfeuil, bourrache, oseille, cresson alénois et burnet de salade.

Étape 1: Sortir de l'ensemble de données

Nous ouvrons donc notre navigateur Chrome, allons dans la recherche d'images Google et saisissons: par ex. 'persil'. Nous obtenons ensuite un grand nombre de photos de persil et faisons défiler vers le bas. Ensuite, nous avons appuyé sur Maj + Contrôle + j pour ouvrir la console Javascript de notre navigateur. Nous tapons:

urls = Array.from (document.querySelectorAll ('. rg_di .rg_meta')). map (el => JSON.parse (el.textContent) .ou);
window.open ('data: text / csv; charset = utf-8,' + escape (urls.join (' n')));

Lorsque nous appuyons sur Entrée, nous téléchargeons un fichier avec toutes les URL des images Google persil. Nous l'enregistrons sous «persil.txt» et continuons avec les six autres herbes. Génial! Des liens vers l'ensemble de données sont préparés. Nous mettons tous les fichiers texte dans un dossier appelé «seven_herbs» et nous nous assurons qu'il se trouve dans le dossier de données de notre répertoire personnel (fastai ne le trouvera pas autrement).

Étape 2: téléchargement des fichiers image

Ensuite, nous téléchargeons les données directement sur le serveur sur lequel nous travaillons. Fastai doit connaître le chemin où se trouve notre ensemble de données. Cette étape peut être un peu différente dans certains environnements, par exemple si vous travaillez dans les noyaux de kaggle. Si vous avez du mal, vous pouvez visiter mon noyau de démarrage sur kaggle.

path = Path ('data / seven_herbs')

Ensuite, nous définissons les noms de nos herbes en classes.

classes = ['borage', 'chervil', 'chives', 'garden_cress', 'parsley', 'salad_burnet', 'sorrel']

Cette prochaine étape semble un peu délicate, en fait, c'est très simple. Il prend simplement les fichiers texte et crée deux choses: il crée et nomme un dossier pour chaque classe (aka herb), puis remplit ce dossier avec les images définies dans le fichier texte nommé de la même manière. (Dans le jeu de démarrage kaggle, vous n'avez pas besoin de suivre ces étapes, car j'ai déjà attaché le jeu de données au noyau.)

pour x dans la plage (0,7):
dest = chemin / (classes[x])
dest.mkdir (parents = True, exist_ok = True)
download_images (chemin / (classes[x]+ str ('. txt')), dest, max_pics = 200)

Nous examinons ensuite nos fichiers pour nous assurer qu'ils ne sont pas endommagés ou que les liens ne sont pas bogués. Le code suivant effacera ceux qui ne s'ouvrent pas ou ne se téléchargent pas correctement.

pour c dans les classes:
imprimer (c)
verify_images (path / c, delete = True, max_workers = 8)

Étape 3: création d'un ImageDataBunch

Maintenant ça devient sérieux. Nous commençons à traiter nos données en créant un objet ImageDataBunch. De cette façon, nous pouvons manipuler les données et former notre modèle plus tard. Le np.random.seed (13) définit quelles images sont sélectionnées au hasard parmi nos données d'entraînement. (Nous n'avons besoin de cette ligne de code que si nous voulons réentraîner le modèle de la même manière.) Notre ImageDataBunch est créé en passant le chemin du dossier avec nos données de photo dedans. Nous définissons un ensemble de validation qui représente 20% des données et définissons une taille pour nos images.

np.random.seed (13)
data = (ImageList.from_folder (chemin)
.split_by_rand_pct (0,2)
.label_from_folder ()
.transform (tfms, taille = 128)
.databunch ())

Ensuite, nous devons également affecter nos classes à ImageDataBunch.

data.classes

Si nous tapons le code suivant, ImageDataBunch apparaît et nous pouvons consulter nos données.

data.show_batch (lignes = 3, figsize = (7,8))

Étape 4: formation du modèle

Que la formation commence! Tout d'abord, nous chargeons dans vision.learner, un module qui contient le cnn_learner: imaginez-le comme un réseau neuronal pré-formé, qui est formé sur un grand ensemble de données d'image. Ensuite, nous utilisons «l'apprentissage par transfert» comme technique - nous montrons notre ensemble de données au cnn_learner, afin qu'il apprenne les spécificités des sept herbes.

de fastai.vision.learner import create_cnn, models
de fastai.vision import error_rate

Enfin: Créons notre modèle - notre représentation mathématique des corrélations entre l'étiquetage et les images.

learn = create_cnn (data, models.resnet34, metrics = error_rate)

Nous avons donc téléchargé le modèle pré-formé à partir de la bibliothèque Fastai. Ensuite, nous voulons ajuster le modèle aux données. Pour nous assurer que nous pouvons conserver nos résultats pour plus tard, nous enregistrons le modèle directement après nos quatre cycles d'entraînement.

learn.fit_one_cycle (4)
learn.save ('green-sauce-stage-1')

Après ce processus, nous nous retrouvons avec un résultat, qui montre un taux d'erreur de 0,33, ce qui signifie que dans 33% des cas, le modèle va toujours gâcher. Nous voulons voir de plus près ce que cela signifie:

learn.unfreeze ()
learn.lr_find ()
learn.recorder.plot ()

Ce graphique nous montre le taux d'apprentissage et la perte de notre modèle formé. Pour plus d'explications, veuillez jeter un œil par ex. ici. En bref, la fonction de perte nous montre comment nous nous débrouillons avec notre modèle. Pour chaque prédiction, le graphique nous montre la différence absolue entre la prédiction que notre modèle fait et l'étiquette réelle que contient la photo. (N'oubliez pas: toutes nos données d'entraînement sont étiquetées). En règle générale, nous voulons toujours rechercher un chemin de descente dans l'intrigue. Si nous regardons la partie de 1e-5 à 1e-3, il semble que le modèle s'améliore encore. Peu de temps après 1e-3, le gradient augmente à nouveau très rapidement, ce qui signifie que le taux d'erreur augmente également à nouveau. Nous pouvons améliorer notre modèle en le formant davantage.

learn.fit_one_cycle (2, max_lr = tranche (1e-5,1e-3))
learn.save ('green-sauce-stage-2')

Étape 4: Interpréter les résultats

Après toute cette formation, nous voulons savoir dans quelle mesure nous nous débrouillons. Nous interprétons nos résultats.

interp = ClassificationInterpretation.from_learner (apprendre)
interp.plot_confusion_matrix ()

La matrice de confusion nous montre la relation entre les prédictions faites sur la base du modèle et les étiquettes réelles des images. Comme nous pouvons le voir, dans la plupart des cas, le modèle prend les bonnes décisions: en particulier, les images de ciboulette ont été correctement reconnues dans 33 cas. Les perdants sont le cerfeuil et l'oseille: le cerfeuil, une herbe qui est moins facile à identifier pour l'œil humain que la ciboulette longue et lisse, est moins surprenant, tandis que l'oseille, du moins à ma grande surprise, s'est trompée réseau neuronal pour le cresson alénois à plusieurs reprises. Les listes les plus confuses le soulignent également:

interp.most_confused ()

Nous pouvons voir de cela que les choses ont mal tourné pendant l'entraînement. Dans l'ensemble, notre modèle ne se détache pas si mal, bien que nous puissions bien sûr encore faire beaucoup pour améliorer nos résultats, par exemple:

  • Améliorer notre ensemble de données en supprimant les images qui sont apparues dans la recherche d'images, mais qui ne correspondent pas exactement au résultat souhaité (par exemple le widget FileDeleter de la bibliothèque fastai.).
  • Améliorez encore notre modèle en formant plus / avec plus de données / avec d'autres données
  • Concevez un meilleur ensemble de validation. En savoir plus ici

Pour l'instant, nous allons en rester là et annoncer: Nous sommes prêts! Nous avons construit notre réseau neuronal. Vous pourriez penser: "D'accord, super, mais comment photographier une herbe et la montrer à mon réseau formé?"

Test: je veux montrer cette image à mon réseau - Image de Pia Scharf

Étape 5: création d'un site Web

N'oubliez pas que l'objectif est d'avoir un site Web sur lequel nous pouvons télécharger une photo. Désormais, il est nécessaire de concevoir une interface. (Nous n'avons pas passé de temps sur la conception elle-même dans ce didacticiel, mais peut-être dans les prochains.) Par souci de simplicité, nous voulons créer une interface utilisateur graphique qui ne peut recevoir qu'une seule image. Nous voulons que notre service soit accessible à tout moment via Internet, nous créons donc une page d'accueil simple avec une seule option d'interaction, à savoir l'analyse d'une photo. Pour rendre notre petite application disponible, nous utilisons le rendu. Il s'agit d'un fournisseur de cloud que vous pouvez utiliser pour fournir des applications et des sites Web.

Tout d'abord, nous devons exporter notre modèle. Voilà à quoi cela ressemble sur les noyaux kaggle:

learn.load ('green-sauce-stage-2')
learn.export (file = Path ("/ kaggle / working / export.pkl"))

Cela ajoute le fichier «export.pkl» dans notre structure de données. Nous téléchargeons le fichier sur notre disque dur. Ensuite, nous le poussons sur un lecteur Google et nous nous assurons qu'il est libre de lire pour tout le monde (sinon la commande suivante ne fonctionnera pas). Nous utilisons ce générateur de lien direct, donc le téléchargement de notre fichier commence automatiquement par un clic sur le lien.

Pour utiliser Render, nous devons télécharger le projet que nous voulons «rendre» sur github. Au cas où vous ne connaissez pas github: c'est essentiellement un endroit où les gens partagent du code. La grande chose à propos de github est que vous trouverez beaucoup de beaux projets que vous pouvez utiliser comme point de départ pour vos propres projets.
Dans ce cas, nous utilisons le référentiel d'anurag comme base et nous nous en approprions. Si vous cliquez sur «fork» dans le référentiel anurags, vous trouverez son référentiel dans votre compte github. Vous pouvez ensuite le modifier (renommer, taper votre code) et «valider» les modifications (ne vous inquiétez pas, cela ne fera que changer votre «branche» - en d'autres termes: votre version du référentiel). Si vous voulez savoir comment fonctionne github en détail, je vous recommande fortement de lire le guide github.

Donc, après avoir forgé le référentiel anurags, vous pouvez le renommer en «sauce verte» et nous devons faire deux choses importantes pour faire fonctionner ce code:

  • Nous devons modifier le fichier «server.py» (green-sauce / app / server.py) afin que notre application trouve le lien de téléchargement direct vers notre modèle. Nous modifions également la section des classes et saisissons les noms (aussi appelés classes) de nos sept herbes. Nous avons ensuite cliqué sur «valider les modifications».
export_file_url = 'https: // VOTRE-LIEN DE TÉLÉCHARGEMENT DIRECT'export_file_name = 'export.pkl' classes = ['borage', 'chervil', 'chives', 'garden_cress', 'parsley', 'salat_burnet', 'sorrel']
  • Nous modifions le fichier index.html (green-sauce / app / view / index.html). Nous pouvons changer le titre de notre page Web en changeant le texte entre les parenthèses div (par ex.
    ce texte

    ) et nous pouvons écrire un petit texte de description entre les

    -supports. Nous «engageons» également les changements

Si nous voulons changer les couleurs, les polices ou d'autres éléments visuels, nous pouvons modifier le fichier css. Dès que nous avons terminé, nous passons au rendu.

Sur le tableau de bord de rendu, nous cliquons sur l'icône «nouveau service Web». Là, nous tapons dans nos référentiels github-address. Vous pouvez trouver mon référentiel github pour cet article moyen sur https://github.com/piaoyapia/Seven-Herbs. Si vous souhaitez rendre votre propre application, laissez la liste déroulante de l'environnement sur «Docker». C'est ça. Render s'occupe du reste!

Étape 6: Test du site Web

Enfin, nous avons terminé et nous pouvons tester notre site Web! Si vous avez suivi, vous avez probablement maintenant votre propre version. Sinon, testez le mien.

J'ai donc téléchargé une photo de moi tenant un persil. J'ai ensuite cliqué sur «analyser». Le résultat n'est pas si spectaculaire optiquement, mais au moins il est correct: le réseau reconnaît les herbes comme du persil. Ouais! 🎉

vous pouvez visiter ma version de l'application sur https://seven-herbs-green-sauce.onrender.com
Afficher plus

SupportIvy

SupportIvy.com : Un lieu pour partager le savoir et mieux comprendre le monde. Meilleure plate-forme de support gratuit pour vous, Documentation &Tutoriels par les experts.

Articles similaires

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Bouton retour en haut de la page
Fermer