OpenCV Neural Networks
Hello
I have simple code:
float line0[] = { 1., 0.66666669, 0.66666669, 0.66666669, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.66666669, 0.66666669, 1, 1, 0.66666669, 0.66666669, 0.33333334, 0.33333334, 0.33333334, 0, 0, 0, 0.33333334, 0.33333334, 0.66666669, 0.66666669, 1, 0.66666669, 0.33333334, 0.33333334, 0, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.66666669, 0.66666669 };
float line1[] = { 0.66666669, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.66666669, 0.33333334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.33333334, 0.66666669, 0.33333334, 0., 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334 };
float line2[] = { 1., 1., 1., 1., 0.66666669, 0.66666669, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.66666669, 1., 1., 1., 1., 1., 0.66666669, 0.66666669, 0.33333334, 0.33333334,0, 0.33333334, 0.33333334, 0.66666669, 1., 1., 1., 1., 0.66666669, 0.66666669, 0.33333334, 0.33333334, 0, 0.33333334, 0.33333334, 0.66666669, 0.66666669, 1., 1. };
float line3[] = { 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0.33333334, 0., 0., 0.33333334 };
void fill( Mat& mat, int row, float* data, int size ) { for ( int nn = 0; nn < size; ++nn ) { mat.at< float >( row, nn ) = data[ nn ]; } }
void fill2( Mat & mat, int row, float val1, float val2 ) { mat.at< float >( row, 0 ) = val1; mat.at< float >( row, 1 ) = val2; }
int main( int argc, char** argv ) { Mat layer_sizes( 1, 3, CV_32SC1 ); assert( sizeof(line0) == sizeof(line1) && sizeof(line1) == sizeof(line2) && sizeof(line2) == sizeof(line3)); const int el_count = sizeof( line0 ) / sizeof( line0[ 0 ] ); layer_sizes.at<int>( 0 ) = el_count; layer_sizes.at<int>( 1 ) = el_count * 2; layer_sizes.at<int>( 2 ) = 2;
Mat input_mat( 4, el_count, CV_32FC1);
fill( input_mat, 0, line0, el_count );
fill( input_mat, 1, line1, el_count );
fill( input_mat, 2, line2, el_count );
fill( input_mat, 3, line3, el_count );
Mat output_mat( 4, 2, CV_32FC1);
fill2( output_mat, 0, 0., 1. );
fill2( output_mat, 1, 1., 0. );
fill2( output_mat, 2, 0., 1. );
fill2( output_mat, 3, 1., 0. );
Mat weights( 1, 4, CV_32FC1, Scalar::all(1) );
CvANN_MLP mlp( layer_sizes );
mlp.train( input_mat, output_mat, weights );
Mat pred_out;
Mat test_sample( 1, el_count, CV_32FC1 );
fill( test_sample, 0, line0, el_count );
mlp.predict( test_sample, pred_out );
cout << pred_out << endl;
fill( test_sample, 0, line1, el_count );
mlp.predict( test_sample, pred_out );
cout << pred_out << endl;
fill( test_sample, 0, line2, el_count );
mlp.predict( test_sample, pred_out );
cout << pred_out << endl;
fill( test_sample, 0, line3, el_count );
mlp.predict( test_sample, pred_out );
cout << pred_out << endl;
int t = 0;
}
At result I get: [1.4031053 ...