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

Keras CNN用于2d图像旋转估计(角度回归),keras,regression,conv-neural-network,image-rotation,Keras,Regression,Conv Neural Network,Image Rotation,我正在尝试建立一个CNN(在Keras中),它可以估计图像(或2d对象)的旋转。所以基本上,输入是一个图像,输出应该是它的旋转 我的第一个实验是估计MŃIST数字的旋转(从只有一个数字“class”开始,比方说“3”)。因此,我所做的是从MNIST集合中提取所有3,然后构建一个“旋转的3”数据集,通过多次随机旋转这些图像,并将旋转的图像及其旋转角度存储为地面真相标签 所以我的第一个问题是2d旋转是循环的,我不知道如何对这种行为建模。因此,我将角度编码为y=sin(ang),x=cos(ang)。

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

我的第一个实验是估计MŃIST数字的旋转(从只有一个数字“class”开始,比方说“3”)。因此,我所做的是从MNIST集合中提取所有3,然后构建一个“旋转的3”数据集,通过多次随机旋转这些图像,并将旋转的图像及其旋转角度存储为地面真相标签

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

对于CNN,首先,我以keras MNIST CNN为例()将最后一个密集层(有10个输出和一个softmax激活)替换为一个有2个输出(x和y)和一个tanh激活(因为y=sin(ang),x=cos(ang)在[-1,1]范围内)的密集层

我最后要决定的是损失函数,我基本上想对角度进行距离测量。因此,我认为“余弦接近度”是一种方法

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

假设是否有任何错误: -角度的x,y编码 -tanh激活具有[-1,1]中的值 -余弦_近似作为损失函数


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

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

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

谢谢您的评论!关于建议:一,。我尝试了MSE,结果大致相同。2.我不确定[0,1]编码是否有意义。你的意思是[0360°]->[0,1]?就损失而言,这将如何运作?第一个0和1对于0°旋转都是正确的。其次,如果我们假设我们的目标是0°(0编码),我们的当前值是324°(0.9编码)。因此,在[0,1]编码中,误差为324°(或编码中的0.9°)。但实际上它只有36°(编码为0.1)。你同意吗?3.唯一的预演。我做的是旋转图像,所以没什么特别的。在深入损失分析之前,你说你的预处理包括旋转。旋转输入图像会改变案例中的一切;如果你将输入旋转90°,你也必须在地面上进行同样的操作。你能确认你做得对吗?当然。我获取所有“3”个图像(未旋转),并用标签x=cos(0°),y=sin(0°)注释。然后,我将所有图像旋转20°,用x=cos(20°),y=sin(20°)注释这些图像,并将它们添加到(未旋转的)数据集中。我这样做40°,60°。。。等等这就是我使用的数据集(分为测试/训练)…看起来你得到的是
atan2(1,-1)
atan2(1,0)
atan2(1,1)
等等。可能
tanh
激活无法在中间点稳定。顺便说一句,你应该发布一些代码,以便人们有具体的工作。