如何训练单一物体识别?
我在想做一个小项目,目的是用某种机器学习方法来识别简单的二维物体。我觉得最好是每个网络只专注于识别一种类型的物体。所以我有两个问题:
我应该用什么样的网络呢?我想到的有两个可能的选择,一个是简单的前馈网络,另一个是霍普菲尔德网络。不过因为我还想知道输入和目标之间的相似程度,所以霍普菲尔德网络可能不太合适。
如果我使用需要监督学习的方法,并且只想要一个输出单元来表示输入和目标的相似程度,那么在训练过程中我应该给它哪些反例呢?光给它正例我觉得肯定不行(网络会学会总是说‘是’)。
这些图像将是低分辨率的黑白图。
2 个回答
可以试试 FindObject,看看你是否喜欢用 OpenCV 进行物体检测,这里用的是特征检测和描述。如果觉得这个方法不错,你可以试试opencv包里包含的find_obj.py示例。
不过我觉得这个示例有点让人困惑,因为我对相关的基本概念不太熟悉。所以我做了一个更简单明了的示例,详细解释了一些内容,并指出了一些常见的误区。如果你想了解,可以去 github上看看。
首先,关于选择分类方法有一点要说明。如果你打算直接用图片的像素作为特征,那么神经网络可能是一个合适的分类方法。在这种情况下,我觉得训练同一个网络来区分不同的物体会比为每个物体使用一个单独的网络更好,因为这样可以让网络更专注于最能区分的特征。
不过,如果你打算从图片中提取一些合成特征,并根据这些特征进行分类,我建议考虑其他的分类方法,比如支持向量机(SVM)。原因是神经网络通常需要设置很多参数(比如网络的大小和结构),这会让构建分类器的过程变得更长、更复杂。
具体来说,关于你提到的神经网络相关问题,我建议使用前馈网络,这种网络相对容易构建和训练,并且可以使用softmax输出层,这样可以给不同的类别分配概率。如果你使用的是一个单一的网络进行分类,那么关于负样本的问题就不太相关了;对于每个类别,其他类别就是它的负样本。如果你决定使用不同的网络,你可以使用相同的反例(也就是其他类别),但一般来说,我建议每个正样本展示不超过2到10个负样本。
编辑:根据下面的评论,似乎问题在于如何判断一幅给定的图像(画作)与某个概念的契合度,比如用户提供的树的画作与树的相似程度。
在这种情况下,我建议采用一种截然不同的方法:从每幅画中提取视觉特征,并基于所有过去用户提供的画作及其分类进行K近邻分类(可能还加上你自己生成的一组预定义样本)。你可以通过与同类样本的距离来评分相似度,或者通过最近匹配的类别分布来评分。
我知道这可能不是你所问的,但我觉得这是一种更简单、更直接的方法,特别是考虑到样本和类别的数量预计会不断增加。