def eval_s_grad(layer, style):
     nonlocal loss
     current_gram = gram_matrix(self.data[layer])
     n, mh, mw = self.data[layer].shape
     feat = self.data[layer].reshape((n, mh * mw))
     gram_diff = current_gram - style.grams[layer]
     s_grad = self._arr_pool.array_like(feat)
     np.dot(gram_diff, feat, s_grad)
     s_grad = s_grad.reshape((n, mh, mw))
     loss += lw * style_weight[layer] * norm2(gram_diff) / len(
         self.styles) / 2
     axpy(lw * style_weight[layer] / len(self.styles),
          normalize(s_grad), self.diff[layer])
    def preprocess_images(self,
                          pool,
                          content_images,
                          style_images,
                          content_layers,
                          style_layers,
                          tile_size=512,
                          roll=None):
        """Performs preprocessing tasks on the input images."""
        # Construct list of layers to visit during the backward pass
        layers = []
        for layer in reversed(self.layers()):
            if layer in content_layers or layer in style_layers:
                layers.append(layer)

        # Prepare Gram matrices from style images
        if roll is None:
            print_('Preprocessing the style image(s)...')
        for image in style_images:
            grams = {}
            self.set_image(image)
            roll2(self.img, roll)
            feats = self.prepare_features(pool,
                                          style_layers,
                                          tile_size,
                                          passes=1)
            for layer in feats:
                grams[layer] = gram_matrix(feats[layer])
            self.styles.append(StyleData(grams))

        # Prepare feature maps from content image
        if roll is None:
            print_('Preprocessing the content image(s)...')
            n = 10
        else:
            n = 1
        for image in content_images:
            self.set_image(image)
            roll2(self.img, roll)
            feats = self.prepare_features(pool,
                                          content_layers,
                                          tile_size,
                                          passes=n)
            self.contents.append(ContentData(feats))
Example #3
0
    def preprocess_images(self,
                          pool,
                          content_images,
                          style_images,
                          content_layers,
                          style_layers,
                          tile_size=512,
                          roll=None):
        """Performs preprocessing tasks on the input images."""
        # Construct list of layers to visit during the backward pass
        layers = []
        for layer in reversed(self.layers()):
            if layer in content_layers or layer in style_layers:
                layers.append(layer)

        # Prepare Gram matrices from style images
        if roll is None:
            print('Preprocessing the style image(s)...')

        sizes = [None]
        if ARGS.style_multiscale:
            vmin, vmax = ARGS.style_multiscale
            size = vmax
            sizes = [vmax]
            while True:
                size = int(round(size / np.sqrt(2)))
                if size < max(32, vmin):
                    break
                sizes.append(size)

        if not self.styles:
            grams = {}
            count = 0
            for i, image in enumerate(style_images):
                scale_too_big_cond = False
                for size in reversed(sizes):
                    if scale_too_big_cond:
                        break
                    if size:
                        image_scaled = resize_to_fit(image, size)
                        if max(image_scaled.size) == max(image.size):
                            scale_too_big_cond = True
                        if min(image_scaled.size) < 32:
                            continue
                        self.set_image(image_scaled)
                        h, w = image_scaled.size
                        print('Processing style {} at {}x{}.'.format(
                            i + 1, h, w))
                    else:
                        self.set_image(image)
                    roll2(self.img, roll)
                    feats = self.prepare_features(pool,
                                                  style_layers,
                                                  tile_size,
                                                  passes=1)
                    for layer in feats:
                        gram = gram_matrix(feats[layer])
                        if layer not in grams:
                            grams[layer] = gram
                        else:
                            grams[layer] += gram
                    count += 1
            for gram in grams.values():
                gram /= count
            self.styles.append(StyleData(grams))

        # Prepare feature maps from content image
        if roll is None:
            print('Preprocessing the content image(s)...')
            n = 10
        else:
            n = 1
        for image in content_images:
            self.set_image(image)
            roll2(self.img, roll)
            feats = self.prepare_features(pool,
                                          content_layers,
                                          tile_size,
                                          passes=n)
            self.contents.append(ContentData(feats))