Supplemental Material to Neural Texture Synthesis with Guided Correspondence

This supplemental material is mainly to specify the detailed configurations of the experiments mentioned in the paper and show more additional results. Running time statistics on uncontrolled texture synthesis are also listed in the end.

 

Notations

Before describing the settings, we first explain the parameter notations involved in our method.

Uncontrolled Texture Synthesis

For uncontrolled texture synthesis, we use the following configuration:

sourceImageShortSize=256, targetImageSize=[512,512], multiScales=[0.25, 0.5, 0.75, 1], iterationPerScales=500, vggLayers=['r11', 'r21', 'r31', 'r41'], patchSize=7, stride=3, lambdaOcc=0.05, h=0.5.

As mentioned in the paper, we have collected 50 texture images from [Zhou et al. 2018] for experiments. And we have conducted both qualitative and quantitative comparisons to 5 existing approaches.

Here we show all the results of 50 examples produced by the 6 methods: Link for More Results 🖼️.

image-20220519054738750

 

Controlled Texture Synthesis

Annotation control

For annotation control, we use the following configuration:

sourceImageShortSize=256, targetImageSize=[512,512], multiScales=[1], iterationPerScales=2000, vggLayers=['r11', 'r21', 'r31', 'r41'], patchSize=7, stride=3, lambdaOcc=0.05, lambdaGC[anno]=10, h=0.5.

Note that we didn't use the multi-scale synthesis for this task, as we want to make sure the texture follows the fine details specified in the target annotation.

Here are more results and comparisons on annotation control: Link for More Results 🖼️.

image-20220519054841918

 

Progression control

For progression control, we use the following configuration:

sourceImageShortSize=*, targetImageSize=[512,512], flip_augmentation=True, multiScales=[0.25, 0.5, 0.75, 1], iterationPerScales=500, vggLayers=['r21', 'r31', 'r41'], patchSize=7, stride=3, lambdaOcc=0.05, lambdaGC[prog]=10, h=0.5.

For a better comparison, we didn't resize the example textures to match the settings of [Zhou et al. 2017]. Still, the target image size is set to [512, 512]. Considering the target progression map may differs a lot from the source progression, we flip the source image vertically and horizontally to enhance the patch diversity and get four augmented source image copies. All these source copies are then fed to VGG to extract features. Note that patch features corresponding to the same sample location on the original source texture (the coordinate of the flipped copy should also be flipped accordingly) are aggregated as an augmentation set to that source sample.

Here are more results and comparisons on progression control: Link for More Results 🖼️.

image-20220519054927402

 

Orientation control

For orientation control, we use the following configuration:

sourceImageShortSize=*, targetImageSize=[512,512], rotate_augmentation=True, multiScales=[0.25, 0.5, 0.75, 1], iterationPerScales=500, vggLayers=['r21', 'r31', 'r41'], patchSize=7, stride=3, lambdaOcc=0.05, lambdaGC[orient]=5, h=0.5.

To make the source patches account for possible orientation changes required in the target orientation field, we augment the source image with 8 rotated copies, where each is rotated by 45 degree. Again, patch features corresponding to the same sample location on the original source texture are aggregated as an augmentation set to that source sample.

Here are more results and comparisons on orientation control: Link for More Results 🖼️.

image-20220519054953010

 

Two controls

For two controls, we use the following configuration:

sourceImageShortSize=*, targetImageSize=[512,512], rotate_augmentation=True, multiScales=[0.25, 0.5, 0.75, 1], iterationPerScales=500, vggLayers=['r21', 'r31', 'r41'], patchSize=7, stride=3, lambdaOcc=0.05, lambdaGC[prog]=10, lambdaGC[orient]=1, h=0.5.

The settings are almost the same as orientation control, where each source sample has an augmentation set of 8 rotated copies.

Here are more results and comparisons on two controls: Link for More Results 🖼️.

image-20220519055027890

 

Training feedforward networks

The Guided correspondence loss can be used to train feedforward networks. Here we describe how we train generative models for uncontrolled/controlled texture synthesis.

Uncontrolled synthesis network

We use the Pytorch Implementation of TextureNets as the generator. We only modify the loss function from Gram to our Guided Correspondence loss. All other settings remain unchanged. The parameters in the Guided Correspondence loss are as follows:

sourceImageShortSize=256, targetImageSize=256, vggLayers=['r21', 'r31', 'r41'], patchSize=3, stride=2, lambdaOcc=0.05, h=0.5.

Here are more results on real-time control: Link for More Results 🖼️.

image-20220520222017147

 

Controlled synthesis network

Controlled synthesis based on conditional GANs are tested in this experiment. Specifically, we use the Official Code of SPADE as our generative model, where progression maps or orientation fields can be directly fed into its network as the condition.

As described in the paper, we train the SPADE by two stages. In the first stage of reconstruction training (the first 20k training iterations), all the original losses used in SPADE are kept unchanged. Then in the second stage of random synthesis training (the next 20k training iterations), we first generate a lot of random target progression or orientation maps using the code below.

For this random synthesis training, we add the Guided Correspondence loss to complement the conditional-GAN loss. We set the weight balancing the two losses as lambda_gcd=5, lambda_gan=1. The high weight of Guided Correspondence loss makes it serve as a strong regularizer for stablizing the training process.

And the configuration of the Guided Correspondence loss is as follows:

vggLayers=['r21', 'r31', 'r41'], patchSize=3, stride=2, lambdaOcc=0.05, h=0.5.

In progression control, we set lambdaGC[prog]=5. In orientation control, we set lambdaGC[orient]=1.

Here are more results on real-time controlled synthesis: Link for Progression Control 🖼️ and Link for Orientation Control 🖼️.

image-20220519073238805

 

Texture transfer

For texture transfer, we use the following configuration:

sourceImageShortSize=256, targetImageShortSize=512, multiScales=[1], iterationPerScales=2000, vggLayers=['r11', 'r21', 'r31', 'r41'], patchSize=3, stride=2, lambdaOcc=0.05, lambdaContent=10, h=0.2.

In this task, the Guided Correspondence loss is used as a general textural loss. Texture transfer is performed by incorporating the content loss proposed by [Gatys et al. 2015a]. We initialize the target image using the content image. The weight of content loss should be relatively large to preserve the structure of the content image.

 

Image inpainting

For image inpainting ,we use the following configuration:

sourceImageShortSize=*, targetImageSize=*, multiScales=[0.25, 0.5, 0.75, 1], iterationPerScales=500, vggLayers=['r21', 'r31', 'r41'], patchSize=7, stride=3, lambdaOcc=0.05, h=0.5.

Inpainting aims to fill holes in an image with source patches only from the remaining region of the same image. Note that the occurrence penalty is switched off for a more continuous color across the seams of hole borders in this experiment.

 

Running Time

The average running time of different methods for uncontrolled texture synthesis is reported here. We randomly pick 10 images from our dataset, use the default settings for all methods, and record their running time (seconds):

METHODSelf-tuningCNNMRFSliced WassersteinTexExpSinGANOurs
AVERAGE TIME (s)226.18210.18484.60(5160.71)(6180.24)313.28

where () represents total time for training the network.