vinthony / ghost-free-shadow-removal

[AAAI 2020] Towards Ghost-free Shadow Removal via Dual Hierarchical Aggregation Network and Shadow Matting GAN
https://arxiv.org/abs/1911.08718
297 stars 59 forks source link

Mismatch between the current graph and the graph from the checkpoint. #9

Closed evanlym closed 4 years ago

evanlym commented 4 years ago

Hi,

I tried to load the srd+ pretrained model to the DHAN (downloaded from this link: https://drive.google.com/uc?id=1rEIWWLwEpbZGPyFUc9jSIQr78ZeQy5eZ), however, I get this error: tensorflow.python.framework.errors_impl.InvalidArgumentError: Restoring from checkpoint failed. This is most likely due to a mismatch between the current graph and the graph from the checkpoint. Please ensure that you have not altered the graph expected based on the checkpoint.

This error doesn't occur when I only load the generator. So it seems that the discriminator model in the code doesn't match with the model from the checkpoint. If so, could you please update the pretrained model so that they match?

Thanks a lot.

vinthony commented 4 years ago

Hi, thanks for your attention.

We have tested two different discriminators in shadow removal. One is the default patch-based discriminator in this repo. Another is the fully-connected discriminator. However, we have not found any difference in this task. you can try to use the fc_discriminator by the following code:

def fc_discriminator(discrim_inputs,discrim_targets):
    n_layers = 4
    layers = []
    input = tf.concat([discrim_inputs, discrim_targets], axis=3)
    # 2x [batch, height, width, in_channels] => [batch, height, width, in_channels * 2]
    # layer_1: [batch, 256, 256, in_channels * 2] => [batch, 128, 128, ndf]
    with tf.variable_scope("layer_1"):
        convolved = conv(input, channel, stride=2)
        rectified = lrelu(convolved, 0.2)
        layers.append(rectified)

    # layer_2: [batch, 128, 128, ndf] => [batch, 64, 64, ndf * 2]
    # layer_3: [batch, 64, 64, ndf * 2] => [batch, 32, 32, ndf * 4]
    # layer_4: [batch, 32, 32, ndf * 4] => [batch, 16, 16, ndf * 8]
    # layer_5: [batch, 16, 16, ndf * 4] => [batch, 8, 8, ndf * 8]
    for i in range(n_layers):
        with tf.variable_scope("layer_%d" % (len(layers) + 1)):
            out_channels = channel * min(2**(i+1), 8)
            convolved = conv(layers[-1], out_channels, stride=2)
            normalized = batchnorm(convolved)
            rectified = lrelu(normalized, 0.2)
            layers.append(rectified)

    # layer_5: [batch, 8, 8, ndf * 8] => [batch, 1]
    with tf.variable_scope("layer_%d" % (len(layers) + 1)):
        # avg pooling
        avg = tf.reduce_mean(rectified, axis=[1,2])
        acg = tf.contrib.layers.flatten(avg)
        convolvedX = tf.contrib.layers.fully_connected(acg,1,activation_fn=None)
        convolved = tf.nn.sigmoid(convolvedX)
        layers.append(convolved)

    return layers[-1],layers
evanlym commented 4 years ago

This works, thank you!