首页 > 解决方案 > 用于对象定位的卷积神经网络

问题描述

我在 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 中做到这一点。我是这个领域的新手,所以任何想法对我都有帮助。

标签: pythonkerasconv-neural-network

解决方案


首先,关于您的代码的一些观察。

由于最后一层包含超过 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 。

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


推荐阅读