首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TensorFlow -键点检测产生一个零的热图。

TensorFlow -键点检测产生一个零的热图。
EN

Stack Overflow用户
提问于 2018-05-18 16:13:02
回答 1查看 2.2K关注 0票数 2

我使用基于检测的CNN来估计手的姿势(在一只手的深度图像中找到手关节)。我的计划是首先使用FCN找到所有16个关键点的2D坐标。主干网是ResNet-50-FPN,计算图可以看到这里.res2a~res5c的结构为这里

当我用ICVL手位数据集训练这个模型时,输出特征映射收敛为所有像素值几乎为零的全部黑色图像。地面真相是深度图和热图(如 )。如果我在最后一个卷积层(如图像所示)之后添加一个sigmoid激活函数,输出热图将类似于白噪声。无论如何,检测FCN是完全无用的,而损失是不会下降的。

下面的代码可以简要演示我的CNN模型:

代码语言:javascript
复制
heat_chain = TensorChain(image_tensor) \
            .convolution_layer_2d(3, 16, 1, 'conv1') \
            .batch_normalization() \
            .relu('relu1') \
            .max_pooling_layer_2d(2, 'pool1') \
            .bottleneck_2d(64, 256, 'res2a') \
            .bottleneck_2d(64, 256, 'res2b') \
            .bottleneck_2d(64, 256, 'res2c') \
            .branch_identity_mapping() \
            .bottleneck_2d(128, 512, 'res3a', stride=2) \
            .bottleneck_2d(128, 512, 'res3b') \
            .bottleneck_2d(128, 512, 'res3c') \
            .bottleneck_2d(128, 512, 'res3d') \
            .branch_identity_mapping() \
            .bottleneck_2d(256, 1024, 'res4a', stride=2) \
            .bottleneck_2d(256, 1024, 'res4b') \
            .bottleneck_2d(256, 1024, 'res4c') \
            .bottleneck_2d(256, 1024, 'res4d') \
            .bottleneck_2d(256, 1024, 'res4e') \
            .bottleneck_2d(256, 1024, 'res4f') \
            .branch_identity_mapping() \
            .bottleneck_2d(512, 2048, 'res5a', stride=2) \
            .bottleneck_2d(512, 2048, 'res5b') \
            .bottleneck_2d(512, 2048, 'res5c') \
            .upsampling_block_2d(2, [-1, 30, 40, 512], 'upsample1') \
            .merge_identity_mapping_2d('merge1') \
            .upsampling_block_2d(2, [-1, 60, 80, 256], 'upsample2') \
            .merge_identity_mapping_2d('merge2') \
            .upsampling_block_2d(2, [-1, 120, 160, 64], 'upsample3') \
            .merge_identity_mapping_2d('merge3') \
            .upsampling_block_2d(2, [-1, 240, 320, 16], 'upsample4') \
            .convolution_layer_2d(3, 16, 1, 'conv2') \
            .convolution_layer_2d(3, 16, 1, 'conv3')
heatmaps = tf.identity(heat_chain.output_tensor, name='heatmaps')
heat_loss = tf.reduce_mean(
        tf.reduce_sum(tf.pow(heatmaps - heat_ground_truth, 2), axis=[1, 2, 3]), name='heat_loss')

其中,branch_identity_mapping()将最后一个张量推到堆栈中,merge_identity_mapping_2d()弹出一个存储的张量并将其添加到当前张量中(也可以将维度与1x1卷积层相匹配)。

我完全搞不懂到底是怎么回事。我的ResNet-50-FPN的实现是不正确的,还是缺少了一些重要的东西?

EN

回答 1

Stack Overflow用户

发布于 2018-08-28 02:49:41

你也能上传你的训练代码吗?

此外,地面真实热图是否有(批量,高度,宽度,16)的形状,并且每个通道都是一个高斯峰值,围绕着关键点的坐标?如果是这样的话,那么它就是一个姿态估计问题。

现在,尝试这两个建议开始。

  1. 在没有任何正则化和图像增强的情况下,尝试1种训练图像的模型。然后应用不同的学习比例量表。看看损失是否在减少,训练图像的预测是否与地面真实热图相似。
  2. 您的丢失函数看起来很好,尽管我只使用:tf.reduce_sum(tf.square(heatmaps - heat_ground_truth, 2) , name='heat_loss')

如果这些方法没有帮助,我建议尝试一些姿态估计方法,因为FPN更多的是一种对象检测和语义分割方法。卷积位姿机可能是一个很好的开端。

卷积位姿机使用比例尺热图作为地面真相和网络输出。在CNN主干网之后,VGG在报纸上出现了,但我认为res-net也能工作.例如,经过16步的汇集,热图的形状是(批量,高度/16,宽度/16,16)。然后使用相同的损失函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50415450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档