Keras CNN用于2d图像旋转估计(角度回归)
我正在尝试建立一个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]中的值 -余弦_近似作为损失函数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)。
提前感谢您提供的任何建议、提示或指出我可能犯的错误 很难给你一个准确的答案,所以让我们尝试一些想法:
- 从余弦接近度更改为MSE或其他损耗,并检查是否有变化
- 更改对目标进行编码的方式。可以将角度表示为0到1之间的数字。即使角度是圆形的,也似乎没有问题
- 确保预处理/扩充步骤对于此特定任务有意义
atan2(1,-1)
,atan2(1,0)
,atan2(1,1)
等等。可能tanh
激活无法在中间点稳定。顺便说一句,你应该发布一些代码,以便人们有具体的工作。