【问题标题】:convolutional neural network for object localization用于对象定位的卷积神经网络
【发布时间】:2019-01-03 16:07:41
【问题描述】:

我在 Andrew Ng 的深度学习课程中看到了一种在图像上定位单个对象的方法:https://www.youtube.com/watch?v=GSwYGkTfOKk。 据我了解,您可以例如将一个点绑定到对象的特定部分,将坐标:x,y 作为标签 y 并训练 CNN。

我想训练一个 CNN 神经网络来定位我的眼睛(不是分类)。我拍了 200 张照片:灰度为 60x60 像素。我标记了左眼和右眼,标记的眼睛的每个坐标都归一化为0-1。 y 标签是:[eye1 的 x,eye1 的 y,eye2 的 x,eye2 的 y]。我在输出层 sigmoid 函数中使用了带有 mse 损失的 SGD 优化器。

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Conv2D(64, (3,3), input_shape= (60,60, 1)))
model.add(tf.keras.layers.Activation('relu'))
model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2)))

model.add(tf.keras.layers.Conv2D(32, (3,3)))
model.add(tf.keras.layers.Activation('relu'))
model.add(tf.keras.layers.MaxPool2D(pool_size=(2,2)))

model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(64, activation='relu'))

model.add(tf.keras.layers.Dense(4, activation='sigmoid'))
sgd= tf.keras.optimizers.SGD(lr = 0.01)
model.compile(loss = 'mean_squared_error', optimizer=sgd, metrics=['accuracy'])
model.fit(x,y, batch_size=3, epochs=15, validation_split=0.2)

它对这个任务不起作用,那么解决这个问题的方法是什么?我在某处看到:将 CNN 应用于图像(我想没有密集层),然后在来自 CNN 的展平数据上,对每个 x/y 坐标使用线性回归(多变量逻辑回归)。这是一个解决方案吗?据我了解,我会将每个图像输入 Conv 和 MaxPool 层,然后将其压平,然后将数据输入 lin。回归并训练它,但我不知道如何在 keras 中做到这一点。我是这个领域的新手,所以任何想法对我都有帮助。

【问题讨论】:

  • 我认为您要完成的工作与面部关键点检测问题非常相似。它已被广泛研究,并且有许多解决方案。看看这个Kaggle competition 拥有丰富的资源(内核)来了解谁来解决这个问题。
  • 谢谢,我找到了这个:fairyonice.github.io/…,并尝试了这种方法并且有改进。也许 200 张照片的训练数据还不够。我将尝试通过旋转、裁剪或其他方式编辑我的数据来获取更多数据。

标签: python keras conv-neural-network


【解决方案1】:

首先,关于您的代码的几点意见。

由于最后一层包含超过2个神经元,所以你必须使用的激活函数是softmax不是sigmoid(注意这是分类的情况,而不是回归)。

您应该只在进行二进制分类时使用 sigmoid,而不是当您有两个以上的类时(请注意,您也可以对 2 个类使用 softmax,但从计算开销较小的角度来看,不一定建议这样做)。

您的问题既是回归问题又是分类问题!

卷积神经网络的第一层包含 64 个特征图,每个内核大小为 3x3。尽管将图像输入神经网络的方式是正确的,但您只输入灰度图像,而不是 x1,x2,y1,y2 坐标

对于带有回归的 ANN,请查看本教程:https://machinelearningmastery.com/regression-tutorial-keras-deep-learning-library-python/

你的直觉是正确的;目标检测神经网络用卷积层代替全连接层。 Yann LeCun 甚至指出,全连接层不应该成为 CNN 的一部分。

由于您是该领域的新手,我建议采用以下管道。

1) 查找用您首选的深度学习库(Keras/PyTorch/TensorFlow 等)编写的在线 github 模型。

2) 按照说明/教程复制 github 用户获得的结果。

3) 借助后者,您还应该了解代码/获得良好的直观把握。

4) 使模型适应您需要的问题。

您可以从这里开始(这是对象检测 - 检测多个对象以及不同类别的对象):https://github.com/pierluigiferrari/ssd_keras

如果您还有其他问题,请写下来,我很乐意为您提供帮助!

【讨论】:

  • 非常感谢。首先我在最后一层有softmax,但是因为所有softmax输出的总和是1,我认为这是错误的。我的错误假设是,每一层都必须指定(非线性)激活函数,导致我放了一个 sigmoid。如我所见:fairyonice.github.io/…,最后一层的线性激活函数有效。
  • 为什么是回归问题?抱歉,我真的是神经网络、深度学习、CNN 等方面的新手。
  • 既是回归也是分类。边界框的位置通过回归(x_min,x_max,y_min,y_max)进行细化,边界框内的内容通过分类(边界框内是否有狗或猴子)。
猜你喜欢
  • 2020-10-19
  • 2017-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 1970-01-01
  • 2020-11-01
  • 2017-08-06
相关资源
最近更新 更多