我是图像处理方面的新手,我的第一个任务是制作一个可以识别人脸及其名称的工作程序。到目前为止,我成功地制作了一个项目来检测,裁剪检测到的图像,使其成为 sobel 并将其转换为浮点数组。但是,我很困惑如何实现反向传播 MLP 来学习图像,以便它可以识别检测到的人脸的正确名称。
stackoverflow 的所有专家都非常荣幸能够给我一些示例,如何实现要通过反向传播学习的 Image 数组。
我是图像处理方面的新手,我的第一个任务是制作一个可以识别人脸及其名称的工作程序。到目前为止,我成功地制作了一个项目来检测,裁剪检测到的图像,使其成为 sobel 并将其转换为浮点数组。但是,我很困惑如何实现反向传播 MLP 来学习图像,以便它可以识别检测到的人脸的正确名称。
stackoverflow 的所有专家都非常荣幸能够给我一些示例,如何实现要通过反向传播学习的 Image 数组。
它是标准的机器学习算法。您有许多浮点数组(ML 中的实例或统计术语中的观察)和相应的名称(标签、类标签),每个数组一个。这足以用于大多数 ML 算法。特别是在 ANN 中,数组的元素(即特征)是网络的输入,标签(名称)是其输出。
如果您正在寻找反向传播的理论描述,请查看斯坦福的 ml-class 讲座(ANN 部分)。如果您需要现成的实施,请阅读此问题。
您尚未指定数组的元素是什么。如果您只使用原始图像的像素,这应该可以工作,但效果不是很好。如果您需要生产级系统(尽管仍然使用 ANN),请尝试提取更多高级特征(例如,OpenCV 使用的类似 Haar 的特征)。
您是否尝试过将特征向量写入arff文件并将它们提供给weka,只是为了看看您的方法是否可行?Weka 集成了很多分类器,包括 MLP。据我所知,我怀疑您选择的功能和分类器不起作用。
对于您最初的问题:您是否尝试过自己实现神经网络?如果是这样,你卡在哪里了?请注意,这里不是向观众请求完整工作实施的地方。
为一般问题提供一般答案:通常您在 MLP 中有节点。特别是输入节点、输出节点和隐藏节点。这些节点严格按层组织。底部的输入层,顶部的输出层,中间的隐藏层。节点以简单的前馈方式连接(仅允许输出连接到下一个更高层)。然后,您将每个节点连接float
到单个输入节点,并将特征向量提供给您的网络。对于反向传播,您需要提供为输出节点指定的错误信号。因此,如果您有n
要区分的名称,则可以使用n
输出节点(即每个名称一个)。例如,让它们1
在匹配的情况下返回,并且0
别的。您可以很好地使用一个输出节点并让它返回n
不同的名称值。也许最好使用n
完全不同的感知器,即每个名称一个,以避免一些副作用(灾难性干扰)。
请注意,每个节点的输出是一个数字,而不是一个名称。因此,您需要使用某种阈值来获得数字名称关系。另请注意,您需要大量训练数据来训练大型网络(即遵守维度诅咒)。知道float
数组的大小会很有趣。实际上,对于复杂的决策,您可能需要更多的隐藏节点甚至隐藏层。进一步注意,您可能需要进行大量评估(即交叉验证)才能找到最佳配置(层数、每层节点数),或者甚至找到任何工作配置。
祝你好运,无论如何!