summaryrefslogtreecommitdiff
path: root/2004/i/nono/src/ovision/segmNN.cc
diff options
context:
space:
mode:
Diffstat (limited to '2004/i/nono/src/ovision/segmNN.cc')
-rw-r--r--2004/i/nono/src/ovision/segmNN.cc183
1 files changed, 116 insertions, 67 deletions
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; i<nbOutput; i++)
@@ -49,17 +54,21 @@ void SegmNN::ShowNodes() {
/// @param nbOutput nombre de noeuds de la couche de sortie du NN
/// @param loadFromFile (GENERATE ou LOADFROMFILE) indique si les poids sont charges d'un fichier ou generes aleatoirement
-void SegmNN::BuildNN(int nbOutput, int loadFromFile) {
-
+void
+SegmNN::BuildNN(int nbOutput, int loadFromFile)
+{
SegmNN::nbOutput = nbOutput;
// Permet de charger les poids du NN depuis un fichier ou en les initialisant aleatoirement
- if (loadFromFile) {
+ if (loadFromFile)
+ {
// Verifie si le nombre de poids donne dans le fichier est suffisant
- if (config->nbNodeMax < 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; i<nbOutput; i++)
index[i] = config->index[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<nbOutput; i++) {
+ for(int i=0; i<nbOutput; i++)
+ {
index[i] = i;
freq[i] = 0;
- for(int j=0; j<3; j++) {
+ for(int j=0; j<3; j++)
+ {
// Attribution aléatoire des poids
node[i*3+j] = (unsigned char) (255.0*rand()/(RAND_MAX+1.0));
if (node[i*3+j] < 30) node[i*3+j] = 30;
else if (node[i*3+j] > 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; i<config->nn_nil; i++) {
+ for(long i=0; i<config->nn_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; j<nbOutput; j++) {
+ for(int j=0; j<nbOutput; j++)
+ {
output[j] = 0;
- for(int k=0; k<3; k++) {
+ for(int k=0; k<3; k++)
+ {
if ((img->yuv && 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; j<nbOutput; j++) {
- output[j] = 0;
-
- for(int k=0; k<3; k++) {
- if ((img->yuv && 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; j<nbOutput; j++)
+ {
+ // XXX Ne pas oublier de mettre abs si on ne calcule pas les carrés
+ tmp = node[j*3]-x[0];
+ output[j] = abs((int)(config->nn_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<nbOutput; j++)
+ {
+ output[j] = 0;
- // On selectionne la sortie ayant la plus grande valeur comme couleur
- if (output[numOutputMax] > 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; i<img->nbPixels; i++) {
+ for (unsigned long i=0; i<img->nbPixels; 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; i<img->nbPixels; i++) {
+ for (unsigned long i=0; i<img->nbPixels; 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};