From 0d23e95e643ffffd7e2f3788449c34de200e9ff9 Mon Sep 17 00:00:00 2001 From: gaillaro Date: Tue, 11 May 2004 17:59:02 +0000 Subject: precision degressif optimisation findcolorNN debut de poteaux --- 2004/i/nono/src/ovision/segmNN.cc | 183 ++++++++++++++++++++++++-------------- 1 file changed, 116 insertions(+), 67 deletions(-) (limited to '2004/i/nono/src/ovision/segmNN.cc') diff --git a/2004/i/nono/src/ovision/segmNN.cc b/2004/i/nono/src/ovision/segmNN.cc index 9d24922..afc4bd1 100644 --- a/2004/i/nono/src/ovision/segmNN.cc +++ b/2004/i/nono/src/ovision/segmNN.cc @@ -31,12 +31,17 @@ SegmNN::SegmNN(Img *img, OConfig *config) { /// Destructor SegmNN SegmNN::~SegmNN() { + delete [] node; + delete [] index; + delete [] freq; + delete [] tabSegm; } /// Affiche les poids du reseau de neurones (neural network : NN) -void SegmNN::ShowNodes() { - +void +SegmNN::ShowNodes() +{ // Affichage des poids du NN cout << "Poids:"; for(int i=0; inbNodeMax < nbOutput) { + if (config->nbNodeMax < nbOutput) + { cerr << "SegmNN::BuildNN : Nombre de nodes insuffisants dans le fichier poids\n"; - } - else { + } + else + { // Charge les poids du NN et l'index des couleurs delete [] node; node = new unsigned char[nbOutput*3]; @@ -70,7 +79,7 @@ void SegmNN::BuildNN(int nbOutput, int loadFromFile) { for (int i = 0; iindex[i]; freq = new unsigned int[nbOutput]; - } + } return; } @@ -86,23 +95,26 @@ void SegmNN::BuildNN(int nbOutput, int loadFromFile) { freq = new unsigned int[nbOutput]; - for(int i=0; i 220) node[i*3+j] = 220; - } - } - cout << "oooooo\n"; + } + } } /// Entraine un reseau de neurones -void SegmNN::TrainNN() { +void +SegmNN::TrainNN() +{ unsigned long pixelNum; unsigned char *tabData; @@ -113,58 +125,62 @@ void SegmNN::TrainNN() { config->colorMode = img->hsi*2 + img->yuv; config->groupColor = 0; - for(long i=0; inn_nil; i++) { + for(long i=0; inn_nil; i++) + { // On choisit un pixel au hasard pixelNum = (unsigned long)(img->nbPixels*(rand()/(RAND_MAX+1.0))); // Calcul des valeurs de sorties pour ce pixel - for(int j=0; jyuv && k==0) || (img->hsi && k==2)) output[j] += abs((int)(config->nn_influ_lum*node[j*3+k]-tabData[pixelNum*3+k])*abs(node[j*3+k]-tabData[pixelNum*3+k])); else output[j] += abs(node[j*3+k]-tabData[pixelNum*3+k])*abs(node[j*3+k]-tabData[pixelNum*3+k]); - } + } // On cherche la sortie ayant le plus haut niveau - if (output[j] < output[numOutputMax]) { + if (output[j] < output[numOutputMax]) numOutputMax = j; - } - } + } // Mis a jour des poids - for(int k=0; k<3; k++) { - node[numOutputMax*3+k] = - (unsigned char)((node[numOutputMax*3+k] + config->nn_sl*tabData[pixelNum*3+k])/(1+config->nn_sl)); - - // Recompense pour la sortie qui travaille - freq[numOutputMax]++; - - // Verification des noeuds inutiles - if ((i%300) == 299) + for(int k=0; k<3; k++) { - for (int k=0; k < nbOutput; k++) + node[numOutputMax*3+k] = + (unsigned char)((node[numOutputMax*3+k] + config->nn_sl*tabData[pixelNum*3+k])/(1+config->nn_sl)); + + // Recompense pour la sortie qui travaille + freq[numOutputMax]++; + + // Verification des noeuds inutiles + if ((i%300) == 299) { - if (freq[numOutputMax] < config->nn_lazy_threshold) + for (int k=0; k < nbOutput; k++) { - // Regeneration de nouveaux poids - for(int m=0; m<3; m++) { - // Attribution aléatoire des poids - node[numOutputMax*3+m] = (unsigned char) (255.0*rand()/(RAND_MAX+1.0)); - if (node[numOutputMax*3+m] < 30) node[numOutputMax*3+m] = 30; - else if (node[numOutputMax*3+m] > 220) node[numOutputMax*3+m] = 220; - } + if (freq[numOutputMax] < config->nn_lazy_threshold) + { + // Regeneration de nouveaux poids + for(int m=0; m<3; m++) + { + // Attribution aléatoire des poids + node[numOutputMax*3+m] = (unsigned char) (255.0*rand()/(RAND_MAX+1.0)); + if (node[numOutputMax*3+m] < 30) node[numOutputMax*3+m] = 30; + else if (node[numOutputMax*3+m] > 220) node[numOutputMax*3+m] = 220; + } + } + + // On remet le compteur a zero + freq[k] = 0; } - // On remet le compteur a zero - freq[k] = 0; } } - - } } } @@ -172,27 +188,43 @@ void SegmNN::TrainNN() { /// Renvoie le code de la couleur segmentee /// @param *x pointeur vers un tableau contenant une valeur RGB -unsigned char SegmNN::FindColorNN(unsigned char *x) { - +unsigned char +SegmNN::FindColorNN(unsigned char *x) +{ int numOutputMax=0; int output[nbOutput]; - int j; + int j,tmp; // Calcul des valeurs de sorties pour ce pixel - for(j=0; jyuv && k==0) || (img->hsi && k==2)) - output[j] += abs((int)(config->nn_influ_lum*node[j*3+k]-x[k])*abs(node[j*3+k]-x[k])); - else - output[j] += abs(node[j*3+k]-x[k])*abs(node[j*3+k]-x[k]); - } + if (img->yuv) + { + for(j=0; jnn_influ_lum*tmp*tmp)); + tmp = node[j*3+1]-x[1]; + output[j] += tmp*tmp; + tmp = node[j*3+2]-x[2]; + output[j] += tmp*tmp; + + // On selectionne la sortie ayant la plus grande valeur comme couleur + if (output[numOutputMax] > output[j]) + numOutputMax = j; + } + } + else { + for(j=0; j output[j]) { - numOutputMax = j; - } + for(int k=0; k<3; k++) + output[j] += abs(node[j*3+k]-x[k])*abs(node[j*3+k]-x[k]); + + // On selectionne la sortie ayant la plus grande valeur comme couleur + if (output[numOutputMax] > output[j]) + numOutputMax = j; + } } return numOutputMax; @@ -200,7 +232,8 @@ unsigned char SegmNN::FindColorNN(unsigned char *x) { /// Segmente l'image avec le reseau de neurones -void SegmNN::Segm() { +void SegmNN::Segm() +{ unsigned char* tabData = img->tabData; @@ -209,29 +242,45 @@ void SegmNN::Segm() { // Parcours de l'image pour la segmentation // On recupere l'index et non le numero de sortie du NN - for (unsigned long i=0; inbPixels; i++) { + for (unsigned long i=0; inbPixels; i++) + { tabSegm[i] = index[FindColorNN(tabData+i*3)]; - } + } } /// Segmente l'image pour une seule couleur uniquement et permet donc d'isoler un ficher /// @param numColor numero de la couleur a isoler -void SegmNN::Segm(int numColor) { +void +SegmNN::Segm(int numColor) +{ unsigned char* tabData = img->tabData; if (tabSegm) delete [] tabSegm; tabSegm = new unsigned char[img->nbPixels]; // Parcours de l'image pour la segmentation - for (unsigned long i=0; inbPixels; i++) { + for (unsigned long i=0; inbPixels; i++) + { if (FindColorNN(tabData+i*3) == numColor) tabSegm[i] = 1; else tabSegm[i] = 0; - } + } } + +/*void +SegmNN::InitCache () +{ + + +} +*/ + + /// Entraine plusieurs reseaux de neurones avec des parametres differents et crees les images associees -void SegmNN::TestNN() { +void +SegmNN::TestNN() +{ /* double sl[] = {0.01, 0.1, 1}; unsigned long nil[] = {100, 1000, 10000, 100000, 1000000}; -- cgit v1.2.3