Travaux Practique - Lettres d'espace

Incité par propagande affichée autour de l'ESI, Professeur Manso a été fasciné avec la possibilité de la vie extra-terrestre. En outre, une nuit quand il revenait de Nasso, il a observé un groupe de lumières dans le ciel cela ressemble un peu comme une lettre 'A'. Professeur Manso recomptages que ce groupe de lumières a regardé quelque chose comme:

Lettre d'espace

Malheureusement, Professeur Manso est trop occupé avec la preperation des cours pour passer la nuit à regarder les étoiles. Utiliser son esprit technique, il a préparé un appareil-video pour enregistrer la région d'espace où il a vu les lumières qui ont ressemblé comme une lettre.

Hélas, l'appareil-photo de la vidéo présente un dilemna intéressant: bien qu'il enregistre le nuit ciel efficacement, il prend de même que long regarder la vidéo comme il fait pour passer la nuit qui regarde pour les signaux d'espace. Une vidéo d'une nuit peut contenir millions de cadres, et il prend trop long à inspecter chaque cadre manuellement pour voir s'il y a un modèle de lumières qui ressemblent à une lettre.

Professeur Manso a besoin de l'aide de ses étudiants talentueux. Utiliser votre connaissance des réseaux neuronaux mulit-couche, c'est possible de créer un réseau qui parcourt à travers tous les cadres d'une vidéo et cherche une lettre spécifique. En travaillant ensemble, vous devriez être capables de créer et former un réseau neuronaux pour chaque lettre, et alors le réseau peut traverser la vidéo en cherchant la lettre pour laquelle le réseau a été formé. Si des lettres sont trouvées, peut-être - et c'est le grand espoir de Professeur Manso - les lettres de chaque groupe peuvent être combinés pour nous fournir quelque sagesse de l'espace externe.

Les directives pour compléter le projet

La classe sera divisée en groupes de 2, chaque groupe sera assigné essayer 2 lettres pour chercher dans la séries des cadres dans la video de Prof. Manso. (Voyez au-dessous pour les Groupes et lettres assignées)

Chaque groupe aura besoin d'installer un Environnement de Java sur l'ordinateur ils travailleront. Vous avez besoin de "Map a network drive" à:

\\KONSA\public

(Pour cet exemple nous allons imaginer que nous avons dressé le chemin "\\KONSA\public" à "d:\")

Ajoutez les lignes suivant à la fichier c:\autoexec.bat:

set PATH=%PATH%;d:\Java\jdk\bin

set CLASSPATH=%CLASSPATH%;d:\reseauxNeuronaux\code

("set PATH..." vous autorise à utiliser les programmes java.exe et javac.exe, "set CLASSPATH..." est exigé pour Java pour lire les bibliothèques préparé pour ce projet)

Créez un répertoire où vous travaillerez sur votre projet. Copiez la fichier "video.dat" du chemin:

\\KONSA\public\reseauxNeuronaux\code\esi\lettresdespace\video.dat

dans votre répertoire. Cette fichier contient la video que Professeur Manso a enregistré.

Suivant, nous allons écrire (avec un éditeur de votre choix), compile (javac TestApp.java) et exécute (java TestApp) le programme suivant:

// TestApp.java

import esi.lettresdespace.*;  

public class TestApp {
  public static void main(String args[]) {

    // Charge la video
    Video video = Video.charge("video.dat");

    // Cree un lecteur pour afficher la video 
    VideoLecteur lecteur = new VideoLecteurGraphique();

    int numCadres = video.getSize();

    // Passe tous les cadres dans le video 
    // (ca va prend trop de temps, type Ctrl-C a sortir)
    for (int i=0; i < numCadres; i++) {
      System.out.println("Affiche le cadre a index: " + i +
        " / " + numCadres);
      Cadre next = video.getCadreAt(i);

      // Affiche le cadre et attend reponse de l'utilisateur
      boolean reponse = lecteur.confirmCadre(next);
      if (reponse == true) {
        System.out.println("Je vais accepter ce cadre comme " +
          "la lettre lequel nous cherchons");
      }
    }
  System.exit(0);
  }
}

Clairement, il ne vaut pas l'effort d'envisager chaque cadre manuellement pour chercher un message d'espace. Nous aimerions créer un réseau neuronaux qui peut traverser tous les cadres dans la video pour chercher une lettre spécifiée.

Vous aurez besoin de faire des enchantillons de vos lettres pour le former le réseau. Dans le dossier:

\\KONSA\public\reseauxNeuronaux\code\esi\lettresdespace\fichiers

Vous allez trouver trois fichiers: une est la grande liste avec un énchantillon pour chaque lettre ("toutesLettres.dat"), et les autres deux sont pour former un reseau qui peux reconnaitre la lettre A: "lettreA.dat" contient les énchantillons positifs, et "toutesLettresSansA.dat" contient les autres lettres que nous utilisons comme les énchantillons negatifs quand nous formons le reseau.

Il faut que vous faisez quatre fichiers dans votre répertoire: deux avec 5-10 énchantillons pour chaque lettre lequel vous cherchez, et les autres deux avec une énchantillons negatif pour tous les autres lettre que vous ne cherchez pas. Par example, si vous cherchez les lettres B et Z, vous créerez une fichier qui s'appelle "lettreB.dat" avec 5-10 énchantillons de la lettre B, et une autre fichier qui s'appelle "lettreZ.dat" avec 5-10 énchantillons de la lettre Z. Maintenant, pour la lettre B, il faut creer une fichier avec un exemple pour toutes les autres exceptent B - copie "toutesLettres.dat" à "toutesLettresSansB.dat" et enleve l'énchantillon de la lettre B. Faisez la même chose pour la lettre Z pour créer "toutesLettresSansZ.dat".

Remarquez:

Il y a quelques lettres qui sont semblable dans apparence. Par exemple, la lettre I est semblable à lettre J. Si vous cherchez la lettre I, ce sera utile à ajouter quelque exemple négatif supplémentaire pour J quand vous formez le reseau. C'est facile de faire - seulement ajoutez un ou deux plus d'échantillons de la lettre J à la fichier "toutesLettresSansI.dat".

Des autres lettres qui sont semblable:

P,R

O,Q

I,J,T,!

E,F

U,V

(C'est possible que vous puissiez penser à quelques-uns autres).

À ce point, nous avons créé tous les fichiers que nous aurons besoin d'écrire notre programme.

Stratégie de base pour écrire le programme

  1. Cette section essaie de vous donner une idée de base ce qui est exigé pour écrire un programme qui travers la vidéo et trouve les indexes pour une de vos lettres. Pour les détails techniques (quelles fonctionnes pour appeler etc. . ) vous devez lire la documentation de l'API (voyez la section des Ressources au-dessous).
  2. Chargez la video de la fichier que vous avez copié dans votre répertoire.
  3. Créez un reseau - la dimension de la couche de l'entrée sera 8x8=64, et la dimension pour la couche de la sortie sera 1. Vous pouvez decider combien des couche intermediares et combien des noeuds - si il n'y a pas assez de noeuds, le réseau ne sera pas capable de distinguer votre lettre. Si il y a trop de couches et noeuds, il prendra trop de temp pour former le réseau et c'est possible que le réseau ne soit pas capable de généraliser des entrées bruyantes.
  4. Chargez les énchantillons positifs et ajoute ces cadres à un vecteur pour les entrées (par exemple, de "lettreA.dat")
  5. Chargez les énchantillons negatifs et ajoute ces cadres au vecteur pour les entrées (par exemple, de "toutesLettresSansA.dat")
  6. Créez un vecteur avec les sorties où chaque sortie correspond au vecteur nous voulons le réseau à produire pour chaque échantillon de l'entrée (chaque sortie sera un vecteur avec une dimension d'une si il y a un noeuds dans la couche de la sortie). Par exemple (si nous formons le réseau pour la lettre A) - pour chaque échantillon qui répresente la lettre A, nous voulons avoir un vecteur correspondant pour la sortie avec 1.0. Pour toutes les autres énchantillons, nous voulons créer un vecteur avec 0.0.
  7. Formez le réseau - remarque que cela peut prendre milliers d'itérations (peut-être même dizaines de milliers).
  8. Créez un lecteur pour regarder les cadres dans la video
  9. Répète à travers la vidéo, en utilisant le réseau compétent pour tester si chaque cadre ressemble à la lettre pour que nous cherchons
  10. Si le réseau pense qu'un cadre ressemble à notre lettre, affichez la lettre, et si c'est une de nos lettres en fait, enregistrez l'index à qu'il se produit dans la vidéo.
  11. Créez une liste avec tous les index pour la lettre.

Ressources

Initiation aux Réseaux Neuronaux index (HTML pour toutes les classes est ici): index.html

Java classes utilisé pour le projet:

Remarquez: pour utiliser une classe d'une de ces packages dans votre programme, il faut "import" le package. Par exemple, pour utiliser la classe Cadre, ecrivez (au debut de votre programme):

import esi.lettresdespace.Cadre;

pour utiliser toutes les classes dans un package, ecrivez:

import esi.lettresdespace.*;

La documentation pour toutes ces classes est à:

reseauxNeuronaux\api\overview-summary.html

La documentation pour les autres bibiothèques JAVA est à:

\\KANSO\public\Java\jdk\docs\api\index.html

Les exigences

Ensemble, la classe a besoin de réunir les lettres (si en) voir s'il y a un message d'espace

(Chaque groupe a besoin de contribuer la séquence à qu'ils ont trouvé leurs lettres)

Email/Print le programme que vous avez ecrit pour chercher vos lettres.

Les Groupes

26-3+4 = 27 lettres (Toutes lettres majiscules sans A, J, et Y, + '_' + ''' + ',' + '!')

E310 - _,B

E311 - C,D

E312 - E,F

E313 - G,H

E314 - I,!

E315 - K,L

E316 - M,N

E317 - O,P

E318 - Q,R

E320 - S,T

E321 - U,V

E322 - W,X

E323 - _,Z

E324 - U,'

E325 - V,_

E326 - T,!

E327 - M,'

E328 - I,Z

Remarquez: la lettre A est ma contribution - il a lieu dix fois dans la video. Les index sont:

A= {1635, 3433, 7824, 8212, 8777, 12933, 15561, 16709, 17840, 19505}

Un Challenge

Après que chaque groupe ait trouvé les index pour chacun de leurs lettres, c'est nécessaire d'arranger les lettres pour former le message. C'est possible de faire ceci à la main, cependant c'est beaucoup plus intéressant (et plus vite!) pour arranger les lettres avec un programme simple. Ici est l'idée de base pour le programme:

Créez un class pour entreposer le char de la lettre et l'index. Par example:

class LettreDeLaMessage {

char lettre;

int index;

}

Si tous les groupes ont fait leur travail, vous devriez avoir une liste des index pour chaque lettre. (eg. A=

Pour chaque lettre, créez une liste des LettreDeLaMessage - un object pour chaque index.

Mettez toutes les object (LettreDeLaMessages) ensemble dans un Vector, et les sortez utiliser la valeur de l'index.

Finalement, traversez le vecteur assorti et imprimez l'ombre pour chaque objet LettreDeLaMessage