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/04/27 12:50] – [Réseau de neurones Perceptron multicouches en python] serge | l_intelligence_du_semaphore [2020/12/01 17:40] – ↷ Liens modifiés en raison d'un déplacement. serge | ||
---|---|---|---|
Ligne 6: | Ligne 6: | ||
C'est quoi un sémaphore ? | C'est quoi un sémaphore ? | ||
{{ youtube> | {{ youtube> | ||
- | {{ chappe.jpeg? | + | {{ media_05: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==== | ||
<WRAP group> | <WRAP group> | ||
<WRAP third column> | <WRAP third column> | ||
- | {{: | + | {{media_03: |
</ | </ | ||
<WRAP third column> | <WRAP third column> | ||
- | {{: | + | {{media_03: |
</ | </ | ||
<WRAP third column> | <WRAP third column> | ||
- | {{: | + | {{media_03: |
</ | </ | ||
</ | </ | ||
Ligne 25: | Ligne 31: | ||
<WRAP group> | <WRAP group> | ||
<WRAP third column> | <WRAP third column> | ||
- | {{:2019_03: | + | {{media_01: |
</ | </ | ||
<WRAP third column> | <WRAP third column> | ||
- | {{:2019_03: | + | {{media_01: |
</ | </ | ||
<WRAP third column> | <WRAP third column> | ||
- | {{:2019_03: | + | {{media_01: |
</ | </ | ||
</ | </ | ||
- | =====La Reconnaissance faciale, c'est cool !===== | ||
- | * **[[https:// | ||
===== Des maths ! ==== | ===== Des maths ! ==== | ||
====Relu Rectifier neural networks==== | ====Relu Rectifier neural networks==== | ||
+ | {{ media_12: | ||
* **[[https:// | * **[[https:// | ||
<code python> | <code python> | ||
Ligne 59: | Ligne 64: | ||
<code python> | <code python> | ||
def relu_prime(z): | def relu_prime(z): | ||
- | """ | + | """ |
- | | + | |
- | Une fonction indicatrice, | + | Une fonction indicatrice, |
- | | + | C'est donc la fonction H (discontinue en 0) prenant la valeur 1 pour tous les réels positifs et la valeur 0 pour les réels strictement négatifs. |
- | | + | |
- | C'est donc la fonction H (discontinue en 0) prenant la valeur 1 pour tous | + | |
- | | + | |
""" | """ | ||
return np.asarray(z > 0, dtype=np.float32) | return np.asarray(z > 0, dtype=np.float32) | ||
</ | </ | ||
====Sigmoïd==== | ====Sigmoïd==== | ||
+ | {{ sigmoid.png? | ||
* **[[https:// | * **[[https:// | ||
Elle représente la fonction de répartition de la loi logistique. Elle est souvent utilisée dans les réseaux de neurones parce qu' | Elle représente la fonction de répartition de la loi logistique. Elle est souvent utilisée dans les réseaux de neurones parce qu' | ||
Ligne 90: | Ligne 93: | ||
====Diagonale de 1==== | ====Diagonale de 1==== | ||
- | {{ :2019_02: | + | {{ media_01: |
- | numpy.eye(N, | + | |
+ | numpy.eye(N, | ||
+ | | ||
Return a 2-D array with ones on the diagonal and zeros elsewhere. | Return a 2-D array with ones on the diagonal and zeros elsewhere. | ||
Matrice ou la sortie est idéale: le 1 correspond à entée[i] = sortie[i], et entée[j], | Matrice ou la sortie est idéale: le 1 correspond à entée[i] = sortie[i], et entée[j], | ||
Ligne 103: | Ligne 108: | ||
Un réseau de neurones Perceptron multicouches est un type de réseau dont l' | Un réseau de neurones Perceptron multicouches est un type de réseau dont l' | ||
- | ====Notre réseau==== | ||
- | Réseau de neurones: **Une colonne de 1600 en entrée, 2 nodes de 100, une sortie de 27 caractères.** | ||
===== Réseau de neurones Convolutif ===== | ===== Réseau de neurones Convolutif ===== | ||
- | * **[[ https:// | + | * **[[https:// |
Un réseau de neurones Convolutif est un type de réseau de neurones artificiels dans lequel le motif de connexion entre les neurones est inspiré par le cortex visuel des animaux. Actuellement, | Un réseau de neurones Convolutif est un type de réseau de neurones artificiels dans lequel le motif de connexion entre les neurones est inspiré par le cortex visuel des animaux. Actuellement, | ||
- | Ce type de réseau est développé avec [[yolo_avec_mes_propres_images|Yolo Darknet Préparation de mes propres images]] puis [[yolo_sans_carte_graphique|Yolo Darknet sans carte graphique]] et enfin [[2019_04:yolo_darknet_sur_un_portable_optimus|Yolo Darknet sur un portable Optimus]]. | + | Ce type de réseau est développé avec [[yolo_avec_mes_propres_images|Yolo Darknet Préparation de mes propres images]] puis [[yolo_sans_carte_graphique|Yolo Darknet sans carte graphique]] et enfin [[yolo_darknet_sur_un_portable_optimus|Yolo Darknet sur un portable Optimus]]. |
=====Réseau de neurones Perceptron multicouches en python===== | =====Réseau de neurones Perceptron multicouches en python===== | ||
Ligne 116: | Ligne 119: | ||
Enfin, là c'est de l' | Enfin, là c'est de l' | ||
- | {{ :2019_04: | + | ====Notre réseau==== |
+ | **Une colonne de 1600 en entrée, 2 nodes de 100, une sortie de 27 caractères.** | ||
+ | |||
+ | {{ media_01: | ||
La totalité du projet est à **[[https:// | La totalité du projet est à **[[https:// | ||
+ | ====Installation==== | ||
+ | Installation de pip3: | ||
+ | sudo apt install pip3 | ||
+ | Installation de numpy et opencv | ||
+ | sudo pip3 install opencv numpy | ||
+ | Il faut installer mon [[pymultilame|module python perso]] disponible sur Github | ||
+ | sudo pip3 install -e git+https:// | ||
+ | | ||
+ | ====Le script==== | ||
<file python ia.py> | <file python ia.py> | ||
# | # | ||
Ligne 165: | Ligne 180: | ||
def training(self): | def training(self): | ||
- | """ | + | """ |
print(" | print(" | ||
Ligne 179: | Ligne 194: | ||
# Initialisation des poids des nodes, pour ne pas à être à 0 | # Initialisation des poids des nodes, pour ne pas à être à 0 | ||
# Construit 3 matrices (100x1600, 100x100, 27x100) | # Construit 3 matrices (100x1600, 100x100, 27x100) | ||
- | # /np.sqrt() résultat expérimental de l' | + | # /np.sqrt() résultat expérimental de l' |
weight_list = [np.random.randn(self.layers[k+1], | weight_list = [np.random.randn(self.layers[k+1], | ||
| | ||
Ligne 189: | Ligne 204: | ||
# Affichage pour distraire les mangalore | # Affichage pour distraire les mangalore | ||
- | # TODO: mettre ça dans un truc à l'ext de cette méthode | ||
if i % 10000 == 0: | if i % 10000 == 0: | ||
print(i, nombre_lettre) | print(i, nombre_lettre) | ||
Ligne 208: | Ligne 222: | ||
# self.activations = non linéaire sinon sortie fonction linéaire de l' | # self.activations = non linéaire sinon sortie fonction linéaire de l' | ||
- | # imite le seuil d' | + | # imite le seuil d' |
vecteur_colonne = self.activations[k](z) | vecteur_colonne = self.activations[k](z) | ||
Ligne 254: | Ligne 268: | ||
success += 1 | success += 1 | ||
else: | else: | ||
- | # TODO: mettre ça dans un truc à l'ext de cette méthode | ||
if self.failed: | if self.failed: | ||
self.write_failed(img, | self.write_failed(img, | ||
Ligne 297: | Ligne 310: | ||
</ | </ | ||
- | =====La | + | =====La |
- | L' | + | * **[[cupy_vs_numpy|Cupy: calcul numpy avec CUDA]]** |
- | * 40 x 40 pixels | + | * **[[le_semaphore_avec_tensorflow|Le sémaphore avec TensorFlow]]** |
- | * 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> |
- | + | ||
- | * 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> | + | |
l_intelligence_du_semaphore.txt · Dernière modification : 2020/12/27 15:07 de serge