[C++] Распознавание изображений на основе нейронной сетки

Starkark

Заблокирован
Сообщения
0
Симпатии
0
Баллы
0
Привет всем и вот сегодня я решил поделиться небольшой нароботкой по нейронным сеткам (если быть точным это не полноценная нейронная сеть ибо здесь нет алгоритма обучения но я думаю сделать тому кто сможет розобрать данный код не составит труда).
Основной кусок с небольшими коментами:
Код:

#include <iostream>
#include <cmath>

#include "tgaimage.h"

using namespace std;

//Собстна класс нейрона
class TNeuron{
public:
string name;
int weight;
int **input;
int **memory;
TNeuron(){
input = new int *[31];
for (int i = 0; i < 31; i++)
input = new int [31];
memory = new int *[31];
for (int i = 0; i < 31; i++)
memory = new int [31];
};
};

//Масив нейронов (по количеству символов алфавита)
TNeuron Neuro[32];

int main(int argc, char *argv[])
{
setlocale(LC_ALL, "Russian");

//LoadDatabase
TGAImage *img;
for(int i=0; i<32; i++ ){
string TempString(1,(char)((int)'А'+i));
Neuro.name = TempString;
Neuro.weight = 0;
cout << TempString << " neuro create" << endl;
img = new TGAImage();
img->LoadFromFile(("res//"+TempString+".tga").c_str());
for(int x=0; x<=30; x++ )
for(int y=0; y<=30; y++ ){
Neuro.memory[x][y] = round( ( (int)img->GetPoint(x,y).r+(int)img->GetPoint(x,y).g+(int)img->GetPoint(x,y).b )/3 );
}
delete img;
}

///////Загрузка анализируемого изображения
img = new TGAImage();
img->LoadFromFile("test.tga");
for(int i=0; i<32; i++ ){
for(int x=0; x<=30; x++ )
for(int y=0; y<=30; y++ ){
Neuro.input[x][y] = round( ( (int)img->GetPoint(x,y).r+(int)img->GetPoint(x,y).g+(int)img->GetPoint(x,y).b )/3 );
};
};
delete img;

int LMax=0;
int NMax=0;

//Вычисление самого тяжёлого нейрона
for(int i=0; i<32; i++ ){
for(int x=0; x<=30; x++ )
for(int y=0; y<=30; y++ ){
int memory = Neuro.memory[x][y];
int input = Neuro.input[x][y];

if ((abs(input-memory)<120)) //120 коеф
if (memory<250) Neuro.weight = Neuro.weight+1;
};

if (Neuro.weight>LMax) {
LMax = Neuro.weight;
NMax = i;
};
};
cout << "Нейрон с максимальным весом: " <<Neuro[NMax].name << endl;
return 0;
}