[英]Converting image into CvMat in OpenCV for training neural network
我正在编写一个使用OpenCv神经网络模块以及C#和OpenCvSharp库的程序。 它必须识别用户的面孔,因此为了训练网络,我需要一组样本。 问题是如何将样本图像转换为适合训练的阵列。 我得到的是200x200 BitMap图像,以及具有40000个输入神经元,200个隐藏神经元和一个输出的网络:
CvMat layerSizes = Cv.CreateMat(3, 1, MatrixType.S32C1);
layerSizes[0, 0] = 40000;
layerSizes[1, 0] = 200;
layerSizes[2, 0] = 1;
Network = new CvANN_MLP(layerSizes,MLPActivationFunc.SigmoidSym,0.6,1);
所以然后我试图将BitMap图像转换为CvMat数组:
private void getTrainingMat(int cell_count, CvMat trainMAt, CvMat responses)
{
CvMat res = Cv.CreateMat(cell_count, 10, MatrixType.F32C1);//10 is a number of samples
responses = Cv.CreateMat(10, 1, MatrixType.F32C1);//array of supposed outputs
int counter = 0;
foreach (Bitmap b in trainSet)
{
IplImage img = BitmapConverter.ToIplImage(b);
Mat imgMat = new Mat(img);
for (int i=0;i<imgMat.Height;i++)
{
for (int j = 0; j < imgMat.Width; j++)
{
int val =imgMat.Get<int>(i, j);
res[counter, 0] = imgMat.Get<int>(i, j);
}
responses[i, 0] = 1;
}
trainMAt = res;
}
}
然后,在尝试对其进行训练时,我遇到了以下异常:
输入的训练数据应为浮点矩阵,其行数等于训练样本数,列数等于第0(输入)层的大小
培训代码:
trainMAt = Cv.CreateMat(inp_layer_size, 10, MatrixType.F32C1);
responses = Cv.CreateMat(inp_layer_size, 1, MatrixType.F32C1);
getTrainingMat(inp_layer_size, trainMAt, responses);
Network.Train(trainMAt, responses, new CvMat(),null, Parameters);
我是OpenCV的新手,我认为由于缺乏对CvMat结构的了解,在转换时做错了一些事情。 我的错误在哪里,还有其他转换位图的方法吗?
行数等于训练样本数
那是10个样本。
并且列数等于第0(输入)层的大小
那是inp_layer_size。
trainMAt = Cv.CreateMat(10, inp_layer_size, MatrixType.F32C1);
responses = Cv.CreateMat(10, 1, MatrixType.F32C1); // 10 labels for 10 samples
我主要使用C ++,所以如果我误会我,请原谅我,但您的像素循环还需要进行调整。
当您分配给val
,您的内部循环看起来val
,但是从不使用它,也从不增加您的计数器。
另外,在您的外循环中,分配trainMAt = res;
因为每个图像似乎都不是一个好主意。
我确信您可以使它正常运行,只需记住以下事实:目标是将每个图像展平为一行,因此最终inp_layer_size
10行和inp_layer_size
列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.