从图片中进行照明方向估计的机器学习?

时间:2017-10-11 03:52:16

标签: machine-learning tensorflow neural-network computer-vision

机器学习和堆栈溢出的新手。

最近,我一直在尝试创建一种机器学习算法,该算法基于对象的反射来估计光源的方向。 我知道这可能是一个复杂的主题,这就是为什么,作为第一步,我尽可能地简化它。

我首先将问题从回归问题转换为分类问题,仅将其作为输出:光源位于对象的左侧,或者光源位于对象的右侧。 我也只是为我的数据集制作了一个角度。

我的问题的简短版本:

  • 您认为机器学习可以做这样的事吗? (我的经验太有限,不能确定)
  • 如果是,那么适合您的神经网络是什么? CNN? R-CNN? LSTM? SVM?
  • 完成此任务的管道是什么?

我目前正在使用带有定向光的Unity Engine,它采用[10,60] / [120,170]之间的随机X角和带有金属反射的球体来创建和标记数据集。这是一个例子:

  

https://imgur.com/a/FxNew标签:0(左侧)

     

https://imgur.com/a/9KFhi标签:1(右侧)

对于预处理:

  • 图像大小调整为64x64图像
  • 从RGB转换为灰度格式。

对于机器学习,我目前正在使用张量流和卷积神经网络:

  • 10000平衡标记数据,64x64灰度图片作为输入,0/1作为标签

  • 3个带过滤器的卷积层[16,32,64],大小为[5,5] RELU

  • 3个大小为[2,2]和步幅[2,2]
  • 的图层
  • 1具有1024个隐藏神经元和丢失的密集层(速率= 0.4)RELU
  • 1具有2个输出神经元的密集层(每类1个)Softmax

至于问题:我的网络根本就没有学到损失几乎没有下降,准确性表明好的结果是随机的,无论数据,层数,优化器,学习率,......我的输出只是平均值之间两个类:[0.5,0.5]。

我的猜测是问题比我最初想的要复杂得多,我的数据并没有很好地暗示我的预测应该是什么,我宁愿训练一个检测物体反射点的网络。然后使用对象中心和点之间的方向。我是对的吗?

另一个猜测是卷积层不考虑位置,因此对于卷积部分,所有图像都是相同的,因为球体总是相同的,以及照明模式。它将始终检测到相同的事物,并且不会考虑光区域已移动。您对我可以使用哪个网络来解决此问题有任何建议吗?

我真的在寻找一些建议,警告如何解决这类任务。 请记住,我仍然是机器学习的新手,并且仍然比我的机器学习更多...

谢谢。

2 个答案:

答案 0 :(得分:1)

  

您是否认为通过机器学习可以做这样的事情?

绝对。你正确地选择了CNN模型 - 它最适合这项任务。

  

我的猜测是问题比我最初想的要复杂得多,我的数据并没有很好地暗示我的预测应该是什么,我宁愿训练一个检测物体反射点的网络。然后使用对象中心和点之间的方向。我是对的吗?

不,CNN已经证明可以从原始像素中进行分类。它应该弄清楚要注意什么。

  

您对我可以使用哪个网络来解决此问题有任何建议吗?

如果您提供完整的代码,我会很高兴。没有学习的原因有很多:图像预处理错误,数据错误标记,超参数选择不当(学习率,初始化......),错误丢失功能等等。可能只有错误

基于所描述的CNN架构,我立即建议:

  • 5x5过滤器大小可能太大,因为您没有那么多过滤器。尝试3x3并稍微增加过滤器数量,例如32 - 64 - 64
  • 我假设您使用的是CONV - POLL - CONV - POLL - CONV - POOL,而不是CONV - CONV - CONV - POOL - POOL - POLL。只是为了确保。
  • 你的FC层可能不需要那么多神经元。你只有两个类和非常相似的图像!减少1024256
  • 您目前没有遇到任何过度拟合,因此暂时停用退出:keep_probability=1.0
  • 注意初始化和学习率。在对数刻度中尝试不同的值,例如learning_rate = 0.1, 0.01, 0.001并检查学习模式是否会发生变化。

答案 1 :(得分:1)

感谢@Maxim的回答。这非常有帮助,帮助我解决了我的问题以及改进我的网络。

他指出了我的问题:数据错误标记。

我非常确定我的数据标签,但无论如何已经过验证。

问题出在那里......

我在这里写答案,所以它可以帮助其他不知情的tensorflow用户: 当您使用 tf.string_input_producer 而未指定它时,默认值为:“ Shuffle = True ”,它会对您的文件名队列进行随机播放。

由于我使用.csv文件作为图像的标签和.png文件夹,标签的读取顺序为1到10000,而.png文件是随机读取的。

我对此感到非常愚蠢,但这就是你学习嘿嘿的方式。