l_intelligence_du_semaphore
Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédenteProchaine révisionLes deux révisions suivantes | ||
l_intelligence_du_semaphore [2019/08/08 16:59] – ↷ Liens modifiés en raison d'un déplacement. serge | l_intelligence_du_semaphore [2019/10/10 13:02] – [L'intelligence du sémaphore] serge | ||
---|---|---|---|
Ligne 8: | Ligne 8: | ||
{{ chappe.jpeg? | {{ chappe.jpeg? | ||
</ | </ | ||
+ | |||
+ | <WRAP center round box 60% centeralign> | ||
+ | **Calcul de [[Le sémaphore avec TensorFlow|Le sémaphore avec TensorFlow]] sur GPU au lieu du CPU avec TensorFlow** | ||
+ | </ | ||
+ | =====Les sources sur GitHub===== | ||
+ | * **[[https:// | ||
=====Les images utilisées pour l' | =====Les images utilisées pour l' | ||
====Images sorties de Blender==== | ====Images sorties de Blender==== | ||
Ligne 297: | Ligne 303: | ||
</ | </ | ||
- | =====La reconnaissance seule===== | ||
- | L' | ||
- | * 40 x 40 pixels | ||
- | * en noir et blanc convertit en 0 et 1, que des 0 et des 1 dans le array | ||
- | * Floutée entre 5 et 7 | ||
- | * Convertie en vecteur ligne: img = img.reshape(1600) | ||
- | |||
- | ====Les poids==== | ||
- | Le fichier weights.npy doit être dans le dossier du script. | ||
- | **[[https:// | ||
- | |||
- | ====La class Reconnaissance==== | ||
- | <code python> | ||
- | import numpy as np | ||
- | import cv2 | ||
- | |||
- | |||
- | def sigmoid(x): | ||
- | return 1 / (1 + np.exp(-x)) | ||
- | def relu(x): | ||
- | return np.maximum(0, | ||
- | |||
- | class Reconnaissance: | ||
- | def __init__(self): | ||
- | self.weight = np.load(' | ||
- | |||
- | def testing(self, | ||
- | vecteur_ligne = img | ||
- | layers = [1600, 100, 100, 27] | ||
- | activations = [relu, relu, sigmoid] | ||
- | for k in range(len(layers)-1): | ||
- | vecteur_ligne = activations[k](np.dot(self.weight[k], | ||
- | | ||
- | reconnu = np.argmax(vecteur_ligne) | ||
- | return reconnu | ||
- | </ | ||
- | |||
- | ====Adaptation de l' | ||
- | <code python> | ||
- | # frame peut être la capture d'une webcam | ||
- | cv2.imshow(' | ||
- | |||
- | # Application d'un seuil pour extraire le sémaphore du fond | ||
- | # Le seuil est à adapter en fonction de la couleur du sémaphore | ||
- | hsv = cv2.cvtColor(frame, | ||
- | lower = np.array([120, | ||
- | upper = np.array([255, | ||
- | img = cv2.inRange(hsv, | ||
- | |||
- | # Flou: GaussianBlur semble mieux que Averaging=cv2.blur() | ||
- | img = cv2.GaussianBlur(img, | ||
- | |||
- | # Resize | ||
- | img = cv2.resize(img, | ||
- | |||
- | # Noir et blanc, sans gris | ||
- | ret, nb = cv2.threshold(img, | ||
- | |||
- | # Valeur 0 ou 1 | ||
- | nb = nb / 255 | ||
- | | ||
- | # Reshape pour avoir un vecteur ligne | ||
- | vect = nb.reshape(40*40) | ||
- | |||
- | reco = Reconnaissance() | ||
- | reconnu = reco.testing(vect) | ||
- | print(" | ||
- | </ | ||
- | |||
- | ====Les fichiers pour un test avec Webcam et un sémaphore en carton==== | ||
- | * **[[https:// | ||
===== Etape suivante: YOLO Darknet===== | ===== Etape suivante: YOLO Darknet===== | ||
**[[computer_vision_and_pattern_recognition_segmentation_d_image|Computer Vision and Pattern Recognition Mask R-CNN]]** | **[[computer_vision_and_pattern_recognition_segmentation_d_image|Computer Vision and Pattern Recognition Mask R-CNN]]** | ||
- | ===== Idées de choses à faire par Max===== | + | {{tag>ia semaphore sb bge}} |
- | + | ||
- | * Essayer d' | + | |
- | * Essayer de reconnaître les coordonnées de la position du sémaphore (un quadrilatère entourant le sémaphore sur l' | + | |
- | * Essayer de reconnaître la forme du sémaphore plutôt que l' | + | |
- | * Essayer de reconnaître plusieurs sémaphores simultanément. Le but est de pouvoir choisir lequel on veut pouvoir imiter. | + | |
- | + | ||
- | ==== Idée directrice ==== | + | |
- | Réaliser 2 apprentissages indépendants pour faciliter l' | + | |
- | \\ \\ | + | |
- | Je vois plusieurs avantages : | + | |
- | * Nous savons que dans une vidéo, un sémaphore ne peut pas se promener d'un bout à l' | + | |
- | * Une fois la première reconnaissance réalisé il est facile de recadrer l' | + | |
- | * Il est plus facile d' | + | |
- | * Si nous reconnaissons plusieurs sémaphores simultanément, | + | |
- | * Un filtrage intelligent pourrait comprendre qu'un sémaphore est occulté par un obstacle mouvant avant d'etre de nouveau visible. | + | |
- | ==== Petit réseau convolutif ==== | + | |
- | * En entré, il faudrait une première couche identique, et une deuxième couche qui n'est pas relié à tous les neurones de la première couche, mais uniquement à un ensemble représentant une tuile. Il faut donc modifier l'algo actuel qui relie toujours tous les neurones de la couche N-1 à tous les neurones de la couche N. | + | |
- | * Comment paver l' | + | |
- | + | ||
- | ==== Reconnaître les coordonnées du sémaphore ==== | + | |
- | * Il faut lors de la génération des images ajouter une méta information dans l' | + | |
- | * Quels types de coordonnées ? Les coordonées de 2 angles opposés ? les coordonées d'un angle et 2 distances ? autre ? | + | |
- | * Comment modifier la sortie du réseau de neurones pour reconnaître le couple (position du sémaphore, valeur) ? | + | |
- | + | ||
- | ==== Reconnaître la forme du sémaphore ==== | + | |
- | * Plutôt que de tagger l' | + | |
- | * Quels informations pour coder la forme ? Les 3 Angles absolue du régulateur et des indicateurs ? | + | |
- | * Comment modifier la sortie du réseau de neurones pour reconnaître le couple (position du sémaphore, forme du sémaphore) ? | + | |
- | + | ||
- | ==== Reconnaître plusieurs sémaphores ==== | + | |
- | * Comment modifier la sortie du réseau de neurones pour reconnaître plusieurs couples (position, forme) ? | + | |
- | + | ||
- | {{tag>ia semaphore sb realisations_logicielles}} | + | |
l_intelligence_du_semaphore.txt · Dernière modification : 2020/12/27 15:07 de serge