Scelle contre le réseau neuronal. Ou sélectionnez et exécutez un réseau de neurones pour reconnaître les objets sur le Raspberry Zero

Bonne journée à tous.

La minuscule framboise est une excellente chose. J'ai utilisé Raspberry Zero W dans quelques projets au cours des six derniers mois. Soudoyé par la simplicité du prototypage et du déploiement de diverses idées. Et maintenant, voici une question facultative: cet appareil tirera-t-il une grille convolutionnelle à part entière? [Spoiler - tirez, mais il y a des nuances drôles]. Qui se soucie du sujet - bienvenue au chat. Attention, il y aura beaucoup de chats!

image


Pourquoi le réseau neuronal Raspberry?


D'une certaine manière, j'ai récupéré un simple piège vidéo sur Raspbery Zero W pour observer la vie nocturne des animaux (principalement des chats) dans le pays. Le code était simple et fonctionnait assez bien. Pour la détection vidéo-photo, une caméra avec éclairage infrarouge a été utilisée comme celle-ci «Raspberry Pi Night Version Camera» .

image

L'essence du code est de prendre deux images consécutives, de comparer pixel par pixel, et si le nombre de pixels modifiés est supérieur à une certaine valeur de seuil, commencer à enregistrer une vidéo de 10 secondes. Je ne fournirai pas le texte du code dans cet article, si quelqu'un est intéressé, écrivez dans les commentaires, je peux le mettre dans ce qui suit. La principale caractéristique est d'obtenir la comparaison des deux images en 0,2 seconde, au moins pour capturer les événements rapides. Eh bien, comparez rapidement ces cadres, bien sûr.

L'idée est alors venue de fixer un simple réseau neuronal à l'algorithme afin qu'il soit possible de déterminer un objet dans une image capturée et de démarrer un enregistrement vidéo uniquement si la classe d'objets était déterminée de manière fiable. Cela élimine potentiellement les faux positifs du piège vidéo. Ceux-ci se produisent à partir d'objets en mouvement (par exemple, de l'herbe ou des branches) ou à partir d'un éclairage net de la scène de la caméra (la lumière dans la fenêtre s'est allumée ou la lampe s'est éteinte, par exemple).

Quelle grille mettre sur la framboise?


Heureusement, sous le Python préinstallé (dans mon cas c'est 3.5.3) et l'OpenCV largement disponible (j'utilise 3.4.3), vous pouvez mettre presque n'importe quelle grille. Malheureusement, en raison des capacités informatiques limitées de l'appareil, la liste des options est petite. En fait, vous ne pouvez choisir que parmi les options "légères":

1. SqueezeNet (exemple de code ici ).
2. YOLO Tiny ( ici ).
3. MobileNet-SSD ( ici ).
4. MobileNet_v1_224 (il y a une fantastique vidéo du fonctionnement du détecteur d'objets sur cette grille ).

Dans tous ces cas, il offre la possibilité d'utiliser un modèle pré-formé sur des ensembles de données solides, se libérant ainsi de tous les tourments et soucis d'un ensemble de données indépendant et de la formation ultérieure d'un réseau de neurones sur eux.

Le demandeur n ° 1 s'est inspiré de la grande précision de reconnaissance revendiquée avec des tailles de facteurs de pondération modestes. En outre, une courte recherche sur Internet a conduit à l'excellent blog Adrian Rosebrock , qui a commenté le code en détail et décrit plusieurs options pour implémenter un apprentissage approfondi sur Raspberry.

Le code d'ici a été utilisé pour tester les capacités de SqueezeNet. L'auteur envoie le poids et la représentation textuelle du modèle à l'email après avoir rempli le formulaire sur le site. Soit dit en passant, si vous n'avez pas installé OpenCV, vous pouvez trouver l'algorithme d'actions sur son blog. De plus, il existe des exemples d'overclocking du code pour accélérer le temps de travail des modèles et bien plus encore. Respect à Adrian, une ressource vraiment cool.

Eh bien, exécutons le code et obtenons un résultat étonnant dans la première image!

image

Le chat dans l'image est défini comme persan avec une probabilité de 99%. En fait, il n'est pas persan, mais British Longhair ou Highlander. Mais pour un modèle avec une gamme de 1000 classes, vous pouvez dire, a frappé l'oeil de boeuf. Pour plus de commodité, j'ai placé les principaux résultats du réseau neuronal directement sur la photo. Ce sont les 5 classes les plus probables, la première est la plus probable, la seconde est la suivante la plus importante, etc.

Soit dit en passant, le modèle compte les classes d'objets sur mon Zero pendant 6,5 secondes. Si vous croyez aux données d'Adrian, le calcul sur le Raspberry Pi B + dans les photos données dans son post (photo des locaux du coiffeur, cobra et méduse) prendra environ 0,92 seconde. Je crois volontiers que la version complète de Raspberry a 4 cœurs dans le processeur après tout. Je crois que tout le monde sait que Zero n'en a qu'un (((

Il semble que vous devrez oublier de définir la classe d'objets en temps réel sur Zero. Soit dit en passant, je dois admettre qu'une seconde de temps pour travailler le modèle sur un Pi "complet" n'est pas non plus le rêve ultime.

Mais continuons de tester le modèle.

image

Le chat a changé de position corporelle et a perdu jusqu'à 7% de son ancien "persan"). Mais c'est une blague, bien sûr, en général, le travail du modèle est très bon. C'est à cet endroit même qu'il a été possible de terminer, mais je voulais compliquer légèrement la tâche du modèle. Continuons à pratiquer sur ... les chats. Mais nous collecterons des cadres où le chat ne s'assoit pas dans une pose classique, mais dort, par exemple. Alors allons-y.

image

Dans cette image, le chat est défini comme Angora, mais ce n'est pas précis. Apparemment du fait qu'elle est agacée par une demande obsessionnelle de quitter l'évier. Eh bien, le réseau neuronal était faux, eh bien, à qui ne se passe-t-il pas finalement?

image

Il s'avère qu'un ballon de football moelleux vit dans ma maison) Oui, il arrive que les gens ne soient pas du tout ce qu'ils semblent à première vue. Le combat du chat et du réseau de neurones prend un tournant sérieux.

image

Ouah. Maintenant, elle est une husky sibérienne. Quelque chose me dit que le chat compte toujours)

image

Il semble que l'un de ces deux soit clairement renversé et ce n'est clairement pas un chat. Maintenant, il est défini par le réseau neuronal comme un fuseau (bien que seulement 8,5%), il existe encore des options que ce soit un beagle, un orque, un python rocheux ou une mouffette. Pas un chat, mais une femme est un mystère!

image

Allez! C'est toujours une orque! Oui, oui, un mammifère marin d'un ordre de cétacés. Pour une raison quelconque, j'ai rappelé les lignes d'une enfance lointaine:
"Il n'y a pas d'ordre dans ce conte,
Voici une erreur, une faute de frappe! Quelqu'un
Contre toutes les règles
Dans un conte de fées, il a réarrangé les lettres,
Ferried
"KIT" sur le "CAT",
"CAT" sur "KIT", au contraire! ".
Le gong sonne, l'arbitre arrĂŞte le combat)

image

Au deuxième tour, le chat, habilement vêtu de lunettes, est passé pour le bouledogue de Boston avec une probabilité de 34%. Ou pour les Français. Il semble que le réseau neuronal ne se soit pas complètement remis de la défaite du premier tour)

image

Enfin, enfin! Le chat est défini comme siamois avec une probabilité allant jusqu'à 66%! Bravo, SqueezeNet! Sérieusement, il semble que dans le jeu de données d'origine, des photos de chats non couchés mais assis étaient prédominantes. Les mensonges étaient principalement des chiens)

image

La capacité des chats à prendre la forme d'une boîte est déroutante même pour les humains, sans parler du réseau neuronal. L'immersion dans la boîte a réduit la précision de reconnaissance jusqu'à 40%.

image

Donc, donc ... Et cela, semble-t-il, est généralement une réception interdite. La souris d'ordinateur à côté du chat confond complètement le réseau neuronal. Maintenant, notre chat est une souris! )

Ainsi, l'ensemble du réseau neuronal a été présenté avec 11 photos de chats, dont seulement 5 ont été correctement identifiés, avec une probabilité de plus de 50% dans seulement trois cas. En aucun cas diminuer le travail des auteurs de SqueezeNet. Il s'agit d'un réseau solide avec une très large classe d'objets et des besoins en ressources relativement faibles.

L'article, bien sûr, est de nature comique, mais des conclusions assez pragmatiques peuvent être tirées des données obtenues. Il est nécessaire d'utiliser avec grand soin des réseaux de neurones pré-formés, en les vérifiant sur des images réelles de la tâche pour laquelle il est prévu d'utiliser un réseau de neurones.

Concernant le choix du réseau neuronal optimal pour la framboise - la question reste ouverte jusqu'à présent. Je continue les expériences, s'il y a un intérêt du public pour ce sujet, je partagerai les résultats de recherches ultérieures. C'est juste que les résultats de la première étape se sont avérés si drôles que je voulais vraiment les partager.

Merci d'avoir lu jusqu'au bout. Bonne chance et bonne semaine de travail)

UPD: Voir la deuxième partie de ce post pour le code de travail pour exécuter un réseau neuronal sur le Raspberry Pi Zero W.

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


All Articles