Exemplo n.º 1
0
int main()
{
#define NUM 100000

	int ret = 0;
	unsigned v;
	double m, d, param[2], value[NUM];
	fmll_random * rnd = NULL;

	fmll_try;

		m = 14;
		param[0] = - sqrt(3 / m);
		param[1] = sqrt(3 / m);

		/* fmll_throw_null(rnd = fmll_random_init(FMLL_RANDOM_ALGORITHM_LCG, FMLL_RANDOM_DISTRIBUTION_NORMAL, -1, 1, 5, 20, 0, 0, 0, time(NULL))); */
		fmll_throw_null(rnd = fmll_random_init_default_seed(FMLL_RANDOM_ALGORITHM_LCG, FMLL_RANDOM_DISTRIBUTION_UNIFORM, param));

		for(v = 0, m = 0; v < NUM; v++)
		{
			value[v] = fmll_random_generate(rnd);
			m += value[v];
		}

		m /= NUM;

		for(v = 0, d = 0; v < NUM; v++)
			d += (value[v] - m) * (value[v] - m);

		d /= NUM;

		printf("m = %f\nd = %f\n", m, d);

	fmll_catch;

		ret = -1;

	fmll_finally;

	fmll_random_destroy(rnd);

	return ret;
}
Exemplo n.º 2
0
Mat  Kohonen::getFrame(Mat parFrame)
{
    int map_dim=2;//размерность карты
    unsigned N[map_dim];
    unsigned u, v, q, index_winner;
    N[0] = 7;//количество нейронов в каждом слое
    N[1] = 7;

    //определение константы для вывода каждого класса определенным цветом
    uint32_t A=1;
    for (int i=0;i<map_dim; i++)
    {
        A*=N[i];//подсчет общего числа нейрнов
    }
    A=0xFFFFFF/A;

    fmll_som * som;
    Mat resultFrame;
    resultFrame.create(parFrame.rows, parFrame.cols,CV_8UC3);
    Mat frameFromUnsigned;
    frameFromUnsigned.create(parFrame.rows, parFrame.cols,CV_32S);

    Vec3b pixel;
    double ** vec;
    //инициализация векторного пространства значениями яркости изображения
    vec = (double **) fmll_alloc(sizeof(double), 2, parFrame.rows * parFrame.cols, 3);
    som = fmll_som_load(somFilename.c_str(),& fmll_distance_euclid, & fmll_distance_euclid);
    for(v = 0, q = 0; v < parFrame.rows; v++)
    for(u = 0; u < parFrame.cols; u++, q++)
    {
        pixel=parFrame.at<Vec3b>(v,u);

        vec[q][0] = pixel[0] / 255.;
        vec[q][1] = pixel[1] / 255.;
        vec[q][2] = pixel[2] / 255.;
    }
    //загрузка карты из xml
    if(som == NULL)
    {
        fmll_random * rnd;
        double param[2];
        param[0] = 0;
        param[1] = 0.01;
        //инициализация датчика случайных чисел
        rnd = fmll_random_init(FMLL_RANDOM_ALGORITHM_LCG, FMLL_RANDOM_DISTRIBUTION_UNIFORM, param, time(NULL));
        //иницилизация нейронной карты
        som = fmll_som_init(N, map_dim, 3, & fmll_distance_euclid, & fmll_distance_euclid);//(1)расстояние между векторами, 2)расстояние между нейронами.(2)не исп.,т.к. алгоритм WTA)
        //иницилизация весов синапсов нейронов карты случайными числами
        fmll_som_weight_init_random(som, rnd);

        cout<<"don't load"<<endl;

            //обучение нейронной карты
            fmll_som_so_kohonen(som, (const double **) vec, parFrame.rows * parFrame.cols,
                                        0.3, & fmll_timing_next_beta_step_plus_0_1, 0.8, 0.002, & fmll_som_neighbor_wta);
            if (fmll_som_save(som,somFilename.c_str())!=0)
            {
                cout<<"Ошибка сохранения Som в Xml"<<endl;
            }
            fmll_random_destroy(rnd);
   }
            for(v = 0, q = 0; v < parFrame.rows; v++)
            {
                for(u = 0; u < parFrame.cols; u++, q++)
                {
                   index_winner = fmll_som_run(som, vec[q]);
                   uint32_t color=A*index_winner;
                   pixel[0]=0x0000FF&color;
                   pixel[1]=(0x00FF00&color)>>8;
                   pixel[2]=(0xFF0000&color)>>16;
                   //pixel[0] = som->w[index_winner][0];
                   //pixel[1] = som->w[index_winner][1];
                   //pixel[2] = som->w[index_winner][2];
                   resultFrame.at<Vec3b>(v,u)=pixel;
                   frameFromUnsigned.at<uint32_t>(v,u)=color;
                   //cout<<color<<" ";
                }
                 //cout<<endl;
             }
            fmll_free(vec);
    imshow( "kohonen", resultFrame );
    fmll_som_destroy(som);
    return frameFromUnsigned;
}