我使用基于检测的CNN来估计手的姿势(在一只手的深度图像中找到手关节)。我的计划是首先使用FCN找到所有16个关键点的2D坐标。主干网是ResNet-50-FPN,计算图可以看到这里.res2a~res5c的结构为这里。
当我用ICVL手位数据集训练这个模型时,输出特征映射收敛为所有像素值几乎为零的全部黑色图像。地面真相是深度图和热图(如这 )。如果我在最后一个卷积层(如图像所示)之后添加一个sigmoid激活函数,输出热图将类似于白噪声。无论如何,检测FCN是完全无用的,而损失是不会下降的。
下面的代码可以简要演示我的CNN模型:
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的实现是不正确的,还是缺少了一些重要的东西?
发布于 2018-08-28 02:49:41
你也能上传你的训练代码吗?
此外,地面真实热图是否有(批量,高度,宽度,16)的形状,并且每个通道都是一个高斯峰值,围绕着关键点的坐标?如果是这样的话,那么它就是一个姿态估计问题。
现在,尝试这两个建议开始。
tf.reduce_sum(tf.square(heatmaps - heat_ground_truth, 2) , name='heat_loss')如果这些方法没有帮助,我建议尝试一些姿态估计方法,因为FPN更多的是一种对象检测和语义分割方法。卷积位姿机可能是一个很好的开端。
卷积位姿机使用比例尺热图作为地面真相和网络输出。在CNN主干网之后,VGG在报纸上出现了,但我认为res-net也能工作.例如,经过16步的汇集,热图的形状是(批量,高度/16,宽度/16,16)。然后使用相同的损失函数。
https://stackoverflow.com/questions/50415450
复制相似问题