1. StyleTransferSweep
  2. Resolution 300.0
    1. 1
    2. 2
    3. 3
    4. 4
    5. 5

StyleTransferSweep

Paints a series of images, each to match the content of one while using:
  1. A linear combination of two styles
  2. Random noise initialization
  3. Standard VGG16 layers
  4. Operators to match content and constrain and enhance style
  5. Progressive resolution increase
The parameters for each frame are fixed and randomly initialized, but the style used sweeps between two reference images over the animation.

Code from StyleTransferSweep.scala:69 executed in 0.00 seconds (0.000 gc):

      implicit val _ = log
      // First, basic configuration so we publish to our s3 site
      log.setArchiveHome(URI.create(s"s3://$s3bucket/${getClass.getSimpleName.stripSuffix("$")}/${log.getId}/"))
      log.onComplete(() => upload(log): Unit)
      // Fetch input images (user upload prompts) and display rescaled copies
      log.p(log.jpg(ImageArtUtil.load(log, contentUrl, maxResolution), "Input Content"))
      log.p(log.jpg(ImageArtUtil.load(log, styleAUrl, (maxResolution * Math.sqrt(magnification)).toInt), "Input Style A"))
      log.p(log.jpg(ImageArtUtil.load(log, styleBUrl, (maxResolution * Math.sqrt(magnification)).toInt), "Input Style B"))
      def frames = keyframes * 2 - 1
      val canvases = (1 to frames).map(_ => new AtomicReference[Tensor](null)).toList
      // Execute the main process while registered with the site index
      val registration = registerWithIndexGIF_Cyclic(canvases.map(_.get()))
      try {
        animate(contentUrl, initUrl, canvases, log.eval(() => (1 to frames).map(f => f.toString -> {
          var coeffA = Math.pow(separation, (f.toDouble / frames) - 0.5)
          var coeffB = 1.0 / coeffA
          val mag = coeffA + coeffB
          coeffA = coeffA / mag
          coeffB = coeffB / mag
          val styleLayers = List(
            // We select all the lower-level layers to achieve a good balance between speed and accuracy.
            VGG16.VGG16_0,
            VGG16.VGG16_1a,
            VGG16.VGG16_1b1,
            VGG16.VGG16_1b2,
            VGG16.VGG16_1c1,
            VGG16.VGG16_1c2,
            VGG16.VGG16_1c3
          )
          new VisualStyleNetwork(
            // This primary component accounts for style A
            styleLayers = styleLayers,
            styleModifiers = List(
              // These two operators are a good combination for a vivid yet accurate style
              new GramMatrixEnhancer().scale(coeffA),
              new MomentMatcher().scale(coeffA)
            ),
            styleUrl = List(styleAUrl),
            magnification = magnification
          ) + new VisualStyleNetwork(
            styleLayers = styleLayers,
            styleModifiers = List(
              // We use the same two operators in the alternate component, which calculates the style B
              new GramMatrixEnhancer().scale(coeffB),
              new MomentMatcher().scale(coeffB)
            ),
            styleUrl = List(styleBUrl),
            magnification = magnification
          ).withContent(
            contentLayers = List(
              VGG16.VGG16_1b2
            ),
            contentModifiers = List(
              new ContentMatcher()
            ))
        }).toList), new BasicOptimizer {
          override val trainingMinutes: Int = 60
          override val trainingIterations: Int = 30
          override val maxRate = 1e9
        }, new GeometricSequence {
          override val min: Double = minResolution
          override val max: Double = maxResolution
          override val steps = StyleTransferSweep.this.steps
        }.toStream.map(_.round.toDouble))
        null
      } finally {
        registration.foreach(_.stop()(s3client, ec2client))
      }
    }

Returns:

    <function0>

Input Content

Input Style A

Input Style B

Code from StyleTransferSweep.scala:83 executed in 0.79 seconds (0.000 gc):

    var coeffA = Math.pow(separation, (f.toDouble / frames) - 0.5)
    var coeffB = 1.0 / coeffA
    val mag = coeffA + coeffB
    coeffA = coeffA / mag
    coeffB = coeffB / mag
    val styleLayers = List(
      // We select all the lower-level layers to achieve a good balance between speed and accuracy.
      VGG16.VGG16_0,
      VGG16.VGG16_1a,
      VGG16.VGG16_1b1,
      VGG16.VGG16_1b2,
      VGG16.VGG16_1c1,
      VGG16.VGG16_1c2,
      VGG16.VGG16_1c3
    )
    new VisualStyleNetwork(
      // This primary component accounts for style A
      styleLayers = styleLayers,
      styleModifiers = List(
        // These two operators are a good combination for a vivid yet accurate style
        new GramMatrixEnhancer().scale(coeffA),
        new MomentMatcher().scale(coeffA)
      ),
      styleUrl = List(styleAUrl),
      magnification = magnification
    ) + new VisualStyleNetwork(
      styleLayers = styleLayers,
      styleModifiers = List(
        // We use the same two operators in the alternate component, which calculates the style B
        new GramMatrixEnhancer().scale(coeffB),
        new MomentMatcher().scale(coeffB)
      ),
      styleUrl = List(styleBUrl),
      magnification = magnification
    ).withContent(
      contentLayers = List(
        VGG16.VGG16_1b2
      ),
      contentModifiers = List(
        new ContentMatcher()
      ))

Returns:

    List((1,com.simiacryptus.mindseye.art.util.VisualNetwork$$anon$2@53a84ff4), (2,com.simiacryptus.mindseye.art.util.VisualNetwork$$anon$2@7ce85af2), (3,com.simiacryptus.mindseye.art.util.VisualNetwork$$anon$2@316acbb5), (4,com.simiacryptus.mindseye.art.util.VisualNetwork$$anon$2@56f730b2), (5,com.simiacryptus.mindseye.art.util.VisualNetwork$$anon$2@47311277))

Resolution 300.0

1

Subreport: Optimization

2

Subreport: Optimization

3

Subreport: Optimization

4

Subreport: Optimization

5

Subreport: Optimization