opencv# 4 ML ANN 手写体识别

参考文献:

在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倍,具备较大的使用价值。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

健忘的松鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值