OpenCV将SURF与神经网络相结合

时间:2013-01-17 15:59:07

标签: python image-processing opencv neural-network surf

我想从静态图像识别车辆(汽车,自行车等)。 我正在考虑使用 SURF 为我提供有用的关键点描述符,然后训练MLP(多层感知器)神经网络。 但是我不知道神经网络的输入是什么以及它的输出是什么,以便我可以识别车辆所在的图像部分(可能是围绕它绘制的矩形)。 我知道SURF可以返回图像中的有用关键点及其描述符(我已经这样做了)。关键点具有角度,并且每个关键点对应于 64或128长矢量作为描述符。 我不知道的是这些关键点究竟是什么以及如何将它们用作神经网络的输入。

我正在使用OpenCV与 Python

我是使用SURF和其他特征提取方法的新手。任何与此有关的帮助都会非常好。

3 个答案:

答案 0 :(得分:8)

如果您使用冲浪功能,那意味着浮动设置矢量[128]或[64]取决于您的冲浪配置,您将设置神经网络如下

使用模型创建数据库:

-bikes
-cars
-autobus
-truck

- 拍摄每种类型物体的不同照片,例如10张不同车型的照片,10张不同车型的自行车照片10张不同车型的照片......等等,每张照片关闭每个对象类提取其冲浪特征向量。

- 每种类型的对象将代表神经网络中的一类对象;

-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

- 二进制repesentacion中的每个位将对应于网络输出层中的一个神经元,并表示要识别的一类对象

现在,神经网络的配置将基于特征向量的大小和您想要以这种方式识别的对象类型的数量;

输入图层中的nuerons数; 64或128,具体取决于您配置和使用的冲浪特征向量的大小

神经网络中输出层中的nuerons数量将是您在此示例中想要识别的对象类别数量4

每个神经元的激活函数是sigmoid或tanh函数(http://www.learnartificialneuralnetworks.com/),因为冲浪特征由浮点数表示,如果你使用怪胎或另一个二进制局部特征描述符(Brisk,ORB,那么你将对每个神经元使用二元激活函数,如步函数o 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个0到64个神经元。

- 识别模式下神经网络的输出将是这4个nuerons中具有最高值的神经元。

在开始训练阶段之前,它的necesarry在区间[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模块

希望这可以帮到你

答案 1 :(得分:2)

我的建议是观察BOW而不是神经网络。请参阅此处使用SURF和Bag Of Words模型进行对象分类(first partsecond part)的示例。为了提高分类性能,您可以尝试使用SVM替换朴素贝叶斯分类器。 此外,作者提供了良好的source code example。我认为这是一个很好的开始。

答案 2 :(得分:2)

检测检测到的物体的一种简单方法是运行轮廓检测器 在输入图像中,如that

在它之后你可以使用每个关键点的x,y坐标与神经网络识别的每个特征向量相关联,并检查每个对象的每个轮廓中有多少这些关键点,

与此同时,它允许您设置一个阈值来验证正确的汽车检测,例如,如果您有2辆出租车; 2个轮廓属于每辆汽车,并且会检查每个轮廓中有多少个关键的ponits;

  • 轮廓属于出租车1里面有20个关键的ponits
  • 轮廓属于出租车1里面有5个关键的ponits

你可以作为出租车1 o car 1作为识别对象

按时识别验证对象及其轮廓,您可以计算关闭对象的布线框

另一种方法是每个训练图像提取其轮廓属于每个对象,计算其边界框使用此像纯图像提取特征并使其成为图像集合