8

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

我正在将 OpenCV 与Python一起使用。

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

4

3 回答 3

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

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

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

输入层中的神经元数;64 或 128,取决于您配置和使用的 surf 特征向量的大小

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

每个神经元所需的激活函数是 sigmoid 或 tanh 函数(http://www.learnartificialneuralnetworks.com/),因为 surf 特征由浮点数表示,如果您使用怪异特征或其他二进制局部特征描述符(Brisk, ORB, BRief ) 然后您将对每个神经元使用二进制激活函数,例如阶跃函数 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 个 0r 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 模块

希望这可以帮到你

于 2013-02-24T16:39:49.857 回答
2

分离检测到的对象的一种简单方法是在输入图像中像这样运行轮廓检测器。

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

同时它可以让您设置一个阈值来验证正确的汽车检测,例如,如果您有 2 辆出租车;2 个轮廓属于每辆车,然后检查每个轮廓中有多少个关键点;

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

您可以将出租车 1 或汽车 1 作为识别的对象

当您识别出验证对象及其轮廓时,您可以计算关闭对象的边界框

另一种方法是对每个训练图像提取属于每个对象的轮廓,计算其边界框,像纯图像一样使用它来提取特征并使其成为训练集中的所有图片

于 2013-03-01T10:58:54.013 回答
2

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

于 2013-01-18T16:46:25.197 回答