OpenCV结合SURF与神经网络

8
我希望能够从一张静态图片中识别出车辆(汽车、摩托车等)。我考虑使用SURF获取有用的关键点描述符,然后训练一个MLP(多层感知器)神经网络。但是我不知道神经网络的输入和输出应该是什么,以便我可以确定图像中车辆所在的位置(可能是在其周围画一个矩形)。我知道SURF可以返回图像中有用的关键点及其描述符(我已经做过这个),关键点有角度,每个关键点对应于一个64或128位的向量作为描述符。我不知道这些关键点到底是什么,以及它们如何作为神经网络的输入。我正在使用带有Python的OpenCV。我刚开始使用SURF和其他特征提取方法,任何与此相关的帮助都将非常有益。
3个回答

8
如果您使用冲浪特征,那么就意味着您将设置一个浮点集向量[128]或[64],具体取决于您的冲浪配置,然后设置神经网络如下:
- 创建一个包含模型的数据库:
-bikes
-cars
-autobus
-truck

-对于每种类型的物体,例如不同款式的汽车、自行车和卡车等,需要拍摄10张不同的照片,并从每张照片中提取出其SURF特征向量。
-每种类型的物体将在神经网络中代表一个物体类。
-car   ;object class 1 =binary representaation in 4 bits= 0 0 0 1
-bikes ;obejct class 2 =binary representaation in 4 bits= 0 0 1 0 
-truck ;obejct class 3 =binary representaation in 4 bits= 0 0 1 1
-ball  ;obejct class 4 =binary representaation in 4 bits= 0 1 0 0

-二进制表示中的每个位都将对应于网络输出层中的一个神经元,并代表要识别的一个物体类别 -现在,神经网络的配置将基于特征向量的大小和您想要以此识别的对象类型的数量; -输入层中的神经元数为64或128,具体取决于您配置和使用的surf特征向量的大小 -神经网络输出层中的神经元数将是您想要识别的对象类别数,在此示例中为4 -每个神经元所需的激活函数是sigmoid或tanh函数(http://www.learnartificialneuralnetworks.com/),因为surf特征由浮点数表示,如果您使用freak特征或其他二进制本地特征描述符(Brisk、ORB、BRief),则将使用二进制激活函数到每个神经元,如步进函数或sigm函数 -用于训练网络的算法是反向传播 -在继续之前,您需要设置和准备数据集以训练神经网络 -例子
-all feature vector extracted from picture belong a car will be label or asociated to class 1               
-all feature vector extracted from picture belong a bike will be label or asociated to class 2
-all feature vector extracted from picture belong a truk will be label or asociated to class 3
-all feature vector extracted from picture belong a ball will be label or asociated to class 4

针对这个示例,您的输出层将有4个神经元,输入层将有128或64个神经元。
在识别模式下,神经网络的输出将是这4个神经元中具有最高值的神经元。
在开始训练阶段之前,必须对数据集中的所有特征进行归一化处理,使其处于[0,1]的区间内,因为神经网络的输出是输入向量属于数据集中一个对象类别的概率。
用于训练网络的数据集需要按以下方式拆分:
-70% off the data used to train
-15% off the data used to validate the network arquitecture (number of neurons in the hidden layyer)
-15% off the data used to test the final network

训练神经网络时,停止标准是识别率,当接近85-90%时。为什么使用神经网络而不是SVM机器?SVM机器工作良好,但在像这样的非线性分类问题或具有许多不同对象类或对象类型的情况下,它无法制作最佳分离类映射,这种缺乏在识别阶段结果中得到体现。我建议您阅读一些关于神经网络理论的内容,以了解它们的工作原理。

http://link.springer.com/chapter/10.1007%2F11578079_10

OpenCV拥有机器学习类来实现神经网络MLP模块。

希望这可以帮助你。


谢谢您向我解释如何使用神经网络进行物体识别。 然而,在我的情况下,可能需要处理彼此相似的物体(例如,两辆相邻的出租车)。我需要能够单独识别它们。神经网络是否可以帮助我解决这个问题? 我感觉使用您提到的技术将允许我识别车辆,但无法单独分辨它们(例如在两辆出租车周围画一个矩形)。 - Colenso Castellino

2
我的建议是观察词袋(BOW),而不是神经网络。这里有一个使用SURF和词袋模型进行对象分类的示例(第一部分,第二部分)。为了提高分类性能,您可以尝试用SVM替换朴素贝叶斯分类器。此外,作者提供了很好的源代码示例。我认为这是一个很好的起点。

我查看了您提供的BOW技术。它似乎非常有前途,但是我正在寻找可以保存并从磁盘加载(学习继续)的学习过程,就像神经网络一样。 我已经成功使用surf提取了特征描述符,但是数据是多维的('N'个关键点对应128个特征向量),我的新问题是如何将多维数据输入神经网络? - Colenso Castellino

2
一种简单的分离检测到的对象的方法是在输入图像中运行轮廓检测器,例如这个
然后,您可以使用每个关键点的x、y坐标与神经网络识别的每个特征向量相关联,并检查这些关键点中有多少位于每个对象的每个轮廓内。
同时,它允许您设置阈值来验证正确的汽车检测,例如如果您有2辆出租车;每辆车有2个轮廓,然后检查每个轮廓中有多少个关键点:
- 属于出租车1的轮廓中有20个关键点 - 属于出租车2的轮廓中有5个关键点
您可以将其识别为出租车1或汽车1。
一旦您有一个经过验证的对象和它的轮廓,您就可以计算封闭对象的边界框。
另一种方法是对于每个训练图像提取属于每个对象的轮廓,计算其边界框,使用这些图片作为纯图片来提取特征,并将其用于训练集中的所有图片。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接