如何使用AForge,标准化DistanceHistograms和神经网络进行形状识别?

时间:2015-01-27 22:20:48

标签: c# neural-network shape image-recognition aforge

我正在尝试学习神经网络,并尝试使用距离直方图在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不会太可靠,但它是一个开始。

我真的希望有人可以指出我正确的方向,并帮助我开始,因为这显然不起作用。

0 个答案:

没有答案