在张量流中将3通道掩模应用于3通道Tensor

时间:2015-12-11 09:43:03

标签: mask tensorflow

我正在尝试将一个掩码(二进制,只有一个通道)应用于RGB图像(3个通道,标准化为[0,1])。我目前的解决方案是,将RGB图像分割成它的通道,将其与掩模相乘并再次连接这些通道:

glm::vec3 extractTranslation(const glm::mat4 &m)
{
    glm::vec3 translation;  
    // Extract the translation

    translation.x = m[3][0];
    translation.y = m[3][1];
    translation.z = m[3][2];

    return translation;
}

glm::vec3 extractScale(const glm::mat4 &m) //should work only if matrix is calculated as M = T * R * S
{
    glm::vec3 scale;

    scale.x = glm::length( glm::vec3(m[0][0], m[0][1], m[0][2]) );
    scale.y = glm::length( glm::vec3(m[1][0], m[1][1], m[1][2]) );
    scale.z = glm::length( glm::vec3(m[2][0], m[2][1], m[2][2]) );

    return scale;
}

float extractLargestScale(const glm::mat4 &m)
{
    glm::vec3 scale = extractScale(m);

    return glm::max(scale.x, glm::max(scale.y, scale.z));
}

void Sphere::applyTransformation(const glm::mat4 &transformation)
{
    glm::vec4 center = transformation * glm::vec4(_center, 1.0f);
    float largestScale = extractLargestScale(transformation);

    set(glm::vec3(center)/* / center.w */, _radius * largestScale);
}

然而,这似乎效率很低,特别是因为根据我的理解,这些计算都不是就地完成的。有没有更有效的方法来做到这一点?

1 个答案:

答案 0 :(得分:5)

tf.mul()运算符支持numpy-style broadcasting,这将允许您稍微简化和优化代码。

让我们说zero_one_maskm x n张量,而output_imgb x m x n x 3(其中b是批量大小 - 我& #39; m从你在维度3上拆分output_img这一事实推断出这一点。您可以使用tf.expand_dims()zero_one_mask播放到channels,方法是将其重新整理为m x n x 1张量:

with tf.variable_scope('apply_mask') as scope:
  # Output mask is in range [-1, 1], bring to range [0, 1] first
  # NOTE: Assumes `output_mask` is a 2-D `m x n` tensor.
  zero_one_mask = tf.expand_dims((output_mask + 1) / 2, 2)
  # Apply mask to all channels.
  # NOTE: Assumes `output_img` is a 4-D `b x m x n x c` tensor.
  output_img = tf.mul(output_img, zero_one_mask)

(*如果output_img是4-D b x m x n x c(对于任意数量的频道c)或3-D m x n x c张量,这将同等有效广播的方式。)