如何建立一个检测图像中常见对象的网络?

数据挖掘 神经网络 卷积神经网络
2022-03-15 00:05:38

我有一组图像。所有都包含一些共同的对象(让我们假设所有对象都具有相同的大小并且没有其他更改)。我想训练一个 CNN,它将学习常见对象的过滤器,并返回一个布尔标志,表明它是否存在于给定图像中。

(为简单起见,我假设“对象”小于 5x5 像素)

我想到了类似的东西:

  • 具有 1 个 5x5 过滤器的 Conv 层
  • 具有 pool_size = 输入大小的 MaxPooling 层(意思是 - 返回单个值:过滤器的最大激活)
  • 输出最大激活(或其变体)

一些问题:

  1. 您会输出原始最大激活值并使用阈值来决定吗?乙状结肠吗?或者强制网络输出“object”和“no_object”类并做softmax?
  2. 相当相关 - 什么损失函数?
  3. 拥有一个大的 MaxPooling 层(将所有激活减少到一个)是否有问题?反向传播的梯度会发生什么?
    似乎它只会随机进入其中一个激活状态,我不确定它是否可以以这种方式“学习”对象..

我想知道如何看待这个问题,因为它不是一个真正的 2 类分类问题。即使我能想出不包含对象的图像,也没有什么可以从这个类中“学习”的,除了它包含某些东西(这是一个有价值的信息,我必须同意)。

我尝试在模拟的小黑白图像和随机添加的十字“对象”上使用它。尽管在某些尝试中它得到了水平线,但无法让过滤器学习交叉模式。

任何想法都会有所帮助!谢谢!

2个回答

您可能只需要更深的网络来学习交叉测试示例。卷积层需要具有多个特征通道并堆叠起来,以便学习比边/角计数更复杂的任何东西。查看例如 MNIST 的示例网络,您通常会看到 2 或 3 个 CNN 层,具有多个通道(例如 32 或 64 个通道,每个通道都与前一层通道数量的 NxN 内核相关联)加上 1 或 2 个全连接层在分类器之前。

对于二元选择,是的,在对象存在/不存在的类上进行训练。单个 sigmoid 输出或具有两个输出的 softmax 之间没有重大区别。如果使用 softmax,则使用交叉熵损失函数,多类版本。

我建议通过更改输入形状和输出数量来使 MNIST 示例网络适应您的问题。所以这将使用softmax和多类交叉熵损失。

有一个大的 MaxPooling 层是否有问题

它可以在某些情况下工作,但是通过使用单层、单通道 CNN,您使网络变得过于简单,甚至无法对中等复杂的形状进行分类。将这一层的激活减少到最大值将限制网络本质上通过最强匹配 5x5 模板与图像中的过滤器进行分类。有了足够的训练示例,它应该能够创建这样的过滤器,但它不能很好地处理噪声、旋转或任何部分匹配。

你可能会得到一个更有效的东西,一个大的池化层比一个 2 深的多通道 CNN,然后一个小的全连接层覆盖那些最大通道输出。它仍然是一个不寻常的架构选择,但我怀疑它可以学习像你的交叉测试这样的问题。

此外,您可以从

https://github.com/soumith/convnet-benchmarks

https://github.com/jcjohnson/cnn-benchmarks

那里有多种最先进的 cnn 架构