Bonjour tout le monde.
I - Situation Initiale
Mon projet est d'aider un robot motorisé a se déplacer en autonome a travers une ville, le tout grâce aux feux de signalisation pédestres. Pour se repérer, le robot dispose d'une camera accrochée a lui dont il reçoit les images en temps réel, il doit analyser ces images pour ensuite déterminer l'action a entreprendre. Par exemple si le feu est vert alors le robot peut avancer, si le feu est rouge il doit s’arrêter, si il n'y a aucun feu de signalisation alors on décide d'une action par défaut.
La partie la plus importante est donc d'analyser l'image pour en ressortir un des trois résultats:
1 - Feu vert
2 - Feu rouge
3 - Feu inexistant
Voici quelques images parmi celles que j'utilise:
II - Spécifications
Pour permettre une certaine efficacité j'utilise le langage C et C++ pour récupérer l'image et l'analyser. Pour récupérer l'image j'utilise la librairie opencv et pour l'analyser j'utilise la librairie fann qui permet de construire un réseau de neurone artificiel pour ensuite pratiquer la reconnaissance d'image.
Problème n°1: Taille du fichier de données.
Pour entraîner le robot je dois lui fournir un fichier regroupant toutes les données des images.
J'ai 11375 images en stock faisant chacune 640 pixels de large et 480 de haut. Pour chacun de ces pixels j’écris le code RGB en hexadécimale séparé par un espace. Pour chacune des images il y a un résultat attribué (sous la forme d'un nombre représentant la couleur du feu sur l'image).
Le fichier ressemble a quelque chose comme:
Je me retrouve donc avec:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 11375 307200 1 0xFFFFFF 0xFFFFFF 0xFFFFFF 0xFFFF45 . . . 0 0xFFFFFF 0xFFFFFF 0xFFFFFF 0x000000 . . . 0 . . .
H + (F * w * h * c + CRLF - 1) + (F * (CRLF + 1))
H: Le nombre de caractère pour écrire le header: entre 5 et 20.
F: Le nombre d'images
w: La largeur des images en pixel
h: La hauteur des images en pixel
c: Le nombre de caractère pour écrire un pixel en incluant l'espace qui précède (le -1 specifie celui qui manque a la fin de la ligne)
CRLF: Les deux caractères de retour a la ligne et de nouvelle ligne
Mon calcul est peut-être erroné mais il se rapproche de la taille que j'obtiens en pratique:
Soit ici: 17 + (11375 * 640 * 480 * 9 + 2 - 1) + (11375 * (2 + 1)) =31 449 634 143octets (environs 31Go)
Le problème étant que je travaille sur une machine 32bits et que la taille des fichiers ne peut pas excéder 2 147 483 647octets (environs 2.1Go), le seul remede que j'ai trouve jusqu'a present est de reduire F, le nombre d'image utilise lors du processus d'apprentissage. Je ne peux que très peu influencer la largeur et la hauteur de chaque image, quant au nombre de caractere utilise pour ecrire la valeur RGB d'un pixel je n'ai pas trouve mieux pour le moment.
Problème n°2 : Quelle taille pour mon réseau de neurones ?
Celui-ci est mon plus gros problème car l'architecture du réseau de neurones va influencer l’efficacité de l'analyse d'image ainsi que le temps d'apprentissage.
Pour le moment voici mes paramètres:
num_input et num_output correspondent a 307200 et 1 respectivement. Je n'arrive pas a voir le bout de la période d'apprentissage et je me demandais donc quels paramètres seraient optimals pour raccourcir le temps d'apprentissage.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 116 const unsigned int num_input = number_of_input; 117 const unsigned int num_output = number_of_output; 118 const unsigned int num_layers = 1; 119 const unsigned int num_neurons_hidden = 338; 120 const float desired_error = (const float) 0.01; 121 const unsigned int max_epochs = 1000000; 122 const unsigned int epoch_between_reports = 1; 123 unsigned int layers[4] = {num_input,8,9,num_output}; 124 struct fann *ann = fann_create_standard_array(4,layers); 125 fann_set_activation_function_hidden(ann,FANN_SIGMOID_SYMMETRIC); 126 fann_set_activation_function_output(ann,FANN_SIGMOID_SYMMETRIC); 127 fann_train_on_file(ann,filename,max_epochs,epoch_between_reports,desired_error); 128 fann_save(ann,"data.net"); 129 fann_destroy(ann);
Voila j’espère avoir été assez claire dans mes explications et si vous avez des remarques, questions ou autres je suis preneur.
Je vous remercie.
Partager