【问题标题】:Neural Networks - Multiple object detection in one image with confidence神经网络 - 在一张图像中自信地检测多个对象
【发布时间】:2018-04-12 02:09:21
【问题描述】:

我了解 CNN 如何解决分类问题,例如在 MNIST 数据集上,每个图像代表一个手写数字。对图像进行评估,并以一定的可信度给出分类。

如果我想在一张图像中识别多个对象,我想知道我应该采取什么方法,并且对每个对象都有信心。例如 - 如果我评估猫和狗的图像,我希望对“猫”和“狗”都有很高的置信度。我不在乎物体在图片中的位置。

我目前的知识将引导我构建一个包含 JUST 狗的图像数据集和一个包含 JUST 猫的图像数据集。我会重新训练例如Inception V3 网络的顶级网络,它将能够识别哪些图像是猫,哪些图像是狗。

这样做的问题是评估狗和猫的图像将导致 50% 的狗和 50% 的猫 - 因为它试图对图像进行分类,但我想“标记”图像(理想情况下达到~100% 狗,~100% 猫)。

我已经简要了解了 基于区域的 CNN,它们解决了类似的问题,但我不关心对象在图片中的位置 - 只是它们每个都可以识别。

有什么方法可以解决这个问题?我想在 Python 中使用 Tensorflow 或 Keras 之类的工具来实现这一点。

【问题讨论】:

    标签: image-processing tensorflow neural-network conv-neural-network object-detection


    【解决方案1】:

    我知道这是一个老问题,但如果它出现在任何其他人的谷歌搜索的首页(就像它为我所做的那样),我想我可以提供一些有用的东西。

    InceptionV3 的最后一层是一个 Softmax 函数,它试图说这是标签 A 标签 B。

    但是,如果您想修改 Inception 之类的多标签分类,而不是使用 Softmax 作为您的最后一层,您希望将其换成 Sigmoid 之类的东西,以便每个标签都根据其自身的优点来衡量(而不是与其邻居进行比较)。

    可以在此处找到有关其背后原因的更多信息(以及有关如何修改 retrain.py 的完整说明):

    https://towardsdatascience.com/multi-label-image-classification-with-inception-net-cbb2ee538e30

    add_final_training_ops() 方法最初添加了一个新的 softmax 和全连接层用于训练。我们只需要将 softmax 函数替换为不同的函数即可。

    为什么?

    softmax 函数将向量的所有值压缩到 [0,1] 的范围内,总和为 1。这正是我们在单标签分类中想要的。但是对于我们的多标签案例,我们希望得到的类概率能够表示汽车图像以 90% 的概率属于汽车类,以 30% 的概率属于事故类等。我们将通过使用例如 sigmoid 函数。具体我们将替换:

    final_tensor = tf.nn.softmax(logits, name=final_tensor_name)

    与:

    final_tensor = tf.nn.sigmoid(logits, name=final_tensor_name)

    我们还必须更新交叉熵的计算方式以正确训练我们的网络:

    同样,只需将 softmax 替换为 sigmoid:

    cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(logits,ground_truth_input)

    【讨论】:

      【解决方案2】:

      首先,为了容易理解,假设你有 2 个独立的神经网络,一个只识别图像中是否有猫,另一个识别狗是否是狗,神经元肯定会学习如何很好地识别它。

      但更有趣的是,这两个网络可以组合成单个网络来共享权重,并有狗和猫的两个输出。为此,您只需要注意:

      • 2类(猫和狗)可以在同一个图像中,然后[cat_label, dog label] ={[0, 0], [0, 1], [1, 0], [1, 1]}。不像 MNIST 或普通的分类模型,[cat_label, dog label] ={[0, 1], [1, 0]}(one_hot 标签)。
      • 在预测的时候,可以选择某个阈值来判断猫和狗是否出现,例如if y_cat>0.5 and y_dog>0.5,那么猫和狗就在图像中。

      希望对您有所帮助!

      【讨论】:

      • 感谢您的回答 - 但我应该澄清一下。我正在寻找一种适用于任意数量标签并且具有一定可扩展性的解决方案。如果我想识别 100 个不同的对象,我需要 100 个网络吗?
      • 不,你只需要一个有 100 个输出的网络。单独的网络只是为了帮助您更好地理解。
      • 谢谢,有道理!
      • 网络是否应该在显示猫和狗的图像上进行训练(随机集合 100 个对象),如果不是,那么共享权重的过程是什么(听起来需要训练 100 个网络然后合并结果)?
      猜你喜欢
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 2016-10-03
      • 2012-05-06
      相关资源
      最近更新 更多