1

在我提出问题之前,先简单介绍一下我的项目:

  1. 我正在使用 OPENCV 的内置功能来检测 cam-feed 中的人脸。
  2. 之后,我正在处理包含面部的图像,即将其转换为灰度,将其调整为 40X40 像素并均衡其直方图。
  3. 然后读取图像的像素值、标准化(即除以 256,因为 FANN 使用 0 和 1 或 -1 和 1 之间的值,取决于使用的函数)并保存到 1600 个元素的数组中。这是神经网络使用的数据。根据数据,ANN 决定这张脸是我的、未知的还是根本不是一张脸(误报)。
  4. 然后神经网络返回一个包含 3 个元素的数组,程序通过找到最大值来决定人脸属于哪个组。

问题是,除了很好地检测误报之外,我的代码给出的结果相当不准确。

我的ANN的一些细节。我正在使用 doublefann.h。该网络包含 1600 个输入神经元(显然),3 个输出神经元(甚至更多),而单个隐藏层包含 1600 个神经元,尽管我确实尝试了 800-2400 范围内的其他值。我正在使用我的 20 个面部样本、30 个未知面部样本和 30 个随机背景样本进行训练。我尝试了 RPROP(FANN 中的默认值,似乎大部分时间都过拟合)和 QUICKPROP(在训练时提供了很好的、平滑地减少的误差,但结果不准确)训练算法,以及 SIGMOID_SYMMETRIC(训练完成得非常快,但通常以 MSE 突然下降到接近零值而告终,并且由此产生的网络是过拟合的)激活函数。我使用 MSE 和位失败值作为停止的标准。可悲的是,

所以我的问题是,考虑到我的项目的性质和它处理的数据,什么是最佳的:

  1. 隐藏神经元的数量
  2. 激活功能
  3. 训练算法
  4. 每组的训练样本数(有人说 20-30 就足够了)
  5. 停止标准

当然,欢迎任何建议,它不需要回答所有或任何五个问题。我知道我的问题是一个相当复杂的问题,但是我花了很多时间在圈子里跑,厌倦了阅读有关该主题的文献,并且非常感谢一些第一手的知识。

4

0 回答 0