CREATION ARTIFICIELLE PAR CONNECVOLUTION

 

Auteur: Michel Bret, juin 2007

Matériel : PC , système Windows XP,1Go de mémoire, processeur à 3Gh minimum

carte graphique GeFORCE4 64Mo minimum

Logiciel : anyflo version 9.1

 

1 Contenu

 

Exécutables :

anyflo.exe : Anyflo version 9.1 de juin 2007.

cjpeg.exe, djpeg.exe : Lecture écriture d’images en format jpg

*.h : fichiers de lancement

*.dll : link dynamique

images.js : script java de lancement

dossier env contenant les fichiers *.h de configuration

dossier uti contenant :

images.fon : fichier source écrit en langage anyflo

CON_fra et CON_eng : interfaces française et anglaise

            D’autres langues peuvent être ajoutées (il suffit de créer un fichier CON_xxx, une entrée case « xxx » : dans la fonction OPT_CON() et préciser xxx à la place de far dans le fichier images.js ).

*.jpg, *.bmp : images

*.par : paramètres

*.res : réseaux neuronaux.

Dossier ima contenant les images xxxx.bmp (voir g et G).

 

2 Principe

 

2-1 Système de création artificielle

 

Je propose une méthode de construction d’un système de création artificielle qui observe son environnement en catégorisant ses perceptions à l’aide d’apprentissages non supervisés. Ainsi à chaque perception correspond un certain état d’une mémoire associative. Si l’on code ces états comme une population de génomes, il est possible de leur appliquer une évolution darwinienne (par des algorithmes génétiques) visant à favoriser ceux qui répondent le mieux à une certaine fonction d’évaluation. Une façon de les noter serait de noter l’image (qui n’existe pas) lui correspondant, ce qui suppose que soit trouvée une méthode de « remontée » du réseau. Pour cela on peut utiliser un apprentissage supervisé sur le réseau inverse (obtenu en permutant les entrées et les sorties), les couples d’apprentissages étant les couples inverses (état, expérience) du premier apprentissage. Ainsi à tout nouvel état obtenu par croisement de deux états correspond une nouvelle image qu’il suffit alors d’évaluer.

J’ai réalisé une application artistique en proposant en entrée de réseaux neuronaux de très nombreuses images, lesquelles génèrent une population d’états dont les enfants donnent, en remontant le réseau, une infinité de nouvelles images. Une expérimentation analogue pourrait être tentée avec de la musique.

 

2-2 Rêves artificiels

 

Résumons ce que Damasio appelle le proto-soi : un organisme est cartographié dans son cerveau, un objet (réel ou remémoré) interagissant avec lui y est également cartographié : il s’agit de cartographies du premier ordre qui sont des configurations neuronales (ou images mentales). Les changements de ces cartes donnent lieu à d’autres cartographies, du second ordre, représentant la relation entre l’objet et l’organisme. Il y a production de conscience-noyau chaque fois qu'un objet interagit avec l'organisme en modifiant le proto-soi et en construisant de nouvelles connaissances. Les informations neuronales correspondantes peuvent devenir des images, représentées à leur tour dans des cartes de second ordre donnant naissance à des sentiments. Être conscient, c'est être capable de se représenter certaines de ses représentations.

La conscience-noyau résulte du flux des impulsions provoquées par les interactions avec les objets : objets du monde réel, mais aussi perceptions de l'état du corps, et encore évocations d’images mentales mémorisées (objets pensés).
Le soi-central apparaît dès qu'un objet modifie le proto-soi. Au-delà du soi-central, nous trouverons le soi-autobiographique, constitué de souvenirs implicites d'expériences antérieures, des prévisions simulées de ce qui peut se produire compte tenu de ces expériences passées et des états actuels du corps (souvenirs du futur). Le soi-autobiographique se développe ensuite en la conscience étendue lors d’interactions sociales avec d'autres organismes.

Je propose de faire rêver un être artificiel en simulant ces différents niveaux de conscience : des configurations neuronales du premier ordre cartographieront, sous forme d’images mentales, la perception d’images réelles (proto-soi). Un changement de ces cartes par évolution génétique sera une représentation, au second ordre, de la relation entre les images et l’organisme (conscience noyau), qui produira de nouvelles images mentales. Par un processus inverse (allant du mental au réel) l’organisme pourra alors interagir socialement avec d’autres organismes pour, peut-être, atteindre un degré de conscience plus élevé.

2-3 Conception du système

 

Une rétine, sur laquelle viennent s’inscrire des images, se projette sur la couche d’entrée d’un réseau neuronal. L’activation neuronale se propage jusqu’à la couche de sortie qui est interprétée comme un code. En fait plusieurs réseaux sont utilisés : 3 pour chacune des composantes rouge, verte et bleue de la couleur, et un quatrième prenant en entrée des informations géométriques (à partir d’extractions de contours). Plusieurs couples (image,code) sont présentées aux réseaux qui s’auto configurent au cours d’apprentissages.

Ces 4 populations de codes sont traitées par des algorithmes génétiques qui les croisent et les mutent en optimisant certaines fonctions d’adaptation (comme la convergence des luminances ou des distributions de contours).

On définit 4 réseaux inverses obtenus en permutant les entrées et les sorties des réseaux d’origine. Remarquons que leurs topologies ont changées (nombre différents de neurones sur les couches) et qu’il faut donc les redéfinir. Il faut aussi les reconfigurer par les apprentissages dont les couples sont les inverses (code,image) des couples (image,code) utilisés dans les apprentissages des réseaux directs.

Chaque nouveau code obtenu par croisement génère une nouvelle image en remontant les réseaux inverses.

Ces nouvelles images peuvent être intégrées à l’ensemble des images vues par le système et faire partie des couples de nouveaux apprentissages.

Le système peut ainsi fonctionner indéfiniment en générant sans cesse de nouvelles images.

 

3 Utilisation

 

3-1 Lancement

 

Cliquer sur images.js

Un menu apparaît :

CON HEL VER EXP IMA GEN RES PAR CRO AFI AFG . GAR . EXIT DEB

HEL : donne le help général

VER : mode verbose (des messages s’affichent en haut de l’écran à chaque action)

EXP : explications

IMA : gestion des images

GEN : gestion des génotypes

RES : réseaux neuronaux

PAR : paramètres

CRO : croisement de génotypes

AFI : affichage des images

AFG : affichage des génotypes

EXIT : quitter le programme

DEB : debuging

Cliquer sur l’un de ces items affiche le menu correspondant en dessous du menu principal. Chacun de ces menus contient une case HEL donnant le help particulier pour ce menu

 

3-2 Description des cases du menu principal

 

3-2-1 HEL

 

Affiche le help général.

 

3-2-2 VER

 

Mode verbose (des messages s’affichent en haut de l’écran à chaque action).

 

3-2-3 EXP

 

Menu des explications :

*    IMAGES    RESEAUX    CODES    ALGO_GENE    NOUV_IMA    NOUV_IMA

IMAGES : Deux images de base apparaissent à gauche

RESEAUX : Un réseau multi couches apparaît avec :

une couche d’entrée (en rouge) connectée aux pixels de la rétine

une couche cachée (en gris)

une couche de sortie (en vert) connectée aux codes

la matrice des poids synaptiques

CODES : Chaque image donne lieu à un code à travers le réseau

ALGO GENE : Cliquer dans le cadre gris croise les deux codes et construit un nouveau code

NOUV IMA : Le réseau inverse (obtenu en échangeant les entrées et les sorties du 1er réseau) apparaît avec sa matrice de poids synaptiques. Cliquer dans le cadre gris croise les deux codes et construit un nouveau code qui, par remontée du réseau inverse, construit une nouvelle image.

NOUV IMA : Même opération pour un autre croisement.

 

3-2-4 IMA

 

Menu des images :

IMA HEL LIR GAR NUM ALE VAL SUP INI

HEL : donne le help de ce menu

LIR :                                          

La liste des noms des images présentes apparaît à droite, cliquer sur l’un d’eux charge l’image et l’affiche à gauche, s’il y en a trop augmenter le nombre d’images par lignes sur l’échelle nb.

Changer l’extension en cliquant sur jpg ou bmp.

Changer de dossier en cliquant sur son nom

GAR : non implémenté

NUM : Les numéros des images sont affichés

ALE : génère une image aléatoire

SUP : supprime la dernière image chargée

INI : supprime toutes les images chargées.

L’échelle nb permet de choisir le nombre d’images affichées par ligne

 

3-2-5 GEN

 

Menu des génotypes:

GEN HEL LIR GAR NUM ALE IMA SUP INI

HEL: donne le help de ce menu

LIR :

La liste des noms des fichiers *.gen des génotypes apparaît à droite, cliquer sur l’un d’eux le charge et l’affiche à gauche.

GAR : non implémenté

NUM : Les génotypes sont affichés numériquement

ALE : génère un génotype aléatoire

IMA : génére un génotype à partir d’une image préalablement cliquée (AFI pour les afficher)

SUP : supprime le dernier génotype

INI : supprime tous lesgénotypes.

 

3-2-6 RES

 

Menu des réseaux:

RES HEL MAT ACQ MOT LOI APP STO VOI BAS SEQ INV SUP INI

HEL: donne le help de ce menu

MAT : affiche la matrice des poids synaptiques

ACQ : début de construction

MOT : début de définition des motifs d’entrés

LOI : début de définition des lois de sortie

APP : lancement de l’apprentissage

STO : stopper l’apprentissage

VOI : visualisation du réseau, cliquer sur l’un des motifs, la loi correspondante est affichée.

BAS : bascule vers le réseau inverse

SEQ : parallélisation des apprentissages.

INV : construit et entraîne le réseau inverse.

SUP : supprime le dernier couple d’apprentissage.

INI : supprime tous les réseaux.

 

3-2-7 PAR

 

Menu des paramètres:

PAR HEL MUL KOH COM I->I I->G G->I G->G V->G GAR LIR

HEL: donne le help de ce menu

MUL : réseau de type multi couches

KOH : réseau de Kohonen

COM : réseau complètement connecté

I->I : entrée = images, sorties = images

I->G : entrée = images, sorties = génotypes

G->I : entrée = génotypes, sorties =images

G->G : entrée = génotypes, sorties = génotypes

V->G : entrée = voisins, sorties = génotypes

GAR :

La liste des noms des fichiers XXX.par des paramètres apparaît à droite, cliquer sur l’un d’eux écrit le fichier XXX.par ainsi que tous les réseaux présents en mémoire dans le fichier XXX.res.

LIR :

La liste des noms des fichiers XXX.par des paramètres apparaît à droite, cliquer sur l’un d’eux le lit, lit les réseaux XXX.res correspondants, ainsi que les images correspondantes.

L’échelle type mot permet de choisir le type des motifs d’entrée :

            : luminance

LP : luminance + paramètres

RVB : couleurs

RVBL : couleurs + paramètres

L’échelle rétine permet de choisir la taille de la rétine qui apparaît à droite (en blanc)

L’échelle sous_ima permet de choisir le nombre de partage de la rétine en sous images (en rouge)

L’échelle par permet de choisir la dimension des individus de la population des algorithmes génétiques.

L’échelle gen permet de choisir la taille des génotypes.

L’échelle luminance permet de choisir la luminance.

L’échelle cou permet de choisir la couleur des contours :

            <0 : automatique

            entre 0 et 1 : du noir au blanc.

L’échelle cont permet de choisir l’épaisseur des contours.

L’échelle cache permet de choisir le nombre de couches cachées des réseaux multi couches. 

 

3-2-8 CRO

 

Menu des croisements:

CRO HEL IT1 IT2 CRO CON ALE SEL TES SUI

HEL: donne le help de ce menu

IT1 : Cliquer sur un premier élément d’entrée, celui ci s’affiche à droite.

IT2 : Cliquer sur un deuxième élément d’entrée, celui ci s’affiche à droite.

CRO : lance les croisements sur ces deux éléments.

CON : lance les croisements sur des couples aléatoires d’éléments

SEL : lance le module d’algorithmes génétiques, choisir les éléments sur l’échelle num_ima

TES : mode pas à pas

SUI : image suivante du mode pas à pas

L’échelle inter permet de choisir le pas d’interpolation

L’échelle cont permet de choisir le type des contours :

* : pas de contour

CON : contours

PIX : pixels

L’échelle dim permet de choisir la dimension de l’image affichée lors des croisements :

1 : taille de la rétine

2 : taille des images affichées

3 : taille des images chargées (choisir la taille sur l’échelle gra).

L’échelle gra permet de choisir la taille des grandes images

Les échelles tran permettent de choisir les bornes de l’aléatoire des transparences.

L’échelle lisse permet de choisir l’épaiseur des contours.

L’échelle num_ima permet de choisir le numéro de l’élément traité par les génétiques :

            -1 : tous

            0 : aucun

            sinon le numéro cliqué

 

3-2-9 AFI

 

Affiche les images d’entrée

 

3-2-10 AFG

 

Affiche les génotypes de sortie

 

3-2-12 EXIT

 

Sort du programme.

 

3-2-13 DEB

 

Mode debugging.

 

3-3 Raccourcis clavier

 

h: donne le help général

g: gare l’image courante.

G: gare l’image obtenue par croisement.

            Les images sont garées dans les fichiers ima/xxxx.bmp, xxx est automatiquement incréménté. Le numéro xxxx est réinitialisé à 1 au lancement du programme. Pour l’initialiser à 100 passer l’option « num=100 ».

$ : mode verbose (comme VER)

q : quitte le programme (comme EXIT)

 

4 Exemples

 

4-1 Exemple transformant des images en codes

 

1) Commencer par définir le type du réseau dans le menu PAR :

cliquer sur I->G (images -> génotypes).

Cliquer sur RVBP de l’échelle type_mot (couleurs + paramètres).

2) Puis rentrer des images : IMA->LIR, cliquer sur des noms, les images chargées apparaissent à gauche, s’il y en a trop augmenter le nombre d’images par ligne sur l’échelle nb.

3) Puis définir autant de génotypes qu’il y a d’images en cliquant sur GEN->ALE

4) Saisir des couples d’apprentissage dans le menu RES :

            Cliquer sur RES->ACQ : un réseau est construit et apparaît à droite

            Cliquer sur RES->MOT puis sur des images qui sont chargées en entrée et apparaissent en haut et à droite

            Cliquer sur RES->GEN puis sur autant de génotypes qui sont chargées en sortiee et apparaissent en dessous

5) Entraîner le réseau en cliquant sur RES->APP :

            4 courbes d’erreur sont affichées en rouge, vert, bleu et jaune correspondant respectivement aux réseaux rouge, vert, bleu et paramètres,

ainsi que les valeurs des erreurs courantes (qui sont remplacées par noise en cas de réinitialisation automatique, lorsque l’erreur reste longtemps trop élevée).

            La case noise permet de bruiter les matrices des poids synaptiques.

            Deux échelles montrent l’évolution des constantes d’apprentissage (modifiables).

            Une échelle montre le maximum et le compteur des réinitialisations (modifiables).

            Il est possible de contrôler l’apprentissage en agissant sur ces échelles.

6) Stopper l’apprentissage, lorsque les erreurs sont suffisamment petites, en cliquant sur RES->STO.

7) Inverser le réseau en cliquant sur RES_>INV, ce qui provoque la construction et l’apprentissage du réseau inverse.

8) Pour voir les réseaux :

Cliquer sur RES_>VOI, puis sur un élément d’entrée, la sortie apparaît à droite.

Pour voir le réseau inverse cliquer sur RES->INV puis sur RES_>VOI, puis sur un élément d’entrée, la sortie apparaît à droite.

9) Croiser deux codes en cliquant sur CRO

            Cliquer sur CRO->IT1 puis sur une image, celle ci apparaît à droite.

            Cliquer sur CRO->IT2 puis sur une image, celle ci apparaît en dessous.

            Cliquer sur CRO->CRO, ce qui provoque des croisements interpolés entre ces 2 images (régler le pas d’interpolation sur l’échelle inter).

            Pour voir les images une par une, cliquer sur CRO->TES, puis successivement sur CRO->SUI.

            Pour faire apparaître les contours cliquer sur CONT de l’échelle cont.

            Pour faire apparaître les pixels cliquer sur PIX de l’échelle cont.

            Pour voir les images en grande dimension cliquer sur 3 de l’échelle dim. On peut changer la dimension en cliquant sur l’échelle gra, ces images apparaissent en bas et à gauche.

10) Croiser tous les codes en cliquant sur CRO->CON

11) Croiser aléatoirement tous les codes en cliquant sur CRO->ALE

12) Croiser en optimisant une fonction d’évaluation en cliquant sur CRO->SEL

            L’échelle mut permet de choisir le taux de mutation

            L’échelle num_ima permet de choisir le numéro de l’élément traité :

                        -1 : tous

                        0 : aucun

                        sinon le numéro cliqué

            Les bornes de la transparence aléatoire peuvent être changées :

                        Cliquer sur les deux échelles tran

13) Pour écrire les images croisées enfoncer la touche G .Ces images sont garées dans les fichiers ima/xxxx.bmp

 

4-2 Deuxième exemple transformant des voisinages en codes

 

5 Programmation

 

5-1 Fichiers source

 

Le fichier source images.fon, écrit en langage anyflo, se trouve dans le dossier uti ainsi que les fichier CON_fra et CON_eng correspondant aux interfaces française et anglaise.

 

5-2 Fonctions principales

 

Fonction principale images(w) :

            w est la liste des options passées entre « «  à la fonction OPT_CON(w) :

                        fra : français, le fichier CON_fra est lu

                        eng : anglais, le fichier CON_eng est lu

                        nom=nn, les images sont stockées dans les fichiers nnxxxx.bmp (ima/xxxx.bmp par défaut)

                        ext=xxx extension des images (bmp par défaut)

                        num=n, les images sont stockées à partir du numéro n (1 par défaut)

 

Fonction externes() : définit les externes, elle peut être déclarée en tête de chaque fonction

            #include « externes() »

 

Fonction OPT_CON(w) traitant les options

 

Fonction INI_CON(langue) faisant les initialisatu=ions

 

Fonction F0() appelée une seule fois en début d’interaction définissant les menus et les flags.

 

Fonction F5() appelée à chaque image :

Traitement du menu courant :

            Menu EXP appelle aff_EXP()

            Menu IMA

affiche les échelles nb et gra

lit éventuellement des images par lire_CON_IMA()

Menu GEN

            affiche l’échelle d

            lit éventuellement des génotypes par lire_CON_GEN()

Menu PAR : affiche, gare et lit éventuellement des paramètres

Menu CRO : croisements

Affichage éventuel des images et des génotypes

Affichage éventuel du help

Gare éventuellement les images croisées.

 

5-2 Fonctions des menus

 

La fonction set_CON() définit les menus d’après le fichier Con_langue chargé

 

Les fonctions du menu principal : CON_XXX()

 

Les fonctions du menu EXP

 

Les fonctions CON_IMA_XXX() du menu IMA

 

Les fonctions CON_GEN_XXX() du menu GEN

 

Les fonctions CON_RES_XXX() du menu RES

 

Les fonctions CON_PAR_XXX() du menu PAR

 

Les fonctions CON_CRO_XXX() du menu CRO

 

D’autres fonctions particulières à chaque menu existent aussi.

 

5-3 Les structures de données

 

5-3-1 Objets traités

 

Des images repérées par leurs numéros

            num+Inc_ORI : images originales (taille sur le disque)

            num +Inc_AFF: affichable de taille (D_IMA,D_IMA]

            num+Inc_RET : rétinienne de taille [Nb_S_IMA*(N_RET,N_RET)]

            num +Inc_GRA: grande de taille [D_GRA,D_GRA]

Elles peuvent être garées dans le dossier ima sous le non générique xxx.bmp. Leur nom peut être changé :

            Nom_Image= « ima/ 

Des réseaux neuronaux repérés par leurs numéros.

Des génétiques repérées par leurs numéros.

3 buffers Buf_GEN1, Buf_GEN2 et Buf_GEN3 stockant les génotypes.

 

5-3-2 Construction d’un réseau

 

Les motifs d’entrée sont :

            Des images si Type_Entree=IMA ou VOI

            Des génotypes si Type_Entree=GEN

            Des paramètres si Type_Entree=PAR

De même les lois de sortie sont :

            Des images si Type_Sortie=IMA ou VOI

            Des génotypes si Type_Sortie=GEN

            Des paramètres si Type_Sortie=PAR

meta input reseau(num)=Type_Entree

meta print reseau(num)=Type_Sortie

meta image reseau(num)=numéros des images en entrée

Lors de l’apprentissage :

            meta erreur reseau(num) contient la liste des erreurs récentes

            meta valider reseau(num) contient l’évaluation du réseau :

                        (nombre de passes, erreur, flag), sortie si flag=1

 

5-3-3 Construction d’une génétique

 

Les particules sont des chaînes de bits obtenus à partir de valeurs numériques v par la fonction gen_part(v)

La fonction d’adaptation est fonc_gen(g,num,p) qui retourne la moyenne de la particule p, elle peut être changée.

Une valeur numérique est donnée à partir d’une particule p par la fonction part_gen(p)

Croisement : selon le paramètre Type_CRO :

            CRO_SEL : croisement et mutation par les génétiques

            CRO_CRO : croisement simple des génotypes correspondant à 2 images définies par IT1 et IT2

            CRO_CON : croisement simple des génotypes correspondant à des images choisies aléatoirement

Dans tous les cas les 2 images de base sont mélangées après avoir été traitées par les lois paramétriques.

 

5-3-4 Remontée des réseaux

 

Croisements simples :

 

L’image rétinienne est copiée en Num_RET2 et passée en entrée du réseau direct qui délivre en sortie le génotype qu’il  stocke.

Lorsque l’on croise desu génotypes, le génotype obtenu est passé  en entrée du réseau inverse qui délivre en sortie la nouvelle image.

Pour MOT_L :

ima_gen_1() copie l’image rétinienne en Num_RET2 et stocke le génotype correspondant.

inv_ima_gen_1() passe le génotype en entrée du réseau inverse et trouve en sortie la nouvelle image.

Pour et MOT_L_P

            Mêmes opérations sur les réseaux des paramètres.

 

Pour MOT_RVB :

ima_gen_3()copie l’image rétinienne en Num_RET2 et stocke le génotype correspondant.

inv_ima_gen_3()passe le génotype en entrée du réseau inverse et trouve en sortie la nouvelle image.

Pour et MOT_RVB_P

            Mêmes opérations sur les réseaux des paramètres.

 

croisements et mutations par les génétiques

 

Les populations de codes et de paramètres sont régénérées à chaque image.

Chaque particule (individu d’une population) est un code qui est passés en entrée des réseaux inverses qui délivrent une première image.

S’il y a une génétique de paramètres (pour MOT_L_P et MOT_RVB_P), la particule correspondante, qui est un paramètre, est passée au réseau inverse, et donne des paramètres. Les parents de cette particule donnent de même 2 images que l’on mélange avec la première image et que l’on traite selon les paramètres.

 

Pour MOT_L et MOT_L_P :

Genetique_ima_gen_1()

Pour MOT_RVB et MOT_RVB_P

Genetique_ima_gen_3()