Table des matières:

Est-ce une main ? (Caméra Raspberry Pi + Réseau de neurones) Partie 1/2 : 16 étapes (avec photos)
Est-ce une main ? (Caméra Raspberry Pi + Réseau de neurones) Partie 1/2 : 16 étapes (avec photos)

Vidéo: Est-ce une main ? (Caméra Raspberry Pi + Réseau de neurones) Partie 1/2 : 16 étapes (avec photos)

Vidéo: Est-ce une main ? (Caméra Raspberry Pi + Réseau de neurones) Partie 1/2 : 16 étapes (avec photos)
Vidéo: SFEIR Talks #16 - Intelligence Artificielle : CNN - Image classification 2024, Novembre
Anonim
Est-ce une main ? (Caméra Raspberry Pi + Réseau de neurones) Partie 1/2
Est-ce une main ? (Caméra Raspberry Pi + Réseau de neurones) Partie 1/2
Est-ce une main ? (Caméra Raspberry Pi + Réseau de neurones) Partie 1/2
Est-ce une main ? (Caméra Raspberry Pi + Réseau de neurones) Partie 1/2
Est-ce une main ? (Caméra Raspberry Pi + Réseau de neurones) Partie 1/2
Est-ce une main ? (Caméra Raspberry Pi + Réseau de neurones) Partie 1/2

Il y a quelques jours, je me suis blessé au poignet droit au gymnase. Ensuite, chaque fois que j'utilisais ma souris d'ordinateur, cela causait beaucoup de douleur à cause de l'angle raide du poignet.

C'est à ce moment-là que ça m'a frappé " ne serait-ce pas génial si nous pouvions convertir n'importe quelle surface en un trackpad " et je ne sais pas pourquoi mais pour une raison quelconque j'ai pensé à elle, le film HER, je vous laisse le comprendre les gars dehors. C'était une pensée excitante mais je ne savais pas si je pouvais le faire, j'ai décidé de l'essayer.

Cet article capture ce qui en est ressorti.

Avant de commencer, j'ai un avertissement-

' A la fin de cet article, je ne pouvais convertir aucune surface en trackpad mais je n'apprends pas grand chose et j'ai ajouté de gros outils à mon arsenal. j'espère que ça t'arrive aussi '

Commençons.

Étape 1: vidéo

Image
Image

Voici une petite vidéo de 5 min couvrant toutes les étapes. Regarde.

Étape 2: Matériel

Matériel
Matériel

J'ai installé un Raspberry Pi avec une caméra Raspberry Pi à une hauteur d'environ 45 cm. Cela nous donne une zone de surveillance d'environ 25x25 cm sous la caméra.

Raspberry Pi et Raspberry Pi Camera sont facilement disponibles, il suffit de les rechercher sur Google et vous devriez pouvoir trouver un magasin local.

Jetez un œil à ce lien ou à l'une de mes listes de lecture Raspberry pi pour que votre pi sans tête soit opérationnel.

Suite à cette configuration, nous avons besoin d'un morceau de code qui décide s'il y a une main dans la zone que la caméra surveille et si oui où se trouve-t-elle.

Étape 3: Morceau de code

Morceau de code
Morceau de code
Morceau de code
Morceau de code

Le morceau de code qui nous permet de décider s'il y a une main dans la zone d'intérêt utilise quelque chose appelé Neural Network. Ils relèvent d'une catégorie de programmation où nous ne définissons pas de règles pour prendre des décisions, mais nous montrons suffisamment de données de réseau neuronal pour qu'il détermine lui-même les règles.

Dans notre cas, au lieu de coder à quoi ressemble la main, nous montrons des images de réseau neuronal capturées à partir de raspberry pi qui contient la main et qui ne contient pas la main. Cette phase est appelée formation du réseau de neurones et les images utilisées sont appelées jeu de données de formation.

Étape 4: Obtenir des images

Obtenir des images
Obtenir des images

Je me suis connecté à distance à mon raspberry pi et j'ai capturé un tas d'images à l'aide de la commande suivante.

sudo raspistill -w 640 -h 480 -rot 90 -t 250000 -t1 5000 -o frame%04d.jpg

J'ai capturé 80 images avec la main et 80 images qui ne contiennent pas de main. 160 images ne suffisent pas pour entraîner correctement un réseau de neurones mais devraient suffire pour une preuve de concept.

Outre 160 images, j'ai capturé 20 images supplémentaires pour tester notre réseau une fois qu'il sera formé.

Une fois l'ensemble de données prêt, j'ai commencé à écrire du code pour le réseau de neurones.

Étape 5: Outils et langage utilisé

Outils et langage utilisé
Outils et langage utilisé
Outils et langage utilisé
Outils et langage utilisé

J'ai écrit mon réseau de neurones dans la bibliothèque d'apprentissage en profondeur python appelée Keras et le code est écrit sur le cahier jupyter à partir du navigateur anaconda.

Étape 6: Préparation de l'ensemble de données pour la formation

Préparation de l'ensemble de données pour la formation
Préparation de l'ensemble de données pour la formation
Préparation de l'ensemble de données pour la formation
Préparation de l'ensemble de données pour la formation
Préparation de l'ensemble de données pour la formation
Préparation de l'ensemble de données pour la formation
Préparation de l'ensemble de données pour la formation
Préparation de l'ensemble de données pour la formation

Tout d'abord (Image #1), j'ai inclus toutes les bibliothèques nécessaires à ce projet, qui incluent PIL, matplotlib, numpy, os et Keras. Dans la deuxième cellule du bloc-notes python (image n ° 2), je définis les chemins vers l'ensemble de données et j'imprime le nombre d'échantillons. Maintenant, nous devons charger toutes les images dans un tableau numpy, donc dans la troisième cellule (image #2), j'ai créé un tableau numpy de 82 (nombre d'échantillons manuels) + 75 (nombre d'échantillons non manuels), c'est-à-dire 157x100x100x3. 157 est le nombre total d'images que j'ai, 100x100 est notre dimension d'image redimensionnée et 3 est pour les couches de couleur rouge, verte et bleue dans l'image.

Dans les quatrième et cinquième cellules, nous chargeons des images contenant la main suivies d'images qui ne contiennent pas la main dans le tableau numpy. Dans la sixième cellule, nous divisons chaque valeur par 255, limitant ainsi la plage de valeurs de 0 à 1. (Image #3)

Je suis désolé si les images jointes ne sont pas assez bonnes. Voici le lien vers le référentiel GITHUB pour que vous puissiez consulter le code. N'oubliez pas de remplacer les noms de chemin de répertoire par votre chemin:).

Se déplaçant le long.

Ensuite, nous devons étiqueter chaque image, nous créons donc un tableau numpy unidimensionnel de 157 de long. Les 82 premières entrées sont définies sur 1 et les 75 entrées restantes sont définies sur 0, transmettant au réseau de neurones que les 82 premières images proviennent d'une classe et que les autres proviennent d'une autre. (Image n ° 4)

Créons maintenant un réseau de neurones.

Étape 7: Réseau de neurones

Réseau neuronal
Réseau neuronal
Réseau neuronal
Réseau neuronal

Dans la neuvième cellule, nous définissons notre réseau de neurones. Il contient trois répétitions de couche de convolution suivies de couches maxpool avec respectivement 8, 12 et 16 filtres de convolution. Ensuite, nous avons deux réseaux de neurones denses. Joindre deux images pour cette étape. Le premier est un code qui crée un réseau de neurones et le second est une représentation graphique du réseau de neurones avec une dimension de sortie et des opérations annotées.

Étape 8: Entraînement du réseau de neurones

Réseau de neurones d'entraînement
Réseau de neurones d'entraînement

Dans la dixième cellule, nous configurons l'optimiseur de réseau neuronal sur « adam » et la fonction de perte sur « binary_crossentropy ». Ils jouent un rôle majeur dans la mise à jour des pondérations du réseau. Enfin, lorsque nous exécutons la onzième cellule, le réseau de neurones commence à s'entraîner. Pendant que le réseau s'entraîne, examinez la fonction de perte et assurez-vous qu'elle diminue.

Étape 9: Test du réseau de neurones

Test du réseau de neurones
Test du réseau de neurones

Une fois le réseau de neurones formé, nous devons préparer un ensemble de données de test. Nous répétons la procédure effectuée pour préparer l'ensemble d'apprentissage dans les 3e, 4e, 5e et 6e cellules sur les données de test pour créer l'ensemble de test. Nous préparons également une étiquette pour l'ensemble de test, mais cette fois, nous exécutons un modèle sur ces ensembles de données pour obtenir des prédictions et non pour nous entraîner.

Étape 10: Résultat et partie suivante…

Résultat et partie suivante…
Résultat et partie suivante…

J'ai obtenu une précision de test de 88%, mais prenez cela avec une pincée de sel car les ensembles de données utilisés pour entraîner et tester ce modèle sont très très très petits et insuffisants pour entraîner correctement ce modèle.

En tout cas j'espère que cet article vous a plu. Mon intention derrière cet exercice n'est pas encore terminée et attention à la 2ème partie. Je le téléchargerai dès que possible.

Dans la prochaine partie, nous allons entraîner un autre réseau de neurones qui nous indiquera l'emplacement de la main dans une image détectée par la main.

Toutes les questions sont les bienvenues.

Si quelqu'un est intéressé à utiliser mon petit ensemble de données, faites-le moi savoir dans les commentaires. Je le rendrai disponible.

Merci d'avoir lu. Je vous verrai bientôt avec la deuxième partie jusque-là, pourquoi ne pas créer et entraîner un réseau de neurones.

Edit: - Les prochaines étapes sont pour la deuxième partie.

Étape 11: Détection d'objets

Détection d'objets
Détection d'objets

Dans les étapes précédentes, nous avons créé un NN qui nous indique si l'image de test contient une main ou non. Eh bien quoi ensuite? Si NN classe l'image comme contenant la main, nous aimerions connaître l'emplacement de la main. C'est ce qu'on appelle la détection d'objets dans la littérature sur la vision par ordinateur. Alors formons NN qui fait exactement la même chose.

Étape 12: Vidéo

Image
Image

Une vidéo de 3 min expliquant toutes les étapes restantes. Regarde.

Étape 13: Étiquetage

Étiquetage
Étiquetage
Étiquetage
Étiquetage
Étiquetage
Étiquetage

Si vous voulez qu'un réseau de neurones affiche l'emplacement de la main, nous devons l'entraîner de cette manière, c'est-à-dire contrairement au réseau de neurones précédent où chaque image était étiquetée avec ou sans main. Cette fois, toutes les images avec la main auront quatre étiquettes correspondant aux coordonnées diagonales du cadre de délimitation autour de la main dans cette image.

L'image jointe du fichier csv contient une étiquette pour chaque image. Veuillez noter que les coordonnées sont normalisées avec la dimension de l'image, c'est-à-dire que si la coordonnée X supérieure est au 320e pixel de l'image avec une largeur de 640 pixels, nous l'étiqueterons comme 0,5.

Étape 14: Étiquetage de l'interface graphique

GUI d'étiquetage
GUI d'étiquetage
GUI d'étiquetage
GUI d'étiquetage
GUI d'étiquetage
GUI d'étiquetage
GUI d'étiquetage
GUI d'étiquetage

Vous vous demandez peut-être comment j'ai réussi à étiqueter les 82 images, eh bien, j'ai écrit une interface graphique en python qui m'a aidé dans cette tâche. Une fois l'image chargée dans l'interface graphique. J'ai fait un clic gauche sur la coordonnée supérieure et un clic droit sur la coordonnée inférieure de la zone de délimitation probable autour de la main. Ces coordonnées sont ensuite écrites dans un fichier après quoi je clique sur le bouton suivant pour charger l'image suivante. J'ai répété cette procédure pour les 82 images de train et 4 images de test. Une fois les étiquettes prêtes, c'était l'heure de l'entraînement.

Étape 15: Bibliothèques nécessaires

Bibliothèques nécessaires
Bibliothèques nécessaires
Bibliothèques nécessaires
Bibliothèques nécessaires
Bibliothèques nécessaires
Bibliothèques nécessaires

Nous devons d'abord charger toutes les bibliothèques nécessaires. Qui inclut

  • PIL pour la manipulation d'images,
  • matplotlib pour le traçage,
  • numpy pour l'opération matricielle,
  • os pour les fonctionnalités dépendantes du système d'exploitation et
  • keras pour le réseau de neurones.

Étape 16: Cellules restantes

Cellules restantes
Cellules restantes
Cellules restantes
Cellules restantes
Cellules restantes
Cellules restantes
Cellules restantes
Cellules restantes

Dans les 2e, 3e, 4e et 5e cellules, nous chargeons des images dans un tableau numpy et créons un tableau à quatre dimensions à partir d'un fichier csv pour servir d'étiquettes. Dans la cellule numéro 6, nous créons notre réseau de neurones. Son architecture est identique au réseau de neurones utilisé pour la classification sauf la dimension de la couche de sortie qui est 4 et non 1. Une autre différence vient de la fonction de perte utilisée qui est l'erreur quadratique moyenne. Dans la cellule numéro 8, nous commençons l'entraînement de notre réseau neuronal une fois entraîné.

Merci d'avoir lu.

Conseillé: