Ceci est une ancienne révision du document !
Table des matières
Jeu du sémaphore dans le Blender Game Engine
Le projet sur Github
Etape 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. 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.
Retaillage, flou et compression
Les images sont en noir et blanc, 320×320. Il faut les retailler en 40×40 et les flouter, puis les compresser.
Le Blender Game Engine 2.79 permet un affichage mini de 320×280. Les images du jeu sont donc en 320×320. Un script python3 avec opencv resize les images à 40×40 et les floutent.
IA
Ensuite faire l'apprentissage de l' Intelligence Artificielle et la tester.
Etape 2 en travaux, pas vraiment commencé
En arrière plan, défile le documentaire NOTHING TO HIDE pour avoir un fond très varié:
Ressources sur les sémaphores et le télégraphe de Chappe
Un alphabet possible
Notre alphabet
Code qui marche de 80 à 88 %
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)