Outils pour utilisateurs

Outils du site


jeu_du_semaphore_dans_le_blender_game_engine

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
jeu_du_semaphore_dans_le_blender_game_engine [2019/02/06 15:08] – [Création de 70 000 images] sergejeu_du_semaphore_dans_le_blender_game_engine [2020/12/27 15:06] (Version actuelle) serge
Ligne 1: Ligne 1:
 ====== Jeu du sémaphore dans le Blender Game Engine ====== ====== Jeu du sémaphore dans le Blender Game Engine ======
-<WRAP center round box 80% centeralign> + 
-**{{tagpage>semaphore|Sémaphores}}**  ....  **{{tagpage>bge|Blender Game Engine}}** ....  **{{tagpage>ia|Intelligence Artificielle}}**+<WRAP center round box 60% centeralign> 
 +**{{tagpage>ia|Intelligence Artificielle}}**     **[[http://translate.google.com/translate?hl=&sl=auto&tl=en&u=https%3A%2F%2Fressources.labomedia.org%2Fjeu_du_semaphore_dans_le_blender_game_engine|English Version]]**
 </WRAP> </WRAP>
 +<WRAP center round box 60% centeralign>
 +**[[les_pages_intelligence_artificielle_en_details|Les Pages Intelligence Artificielle en détails]]**
 +</WRAP>
 +
 +<WRAP center round box 60% centeralign>
 +**{{tagpage>semaphore|Sémaphores}}**  ....  **{{tagpage>bge|Blender Game Engine}}**
 +</WRAP>
 +<WRAP center round box 60% centeralign>
 +C'est quoi un sémaphore ?
 +{{ youtube>F3sY6_fOx2I?medium }}
 +</WRAP>
 +{{ media_05:chappe.jpeg?400 }}
 +\\ \\ \\
 +<WRAP center round box 60% centeralign>
 +Des images pour l'apprentissage\\
 +{{media_01:shot_0_a.png?100|}}
 +{{media_01:shot_1_.png?100|}}
 +{{media_01:shot_2_b.png?100|}}
 +</WRAP>
 +
 +
  
-Une image pour l'apprentissage {{shot_24006_e.png?250|}}  
-Une image à décrypter {{shot_98_e.png?250|}} 
  
 ===== Le projet sur Github ===== ===== Le projet sur Github =====
   * **[[https://github.com/sergeLabo/semaphore|Sémaphore]]**   * **[[https://github.com/sergeLabo/semaphore|Sémaphore]]**
 +  * **Réalisé sur Debian 10 Buster**, ne fonctionne pas sur Win$
 +  * **python 3.7**
  
-===== Etape 1 ===== + 
-====Création de 70 000 images====+====Installation==== 
 +  * Blender 2.79b 
 +  * opencv 
 +  * numpy 
 +  * mon module perso pymultilame 
 +  
 + 
 +  sudo apt install python3-pip 
 +  sudo pip3 install numpy 
 +  sudo pip3 install opencv-python 
 +  sudo apt install blender 
 +Mon module personnel: 
 +  sudo pip3 install -e git+https://github.com/sergeLabo/pymultilame.git#egg=pymultilame 
 +Mise à jour: 
 +  sudo pip3 install --upgrade git+https://github.com/sergeLabo/pymultilame.git#egg=pymultilame 
 +   
 +====Excécution==== 
 +Lancer ./semaphore.sh 
 + 
 +et faire les 5 étapes, 3 heures et demi pour 1, et un certain temps pour les autres .... 
 + 
 +Bug connu: le treminal se ferme à la fin de la création des shots avec Blender ! Relancer le terminal et continuer avec 2 
 +===== L'intelligence du sémaphore ===== 
 +<WRAP group> 
 +<WRAP third column> 
 +Sortie Blender 320x320\\ 
 +{{media_01:shot_0_a_320.png?100|}} 
 +{{media_01:shot_1_space_320.png?100|}} 
 +{{media_01:shot_2_b_320.png?100|}} 
 +</WRAP> 
 +<WRAP third column> 
 +40x40, floue en gris\\ 
 +{{media_01:shot_0_a_gray.png?100|}} 
 +{{media_01:shot_1_space_gray.png?100|}} 
 +{{media_01:shot_2_b_gray.png?100|}} 
 +</WRAP> 
 +<WRAP third column> 
 +40x40 en Noir et Blanc\\ 
 +{{media_01:shot_0_a.png?100|}} 
 +{{media_01:shot_1_.png?100|}} 
 +{{media_01:shot_2_b.png?100|}} 
 +</WRAP> 
 +</WRAP> 
 + 
 +====1 - Création de 70 000 images====
 Dans un jeu Blender, 70 000 images sont créées, 60 0000 pour entraîner l'IA, 10 000 pour la tester. Dans un jeu Blender, 70 000 images sont créées, 60 0000 pour entraîner l'IA, 10 000 pour la tester.
-Ce jeu lit soit des textes en latin, sans caractères accentués ni spéciaux, soit l'alphabet avec un espace. Il y a donc 27 caractères différents. +Ce jeu lit soit un texte en latin de Cicéron, sans caractères accentués ni spéciaux, soit l'alphabet avec un espace. Il y a donc 27 caractères différents. 
  
 Chaque lettre est affiché dans le jeu, puis une capture de la fenêtre est enregistrée. La fréquence est maxi de 6 fps, en allant plus vite l'image enregistrée n'a pas toujours la bonne lettre. Il faut plus de 3h pour récupérer ces images. Chaque lettre est affiché dans le jeu, puis une capture de la fenêtre est enregistrée. La fréquence est maxi de 6 fps, en allant plus vite l'image enregistrée n'a pas toujours la bonne lettre. Il faut plus de 3h pour récupérer ces images.
  
-====Retaillage, flou et compression==== +<wrap em> 
-Les images sont en noir et blanc, 320x320. Il faut les retailler en 40x40 et les flouterpuis les compresser.+<wrap hi> 
 +Ne jamais déplacer ou réduire la fenêtre de Blender pendant la création des images ! 
 +</wrap> 
 +</wrap> 
 +====2 - Retaillage et flou==== 
 +Le Blender Game Engine 2.79b permet un affichage mini de 320x280. Les images du jeu sont donc en 320x320. Un script python3 avec opencv resize les images à 40x40, les floutent.
  
-Le Blender Game Engine 2.79 permet un affichage mini de 320x280. Les images du jeu sont donc en 320x320. Un script python3 avec opencv **[[https://github.com/sergeLabo/semaphore/blob/master/ori_to_40x40.py|ori_to_40x40.py]]** resize les images à 40x40 et les floutent. 
  
-{{:2019_01:shot_8_i.png?100|}} {{:2019_01:shot_10_k.png?100|}} +====3 - Compression==== 
-{{:2019_01:shot_13_n.png?100|}} {{:2019_01:shot_16_q.png?100|}} +Pour avoir une excécution plus rapide pour les étapes suivantes. 
-{{:2019_01:shot_24_y.png?100|}} {{:2019_01:shot_35_i.png?100|}} +====4 - Création du fichier de poids de l'IA==== 
-{{:2019_01:shot_38_s.png?100|}} {{:2019_01:shot_39_y.png?100|}}+  * **[[l_intelligence_du_semaphore|L'intelligence du sémaphore]]** 
 + 
 +====5 - Test de l'efficacité de l'IA==== 
 +Le résultat s'exprime par un pourcentage. L'objectif est d'avoir au moins 95% (de bonne reconnaissance). 
 + 
 +====6 - Modification de la configuration==== 
 +Choisir au moins 60000 images au total, avec: 
 +<WRAP group> 
 +<WRAP third column> 
 +  * training = 30000 
 +  * testing  = 30000 
 +</WRAP> 
 +<WRAP third column> 
 +  * training = 35000 
 +  * testing  = 35000  
 +</WRAP> 
 +<WRAP third column> 
 +  * training = 60000 
 +  * testing  = 10000  
 +</WRAP> 
 +</WRAP> 
 + 
 +Les meilleurs résultats sont obtenu avec: 
 +  * gray = 0 
 +  * blur = 6 
 +  * learningrate = 0.022 
 +====Recherche de la meilleure configuration possible==== 
 +**Les hyperparamètres sont tous les paramètres à optimiser learningrate, nombre de couches, différentes méthodes d'initialisation aléatoire des poids ** 
 + 
 +  * **[[https://supportivy.com/algorithmes-doptimisation-dhyperparametre-en-python/|Algorithmes d'optimisation d'hyperparamètre en Python]]** 
 +  * http://www.datacorner.fr/tuninghpml/ 
 +  * [[https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html#sklearn.model_selection.GridSearchCV|GridSearchCV]] de [[https://scikit-learn.org/stable/index.html|scikit-learn.org]] 
 +  * [[https://github.com/scikit-learn/scikit-learn|scikit-learn]] sur github.com 
 +Le fichier best_config_search.py fait ce boulot en autodidacte, mais c'est un bricolage réservé aux spélialistes qui se sont plongés dans tout le projet. 
 + 
 +====Molière==== 
 +**Le chemin est long du projet à la chose.**
  
-====IA==== 
-Ensuite faire l'apprentissage de **{{tagpage>ia|l' Intelligence Artificielle}}** et la tester. 
  
-  * **[[l_intelligence_du_semaphore|L'intelligence du sémaphore]]** 
  
-===== Etape 2 ===== 
-En arrière plan, défile le documentaire **NOTHING TO HIDE** pour avoir un fond très varié: 
-{{ youtube>djbwzEIv7gE?small }} 
  
 ===== Ressources sur les sémaphores et le télégraphe de Chappe ===== ===== Ressources sur les sémaphores et le télégraphe de Chappe =====
Ligne 41: Ligne 141:
  
 ==== Un alphabet possible ==== ==== Un alphabet possible ====
-{{semaphore_am.png?200|}} {{code_a_i.jpg?200|}} {{code_j_z.jpg?200|}}+{{media_12:semaphore_am.png?200|}} {{media_05:code_a_i.jpg?200|}} {{media_05:code_j_z.jpg?200|}}
  
 ==== Notre alphabet ==== ==== Notre alphabet ====
 +**j = &**
 <WRAP group> <WRAP group>
 <WRAP quarter column> <WRAP quarter column>
-  * **a** {{shot_0_a.png?30|}} +  * **a** {{media_03:shot_0_a.png?30|}} 
-  * **b** {{shot_1_b.png?30|}} +  * **b** {{media_03:shot_1_b.png?30|}} 
-  * **c** {{shot_2_c.png?30|}} +  * **c** {{media_03:shot_2_c.png?30|}} 
-  * **d** {{shot_3_d.png?30|}} +  * **d** {{media_03:shot_3_d.png?30|}} 
-  * **e** {{shot_4_e.png?30|}} +  * **e** {{media_03:shot_4_e.png?30|}} 
-  * **f** {{shot_5_f.png?30|}} +  * **f** {{media_03:shot_5_f.png?30|}} 
-  * **g** {{shot_6_g.png?30|}}+  * **g** {{media_03:shot_6_g.png?30|}}
 </WRAP> </WRAP>
  
 <WRAP quarter column> <WRAP quarter column>
-  * **h** {{shot_7_h.png?30|}} +  * **h** {{media_03:shot_7_h.png?30|}} 
-  * **i** {{shot_8_i.png?30|}} +  * **i** {{media_03:shot_8_i.png?30|}} 
-  * **j** {{shot_9_j.png?30|}} +  * **j** {{media_03:shot_9_j.png?30|}} 
-  * **k** {{shot_10_k.png?30|}} +  * **k** {{media_03:shot_10_k.png?30|}} 
-  * **l** {{shot_11_l.png?30|}} +  * **l** {{media_03:shot_11_l.png?30|}} 
-  * **m** {{shot_12_m.png?30|}} +  * **m** {{media_03:shot_12_m.png?30|}} 
-  * **n** {{shot_13_n.png?30|}}+  * **n** {{media_03:shot_13_n.png?30|}}
 </WRAP> </WRAP>
  
 <WRAP quarter column> <WRAP quarter column>
-  * **o** {{shot_14_o.png?30|}} +  * **o** {{media_03:shot_14_o.png?30|}} 
-  * **p** {{shot_15_p.png?30|}} +  * **p** {{media_03:shot_15_p.png?30|}} 
-  * **q** {{shot_16_q.png?30|}} +  * **q** {{media_03:shot_16_q.png?30|}} 
-  * **r** {{shot_17_r.png?30|}} +  * **r** {{media_03:shot_17_r.png?30|}} 
-  * **s** {{shot_18_s.png?30|}} +  * **s** {{media_03:shot_18_s.png?30|}} 
-  * **t** {{shot_19_t.png?30|}} +  * **t** {{media_03:shot_19_t.png?30|}} 
-  * **u** {{shot_20_u.png?30|}}+  * **u** {{media_03:shot_20_u.png?30|}}
 </WRAP> </WRAP>
  
 <WRAP quarter column> <WRAP quarter column>
-  * **v** {{shot_21_v.png?30|}} +  * **v** {{media_03:shot_21_v.png?30|}} 
-  * **w** {{shot_22_w.png?30|}} +  * **w** {{media_03:shot_22_w.png?30|}} 
-  * **x** {{shot_23_x.png?30|}} +  * **x** {{media_03:shot_23_x.png?30|}} 
-  * **y** {{shot_24_y.png?30|}} +  * **y** {{media_03:shot_24_y.png?30|}} 
-  * **z** {{shot_25_z.png?30|}} +  * **z** {{media_03:shot_25_z.png?30|}} 
-  * **espace** {{shot_26_ .png?30|}}+  * **espace** {{media_03:shot_26_.png?30|}}
 </WRAP> </WRAP>
 </WRAP> </WRAP>
  
-{{tag>bge sb ia realisations_logicielles semaphore}} +{{tag> bge ia sb semaphore }}
- +
-=====Code qui marche de 80 à 88 %===== +
-<code python> +
-import numpy as np, cv2 +
- +
-def sigmoid(x): return 1 / (1 + np.exp(-x)) +
-def sigmoid_prime(z): return z * (1 - z) +
-def relu(x): return np.maximum(0, x) +
-def relu_prime(z): return np.asarray(z > 0, dtype=np.float32) +
-layers = [1600, 100, 100, 27] +
-activations, learningrate = [relu, relu, sigmoid], 0.05 +
- +
-f = np.load('/media/data/3D/projets/semaphore/semaphore.npz'+
-x_train, y_train = f['x_train'], f['y_train'+
-x_train = 1 - x_train +
-x_test, y_test = x_train[50000:,:], y_train[50000:+
-x_train, y_train = x_train[:50000,:], y_train[:50000] +
-Y = np.eye(27, 27) +
-activations_prime = [globals()[f.__name__ + '_prime'] for f in activations] +
-A = {} +
-W = [np.random.randn(layers[k+1], layers[k]) / np.sqrt(layers[k]) for k in range(len(layers)-1)] +
- +
-print("Training..."+
-cv2.namedWindow('img', cv2.WINDOW_NORMAL) +
-for epoch in range(1): +
-    for i, (a, d) in enumerate(zip(x_train, y_train)): +
-        if i % 100 == 0: +
-            print(epoch, i, d) +
-            cv2.imshow("img", a.reshape(40,40) * 255) +
-            cv2.waitKey(1) +
-        a = np.array(a, ndmin=2).T +
-        A[0] = a +
-        for k in range(len(layers)-1): +
-            z = np.dot(W[k], a) +
-            a = activations[k](z) +
-            A[k+1] = a +
-        delta_a = a - Y[:,[d]] +
-        for k in range(len(layers)-2, -1, -1): +
-            dz = delta_a * activations_prime[k](A[k+1]) +
-            dW = np.dot(dz, A[k].T) +
-            delta_a = np.dot(W[k].T, dz) +
-            W[k] -= learningrate * dW+
  
-print("Testing...") 
-S = 0 
-for a, d in zip(x_test, y_test): 
-    for k in range(len(layers)-1): 
-        a = activations[k](np.dot(W[k], a)) 
-    if np.argmax(a) == d: 
-        S += 1 
-print("Accuracy: %.1f %%" % (100.0 * S / len(x_test))) 
-np.save('weights', W) 
  
-</code>     
  
jeu_du_semaphore_dans_le_blender_game_engine.1549465700.txt.gz · Dernière modification : 2019/02/06 15:08 de serge