【问题标题】:tensorflow neural network with 3d mesh as input以 3d 网格为输入的张量流神经网络
【发布时间】:2017-10-07 16:31:46
【问题描述】:

我正在尝试构建一个将 3d 网格的顶点位置作为输入的神经网络, 并输出内部两点的坐标。

出于测试目的,我有一个数据集,其中包含一个几何图形,该几何图形有 20 个点,每个点在内部有两个点。

数据集的每个文件都包含 2 级顶点的坐标,其中 obj 的形状为 [3,20] 数组,结果点的形状为 [3,3]。

我已经建立了一个线性模型,但结果总是很低 (0,16) ,不管我用 1000、100.000 还是 500.000 训练它

import tensorflow as tf
import numpy as np

objList    = np.load('../testFullTensors/objsArray_00.npy')
guideList  = np.load('..testFullTensors/drvsArray_00.npy')


x  = tf.placeholder(tf.float32, shape=[None, 60])
y_ = tf.placeholder(tf.float32, shape=[None, 6])

W = tf.Variable(tf.zeros([60,6],tf.float32))
b = tf.Variable(tf.zeros([6],tf.float32))

y = tf.matmul(x,W) + b

cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    train_step.run(feed_dict={x: objList, y_: guideList})
    correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    sess.run(tf.global_variables_initializer())
    print accuracy.eval(session=sess , feed_dict={x: objs, y_: guides})`

我应该建立不同类型的网络吗?

谢谢 E

【问题讨论】:

  • Tensorflow 内置了使用卷积处理 2d 和 3d 数据集的函数。当您将数据展平为 1d 时(就像您拥有的那样),您将失去有意义的几何图形。考虑 tensorflow.org/get_started/mnist/beginnerstensorflow.org/get_started/mnist/pros 之间的区别。卷积是一种强大的技术,我认为可以极大地帮助您解决这个问题。
  • 是确定性的 2 个点,它们是 2 个有意义的点(例如总是在动物的左眼和右眼后面)还是只是网格内的 2 个点?
  • 是的,卷积神经网络是我的第一选择,甚至导致最终的想法是使用人形网格作为输入。读完这篇文章后,我尝试了一个简单的线性模型:stackoverflow.com/questions/34500641/…,顺便说一句,我会尝试回去使用 CNN。我只是想知道使用 3d 坐标作为输入是否可以,或者我需要体素化网格。这两点是有意义的,它们应该像“指南”一样用来放置其他对象。如果使用带有顶点的 CNN,...我应该如何塑造张量?
  • 你说这两个点是放置其他对象的指南。您是否相信如果给定相同的数据和电子表格以及大量时间,人类将能够按照您指定的正确顺序始终如一地获得相同的 2 分?我问这个是因为它有疑问。想想 AlphaGo 并考虑它的架构。 AlphaGo NN 预测的是每一个步是否是好步的可能性,然后将其输入到 AlphaBeta 算法中。 NN没有预测下一步动作,它对所有个动作进行评分。您在创建得分方面可能会取得更大的成功。
  • 我确信人类能够始终如一地获得相同的 2 分,因为在我的工作中,我必须在人形网格中为每个骨关节放置一个点,所以我可能已经一个包含人体网格和关节位置的大型数据库。我只需要弄清楚如何让网络自己做:)(在手臂的例子中,你需要将点放在肩膀、肘部和手腕上)

标签: 3d tensorflow neural-network coordinates vertices


【解决方案1】:

首先感谢cmets中对问题的澄清,确实有助于理解问题。

据我了解,问题是(至少类似于):给定手臂外部 3D 点的边界集,识别

  • A 3D 中位于肱骨上最靠近身体的点
  • B 3D 中距离身体最远的肱骨上的点

我们需要的是一个具有足够表达能力的模型来做到这一点。让我们首先考虑一下这个问题对人类来说是最简单的。如果为人类提供了一个可以查看和旋转的 3D 模型,那么这将是一个视觉问题,他们可能会立即获得

如果它是 60 个数字的列表,而他们没有被告知这些数字的含义,他们不得不产生 6 个数字作为答案,那么这可能是不可能的。

We know that TensorFlow is good at image recognition,所以让我们把问题变成图像识别问题。

让我们从 MNIST 网络开始,然后谈谈如何将其更改为我们的问题!

将您的输入转换为voxels,这样每个训练示例将是一个大小为 [m,m,m] 的 3D 图像,其中 m 是您需要的分辨率(从 30 左右开始进行初始测试,并且可能会达到最高如 128)。用 0 初始化您的 3D 矩阵。然后对于 20 个数据点中的每一个,将相应的体素更改为 1(或概率)。

这是您的输入,由于您有很多训练示例,您将有一个 [batch,m,m,m] 的张量。

对预期的输出执行相同操作。

通过layers of convolution 发送(从 2 或 3 开始进行测试),使您的输出大小为 [batch,m,m,m]。

使用反向传播来训练您的输出层以预测您的预期输出。

最后,您将拥有一个网络,它不返回肱骨的 3D 坐标,而是返回它在 3D 空间中位置的概率图。您可以扫描输出以获得最高概率并读取坐标。

这与 AlphaGo 击败围棋的方式非常相似

建议改进 - 训练 1 个网络来预测 A 和一个单独的网络来预测 B

【讨论】:

  • 每个卷积的高度(和宽度)(至少)将为 m / conv_layers + 1
  • 感谢您的完美回答,非常有帮助且非常清晰
  • 使用 GAN 的想法很好,但将输入转换为体素可能不是一个好主意。数据非常庞大,将所有网格文件转换为标准大小的体素并不像想象的那么容易。
  • @JasonChing 不建议使用 GAN。对 AlphaGo 的引用是关于策略网络,查看图像并评估最可能的游戏区域(或在本例中为肱骨)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
相关资源
最近更新 更多