【发布时间】: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