用于 2D 图像旋转估计(角度回归)的 CNN



我正在尝试构建一个CNN(在Keras中),可以估计图像(或2d对象)的旋转。所以基本上,输入是一个图像,输出应该是它的旋转。

我的第一个实验是估计MŃIST数字的旋转(从一个数字"class"开始,假设"3")。所以我所做的是从MNIST集合中提取所有3s,然后建立一个"旋转的3s"数据集,通过随机旋转这些图像多次,并将旋转的图像及其旋转角度存储为地面真实标签。

所以我的第一个问题是 2D 旋转是循环的,我不知道如何对这种行为进行建模。因此,我将角度编码为 y=sin(ang),x = cos(ang)。这给了我我的数据集(旋转的 3s 图像)和相应的标签(x 和 y 值)。

对于CNN,首先,我只是以keras MNIST CNN为例(https://keras.io/examples/mnist_cnn/),并将最后一个密集层(有10个输出和一个softmax激活)替换为具有2个输出(x和y)和一个tanh激活的密集层(因为y=sin(ang),x = cos(ang)在[-1,1]内)。

我必须决定的最后一件事是损失函数,我基本上想要对角度进行距离测量。因此,我认为"cosine_proximity"是要走的路。

在训练网络时,我可以看到损失正在减少并收敛到某个点。然而,当我检查预测与基本事实时,我观察到一个(对我来说)相当令人惊讶的行为。几乎所有的 x 和 y 预测都趋向于 0 或 +/-1。由于我的旋转"解码"是 ang=atan2(y,x),因此预测通常是 +/- 0°、45°、90、135° 或 180°。 但是,我的训练和测试数据只有 0°、20°、40° 的角度......360°. 如果我改变网络的复杂性,这并没有真正改变。我也尝试了优化器参数,但没有成功。

假设有什么问题吗: - 角度的x,y编码 - tanh 激活在 [-1,1] 中的值 - cosine_proximity作为损失函数

提前感谢任何建议、提示或指出我可能犯的错误!

很难给你一个确切的答案,所以让我们尝试一些想法:

  • 从余弦邻近更改为 MSE 或其他损失,并检查是否有更改。
  • 更改对目标进行编码的方式。您可以将角度表示为 0 到 1 之间的数字。即使角度是西卡,这似乎也不是问题。
  • 确保预处理/扩充步骤对此特定任务有意义。

最新更新