神经网络 - 一张图像中的多个对象检测

时间:2017-10-31 00:57:42

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

我理解CNN如何用于分类问题,例如在MNIST数据集上,其中每个图像代表一个手写数字。评估图像,并给予分类一些信心。

我想知道如果我想在一张图片中识别出几个对象,我会采取什么方法,并对每个图像都有信心。例如 - 如果我评估一只猫和一只狗的图像,我想对'猫'和'狗'都有很高的信心。我不在乎图片中对象的位置。

我目前的知识将引导我构建包含JUST狗的图像数据集,以及包含JUST猫的图像数据集。我会重新训练最高级别的Inception V3网络,它可以识别哪些图像是猫,哪些图像是狗。

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

我简要介绍了基于地区的CNN ,它解决了类似的问题,但我并不关心图片中的对象是什么 - 只是他们每个人都可以被识别出来。

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

2 个答案:

答案 0 :(得分:2)

首先,为了容易理解,只要认为你有两个独立的神经网络,一个只识别猫是否在图像中,另一个识别狗是否是狗,神经元肯定会学会如何识别它。

但更有趣的是,这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,然后猫和狗出现在图像中。

希望这有帮助!

答案 1 :(得分:1)

我知道这是一个古老的问题,但是如果它出现在Google搜索其他任何人的首页上(就像对我一样),我想我可以通过一些有用的东西来搞定。

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%的类别事故等。我们将通过使用例如S型函数。具体来说,我们将替换为:

     

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

     

具有:

     

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

     

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

     

再次,只需将Sigmoid替换为softmax:

     

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