我正在尝试学习神经网络,并尝试使用距离直方图在C#和AForge中实现一个简单的形状识别算法,该距离直方图归一化为0到100之间的值。
骨骼形状的距离直方图如下所示:
int[] boneHistogram = 77, 38, 30, 27, 25, 22, 22, 22, 22,
20, 21, 20, 13, 11, 14, 13, 14, 13, 16, 16, 17, 27, 28, 34, 41, 46, 58, 100, 65, 0,
我计算了它,如第41页所述:http://www.ai.rug.nl/~mwiering/ObjectRecognition.pdf
现在我制作了几个直方图。结果如下:
int[]bone2Histogram = 63, 39, 27, 25, 20, 22, 20, 18, 19,
22, 16, 21, 17, 20, 19, 20, 20, 14, 21, 16, 20, 19, 27, 44, 42, 56, 70, 100, 64, 0
int[] bone3Histogram = 62, 46, 33, 27, 24, 22, 23, 19, 22,
20, 19, 19, 19, 18, 19, 20, 16, 19, 17, 22, 16, 25, 31, 35, 48, 52, 66, 100, 60, 0
依此类推,直到我有8个直方图。 Nect我创建了一个输入数组:
double[][] input = new double[8][];
我把每个上面的直方图值放到一个数组中,这样输入[0]对应于直方图1,输入[1]对应直方图2 ......
第一个问题我有:我真的不明白如何在这里使用输出值。我知道输出数组必须与输入数组的大小相同,所以我这样创建它:
double[][] output = new double[input.Length][];
现在输出[1] .Length需要像30个单元格一样,还是与一个单元格一起工作?我需要把什么放进那些细胞?我是否需要在输入中输入与输入相同的值,或者使用1表示true,0表示false(如果相应的输入直方图是假形状)?
我尝试应用此处描述的内容Neural Network OCR [^],但它对我没有帮助
第二个问题 我的网络看起来像这样:
AForge.Neuro.ActivationNetwork network = new AForge.Neuro.ActivationNetwork(
new SigmoidFunction(2),
30, // two inputs in the network
30, // two neurons in the first layer
1); // one neuron in the second layer
network.Randomize();
AForge.Neuro.Learning.BackPropagationLearning teacher = new BackPropagationLearning(network);
int count = 0;
double error = 1;
// loop
do
{
error = 0;
// run epoch of learning procedure
error = teacher.RunEpoch(input, output);
//Debug.Log(error);
// check error value to see if we need to stop
count++;
if(count >= 2000) break;
} while (error > 0.01);
然后我尝试计算不同的形状(比如将它与输入骨骼的值进行比较)
double[] boneShape = new double[] { 77, 38, 30, 27, 25, 22, 22, 22, 22, 20, 21, 20, 13, 11, 14, 13, 14, 13, 16, 16, 17, 27, 28, 34, 41, 46, 58, 100, 65, 0 };
double[] resultBone = network.Compute(boneShape);
double[] randomValues = new double[] { 14, 3, 0, 3, 40, 50, 93, 0, 34, 8, 5, 6, 10, 1, 33, 70, 80, 0, 12, 5, 3, 33, 77, 40, 3, 2, 3, 0, 3, 20 };
double[] test = network.Compute(randomValues);
我只是得到错误的答案,具体取决于我上面的设置。我想要的是0到1之间的值。值越低越好(比如0表示100%确定它是等效的形状,1表示完全不同的形状)
神经网络是解决此类问题的正确方法吗? DistanceHistograms不会太可靠,但它是一个开始。
我真的希望有人可以指出我正确的方向,并帮助我开始,因为这显然不起作用。