参考文献:
在opencv3中的机器学习算法 - denny402 - 博客园
关于opencv的感知网络ANN的层数设置_正在编程-CSDN博客
OpenCvSharp.ML.ANN_MLP 人工神经网络——多层感知器
经过几天的苦闷,调试,终于实现了opencvsharp ann的手写体识别,其与knn的区别记录如下:
knn的标签是一个整型量:如0,1,2---9
ann的标签是一个全部分类的概率,如2的标签为一个浮点型的向量。
0,0,1,0,0,0,0,0,0,0
向量的长度应为种类数。
标签矩阵应为MatType.CV_32FC1类型,示例如下:
Mat tmp0 = new Mat(Length, 1, MatType.CV_32FC1, data);
ann训练的主要源代码如下:
var ann = ANN_MLP.Create();
float[] t1 = { 400, 10,10} ;
Mat layerSizes = new Mat(3, 1, MatType.CV_32F, data:t1);
ann.SetLayerSizes(layerSizes);
ann.SetActivationFunction(ANN_MLP.ActivationFunctions.SigmoidSym, 1, 1);
ann.SetTrainMethod(ANN_MLP.TrainingMethods.BackProp, 0.001);
ann.Train(tTrainData, SampleTypes.RowSample, tTrainLabel);
ann.Save("ann.xml");
t1的参数分别为 像素数、中间层数、分类数
识别测试后,数据读取的方式如下:
for (int kj = 0; kj < 10; kj++)
{
var value1 = testPredict.Get<float>(ki, kj);
Console.Write(value1.ToString("0.0") + " ");
}
此处float和上文中提到的CV_32FC1类型相同。
几行简单的测试结果如下:
0.0 0.0 0.0 0.0 0.5 0.1 0.1 0.0 0.0 0.4
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0
0.0 0.0 0.0 0.0 0.1 0.0 0.0 0.1 0.1 0.9
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0
0.2 0.0 0.0 0.0 0.0 0.0 0.0 0.1 0.0 0.5
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0
从上可以看出,ANN可以实现概率输出,显然比knn强了n倍,具备较大的使用价值。