Raspberry Pi Neural Network Bee Counting

Publiée le 17 mai 2018

Immédiatement après l'installation de la ruche, j'ai pensé: "Je me demande comment calculer le nombre d'abeilles arrivant et partant?"

Une petite étude a montré: jusqu'à présent, personne ne semble avoir mis au point un bon système non invasif pour résoudre ce problème. Mais il serait probablement utile d'avoir de telles informations pour vérifier la santé de la ruche.

Tout d'abord, vous devez collecter des échantillons de données. Raspberry Pi, caméra Pi standard et panneau solaire: cet équipement simple suffit pour enregistrer une image toutes les 10 secondes et enregistrer plus de 5000 images par jour (de 6 h à 21 h).



Voici un exemple d'image ... Combien d'abeilles pouvez-vous compter?



Quelle est exactement la question?


Deuxièmement, il est nécessaire de formuler un problème, ce qu'est exactement un réseau de neurones. Si la tâche consiste à «compter les abeilles dans l'image», vous pouvez essayer d'obtenir des chiffres spécifiques, mais cela ne semble pas être l'option la plus simple, et le suivi des abeilles individuelles entre les images ne donne aucun plaisir. Au lieu de cela, j'ai décidé de me concentrer sur la localisation de chaque abeille dans l'image.

Une vérification rapide d'un détecteur standard image par image n'a produit aucun résultat particulier. Ce n'est pas surprenant, surtout compte tenu de la densité des abeilles autour de l'entrée de la ruche (indice: le transfert de formation ne fonctionne pas toujours), mais c'est normal. J'ai donc une très petite image, une seule classe pour reconnaître les objets et il n'y a pas de problèmes particuliers avec le cadre de délimitation en tant que tel. Décidez simplement s'il y a une abeille ou non. Quelle solution sera plus simple?

v1: réseau entièrement convolutionnel "abeille mange / pas" sur un fragment


La première expérience rapide a été le détecteur "abeille dans l'image est / n'est pas". Autrement dit, quelle est la probabilité qu'il y ait au moins une abeille sur ce fragment de l'image. Pour ce faire, sous la forme d'un réseau complètement convolutionnel sur de très petits fragments de l'image, vous pouvez facilement traiter les données en pleine résolution. L'approche a semblé fonctionner, mais a échoué pour la zone d'entrée de la ruche avec une très forte densité d'abeilles.

v2: image RVB → bitmap noir et blanc


J'ai vite réalisé que le problème peut être réduit au problème de la transformation d'image. À l'entrée, le signal de la caméra est RVB, et à la sortie est une image d'un seul canal où le pixel «blanc» indique le centre de l'abeille.


Entrée RVB (fragment) et sortie monocanal (fragment)

Marquage


La troisième étape est l'étiquetage, c'est-à-dire l'attribution des désignations. Il n'est pas trop difficile de déployer une petite application TkInter pour sélectionner / désélectionner des abeilles dans l'image et enregistrer les résultats dans la base de données SQLite. J'ai passé pas mal de temps à configurer correctement cet outil: toute personne ayant effectué manuellement une quantité importante de marquage me comprendra: /

Plus tard, nous verrons, heureusement, qu'avec un grand nombre d'échantillons, vous pouvez obtenir un assez bon résultat par des méthodes semi-automatiques.

Modèle


L'architecture réseau est un u-net assez standard.

  • réseau entièrement convolutionnel formé sur des fragments à demi-résolution, mais fonctionne sur des images à pleine résolution;
  • le codage est une séquence de quatre convolutions 3 × 3 par incréments de 2
  • décodage - une séquence de changements de taille dans les voisins les plus proches + pliage 3 × 3 par incréments de 1 + saut de la connexion des encodeurs;
  • la couche de convolution finale 1 × 1 à l'étape 1 avec l'activation de la fonction sigmoïde (c'est-à-dire le choix binaire "abeille est / n'est pas" pour chaque pixel).

Après quelques expériences empiriques, j'ai décidé de revenir au décodage avec une demi-résolution. C'était assez.

J'ai fait le décodage en redimensionnant aux voisins les plus proches au lieu de déconvoluer davantage par habitude.

Le réseau a été formé par la méthode Adam et était trop petit pour appliquer la normalisation par lots . La conception s'est avérée étonnamment simple, un petit nombre de filtres suffisait.



J'ai appliqué la méthode standard d'augmentation des données, la rotation aléatoire et la distorsion des couleurs. La formation sur les fragments signifie que nous obtenons essentiellement une variante de découpage aléatoire de l'image. Je n'ai pas fait pivoter l'image car l'appareil photo se tient toujours d'un côté de la ruche.

Il existe certaines nuances dans les prédictions de sortie de post-traitement. Avec des résultats probabilistes, nous obtenons un nuage flou où il peut y avoir des abeilles. Pour le convertir en une image claire d'un pixel par abeille, j'ai ajouté une valeur de seuil, en tenant compte des composants associés et en détectant les centroïdes à l' aide du module de mesure skimage . Tout cela devait être installé manuellement et configuré uniquement à l'œil nu, bien qu'en théorie cela puisse être ajouté à la fin de la pile comme élément d'apprentissage. Peut-être que cela a du sens de le faire à l'avenir ... :)


Centroïdes d'entrée, de sortie brute et de cluster

Quelques jours de généralisation


En une journée


Initialement, des expériences ont été menées avec des images sur une courte période d'une journée. Il s'est avéré facile d'obtenir un bon modèle à partir de ces données avec un petit nombre d'images marquées (environ 30).


Trois échantillons reçus le premier jour

Pendant plusieurs jours


Les choses se sont compliquées lorsque j'ai commencé à envisager des périodes plus longues de plusieurs jours. L'une des principales différences est la différence d'éclairage (heure de la journée et conditions météorologiques différentes). Une autre raison est que j'ai installé la caméra manuellement tous les jours, en la collant simplement avec du velcro. La troisième différence, la plus inattendue, est qu'avec la croissance de l'herbe, les bourgeons de pissenlit ressemblent à des abeilles (c'est-à-dire qu'au premier tour, le modèle entraîné n'a pas vu les bourgeons, puis ils sont apparus et ont fourni un flux continu de faux positifs).

La plupart des problèmes ont été résolus par l'augmentation des données et aucun problème n'est devenu critique. En général, les données ne varient pas trop. C'est génial, car cela vous permet de vous limiter à un réseau neuronal simple et à un programme d'entraînement.


Échantillons obtenus en trois jours

Exemple de prévision


L'image montre un exemple de prévision. Il est intéressant de noter qu'il y a beaucoup plus d'abeilles que sur n'importe quelle image que j'ai étiquetée manuellement. C'est une grande confirmation qu'une approche entièrement convolutionnelle avec l'apprentissage sur de petits fragments fonctionne vraiment.



Le réseau fonctionne très bien dans un large éventail d'options. Je suppose qu'un arrière-plan uniforme aide ici, et démarrer le réseau sur une ruche arbitraire ne donnera pas un si bon résultat.


De gauche à droite: haute densité autour de l'entrée; abeilles de différentes tailles; les abeilles à grande vitesse!

Astuces d'étiquetage


Formation semi-contrôlée


La possibilité d'obtenir un grand nombre d'images suggère immédiatement l'idée d'utiliser une formation semi-contrôlée.

Une approche très simple:

  1. Prise de 10 000 images.
  2. Étiquetage de 100 images et model_1 formation_1.
  3. Utilisation de model_1 pour marquer les 9900 images restantes.
  4. Formation model_2 sur les 10 000 images "labellisées".

Par conséquent, model_2 affiche un meilleur résultat que model_1 .

Voici un exemple. Notez que le model_1 montre des model_1 faux positifs (milieu gauche et brin d'herbe) et faux négatifs (abeilles autour de l'entrée de la ruche).


Modèle gauche_1, modèle droit_2

Marquage en réparant un mauvais modèle


Ces données sont également un excellent exemple de la façon dont la réparation d'un mauvais modèle est plus rapide que le marquage à partir de zéro ...

  1. Nous marquons 10 images et formons le modèle.
  2. Nous utilisons le modèle pour baliser les 100 images suivantes.
  3. Nous utilisons l'outil de marquage pour corriger les marques sur ces 100 images.
  4. Rééduquez le modèle en 110 images.
  5. Nous répétons ...

Il s'agit d'un modèle d'apprentissage très courant, et parfois il vous oblige à réviser un peu votre outil d'étiquetage.

Compter


La possibilité de détecter les abeilles signifie que nous pouvons les compter! Et pour le plaisir, dessinez des graphiques amusants qui montrent le nombre d'abeilles pendant la journée. J'adore la façon dont ils travaillent toute la journée et rentrent chez eux vers 16 heures. :)



Sortie Raspberry Pi


Le lancement du modèle sur le Pi était une partie importante de ce projet.

Directement sur le fer Pi


Il était initialement prévu de figer le graphique TensorFlow et de simplement l'exécuter directement sur le Pi. Cela fonctionne sans problème, mais seul Pi ne prend qu'une seule image par seconde. : /

Fonctionnement sur le module informatique Movidius


J'étais très intéressé par l'opportunité de lancer un modèle sur un Pi en utilisant le Movidus Neural Compute Stick . Ceci est un gadget étonnant.

Malheureusement, il ne s'est rien passé: /. L'API pour convertir un graphique TensorFlow dans leur format de modèle interne ne prend pas en charge ma méthode de décodage. Par conséquent, il était nécessaire d'augmenter la taille (migration), en utilisant la déconvolution au lieu de redimensionner sur les voisins les plus proches. Il n'y a aucun problème à part le fait qu'il ne s'est rien passé. Il y a beaucoup de petites difficultés, à cause desquelles les bogues se sont multipliés . Lorsqu'ils sont corrigés, vous pouvez revenir sur ce sujet ...

Modèle v3: image RVB → comptage d'abeilles
Cela m'a conduit à la troisième version du modèle: peut-on passer directement de l'entrée RGB au comptage des abeilles? De cette façon, nous éviterons tout problème avec les opérations non prises en charge sur le Movidus Neural Compute Stick, bien qu'il soit peu probable que le résultat soit aussi bon que dans le modèle centroïde v2.

Au début, j'avais peur d'essayer cette méthode: je pensais qu'elle nécessiterait beaucoup plus d'étiquetage (ce n'est plus un système basé sur des fragments). Mais! En ayant un modèle qui se débrouille assez bien avec la recherche d'abeilles et beaucoup de données non marquées, vous pouvez générer un bon ensemble de données synthétiques en appliquant le modèle v2 et en comptant simplement le nombre de détections.

Un tel modèle est assez facile à apprendre et donne des résultats significatifs ... (bien qu'il ne soit toujours pas aussi bon qu'un simple calcul des centroïdes détectés par le modèle v2).

Nombre réel et prévu d'abeilles dans certains échantillons d'essai
Le vrai40191615131211108764
v2 (centroïde) prédictif3919161313141188764
prévisions v3 (calcul simple)33,115,312,312,513,310,49.38.76.37.15,94.2

... malheureusement, le modèle ne fonctionne toujours pas sur le Neural Compute Stick (c'est-à-dire qu'il fonctionne, mais ne donne que des résultats aléatoires). J'ai fait quelques rapports de bugs supplémentaires et j'ai de nouveau mis le gadget pour revenir plus tard ... un jour ...

Et ensuite?


Comme toujours, un tas de petites choses sont restées ...

  • Lancement sur Neural Compute Stick (NCS); Maintenant, nous attendons un travail de leur part ...
  • Portez tout sur la caméra JeVois intégrée . Je l'ai un peu tripotée, mais d'abord je voulais lancer un modèle sur NCS. Je veux suivre les abeilles à 120 FPS !!!
  • Suivez les abeilles entre plusieurs images / caméras pour visualiser le flux optique.
  • Explorez plus en détail les avantages d'une approche semi-contrôlée et formez un modèle plus grand pour étiqueter les données d'un modèle plus petit.
  • Explorez les fonctionnalités NCS; que faire avec le réglage des hyperparamètres?
  • Continuez à développer une petite version de FarmBot pour effectuer des expériences génétiques avec des semis CNC (c'est-à-dire quelque chose de complètement différent).

Code


Tout le code est publié sur Github .

Source: https://habr.com/ru/post/fr413799/


All Articles