artwork by Style of Kandinsky transfer to Ralph McQuarrie "Robot Dream"

Deep Dream with Caffe on Windows 10


Deep Dream is an algorithm that makes an pattern detection algorithm over-interpret patterns. The Deep Dream algorithm is a modified neural network. Instead of identifying objects in an input image, it changes the image into the direction of its training data set, which produces impressive surrealistic, dream-like images. (read the original Google blog https://research.googleblog.com/2015/06/inceptionism-going-deeper-into-neural.html)

The result are beautiful hallucinations like the one below. The neural network amplified the perceived objects that it is being trained to recognized. I wondered if this is the same effects on our visual cortex subdued by some drugs?

Deep Dream Transform

Figure. Vangogh’s “Starry Night” Deep Dream transformation

This article is a continuation of my previous blog on Deep Learning with GPU on Windows 10. You may want to read how to setup NVidia CUDA 8.0 to utilize your GPU for speeding up Deep Dream calcuations.

Caffe

http://caffe.berkeleyvision.org

Caffe is perhaps the first mainstream industry-grade deep learning toolkit, started in late 2013, due to its excellent convolutional neural network implementation (at the time). It is still the most popular toolkit within the computer vision community, with many extensions being actively added. Especially, there are many popular pre-trained neural network (aka. Caffe Model Zoo) can be easily downloaded and used.

The Deep Dream script is using Google’s award winning entry of ILSVRC 2014 GoogLeNet, a 22 layers deep network trained to regconize images. (explained in http://joelouismarino.github.io/blog_posts/blog_googlenet_keras.html) GoogLeNet achieved the classification of the ImageNet dataset (all sorts of animals, household objects, vehicles, etc.), 93.33% of the time the correct object class will be contained in the GoogLeNet ensemble’s top five predictions.

GoogLeNet CNN Diagram

Figure. Showing the GoogLeNet CNN 22 layers deep network

The Caffe’s pre-trained model that we downloaded and used is the iteration 2,400,000 snapshot (60 epochs) using quick_solver.prototxt.

name caffemodel caffemodel_url
BVLC GoogleNet Model bvlc_googlenet.caffemodel http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel

Further Caffe info can be found:

Prepare Python Virtual Environment

https://www.continuum.io/downloads

Note: this article assumes you are using bash shell on Windows. The recommended bash shell comes from Git for Windows https://git-for-windows.github.io installation.

You can install either Anaconda Python 2.7 or Anaconda Python 3.5 on Windows 10. Later, we would create a virtual environment to isolate our Deep Dream tools installation. We shall refer to your Anaconda installation location as {path_to_anaconda_location} later.

Define Anaconda Virtual Environment

By experience, hacking on a new tools suite are usually messy and full of conflicts. Using an isolated Python virtual environment will protect you from headaches and disaster of installations. In bash shell, enter the following where caffe (or your choice of name) is the name of the virtual environment, and python=2.7 is the Python version you wish to use.

conda create -n caffe python=2.7 anaconda

Press y to proceed. This will install the Python version and all the associated anaconda packaged libraries at {path_to_anaconda_location}/envs/caffe

Install Support Packages on Virtual Environment

Once the caffe virtual environment has been installed, activate the virtualenv by

source activate caffe

Continue to install all the shell script commands,

conda install boost
conda install mingw libpython

Then install Caffe’s dependencies

conda install --yes numpy scipy matplotlib scikit-image pip six

also you will need a Google’s protobuf python package that is compatible with pre-built dependencies. This package can be installed this way:

conda install --yes --channel willyd protobuf==3.1.0

Install Caffe on Windows 10

The lazy way to install Caffe on Windows 10 is downloading the prebuilt binaries from Caffe’s Windows branch on Github: https://github.com/BVLC/caffe/tree/windows

For my Windows 10 setup, I can choose either of these,

  • Visual Studio 2015, CUDA 8.0, Python 3.5: Caffe Release (64 bits)
  • Visual Studio 2015, CUDA 8.0, Python 2.7: Caffe Release (64 bits)

Since we have created the Anaconda Python 2.7 virtual environment to host our experiment, we choose to install Visual Studio 2015, CUDA 8.0, Python 2.7: Caffe Release package.

After completing the install, ensure to add the following into your Windows’s environment variable, {path_to_caffe} refers to Caffe’s installation.

PYTHONPATH={path_to_caffe}\caffe\python

Deep Dream Python Script

Install Deep Dream Script

You can clone the Deep Dream script from GitHub repository https://github.com/bennycheung/PyDeepDream

git clone https://github.com/bennycheung/PyDeepDream.git

([2017/08/02] make correction to the git repository path to PyDeepDream.git)

Then install of the Deep Dream script’s dependencies from requirements.txt list

cd PyDeepDream
conda install --yes --file requirements.txt

See the commandline options,

python deepdream.py --help

Install the GoogLeNet Caffe pre-trained model

cd PyDeepDream
mkdir bvlc_googlenet
cd bvlc_googlenet

download from http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel (~54 MB) and save the model here at bvlc_googlenet/bvlc_googlenet.caffemodel. The deepdream.py assumes it can find the model there.

How to Use

Don’t forget to activate your prepared caffe virtual environment.

source activate caffe

Use -i to specify your input content image. It will deep dream at a random layer.

python deepdream.py -i {your_image}.jpg

If you want to start Deep Dream at a layer depth, type and octave manually:

python deepdream.py -d 1 -t 1 -o 6 -i Style_StarryNight.jpg

Running All Layers Experiment

We are using -d to define which layer that we shall perform the Deep Dream. The level number will be mapped to a GoogLeNet layer name.

# Level 1 - inception_3a_1x1
python deepdream.py -d 1 -t 1 -o 6 -i Style_StarryNight.jpg

# Level 2 - inception_3b_1x1
python deepdream.py -d 2 -t 1 -o 6 -i Style_StarryNight.jpg

# Level 3 - inception_4a_1x1
python deepdream.py -d 3 -t 1 -o 6 -i Style_StarryNight.jpg

# Level 5 - inception_4c_1x1
python deepdream.py -d 5 -t 1 -o 6 -i Style_StarryNight.jpg

# Level 7 - inception_4e_1x1
python deepdream.py -d 7 -t 1 -o 6 -i Style_StarryNight.jpg

# Level 9 - inception_5b_1x1
python deepdream.py -d 9 -t 1 -o 6 -i Style_StarryNight.jpg

The output dream images are stored with the original photo and tagged with a inception layer name. For example, Style_StarryNight.jpg with -d 1 will produce the Deep Dream result Style_StrarryNight_inception_3a_1x1_dream.jpg.

Here are the images of the Deep Dreaming,

Deep Dream Layers

Figure. Deep Dream results from the inception into different levels of the neural network. Lower levels amplify the NN patterns. Higher levels amplify the NN objects

Deep Dream on the Raspberry Pi 3

Deep Dream can actually be run on the Raspberry Pi 3 and Raspbian Jessie; find out how from this excellent tutorial:

http://www.knight-of-pi.org/deepdream-on-the-raspberry-pi-3-with-raspbian-jessie/

Notes: Running on Raspberry Pi 3 is not fast (as expected due to a weaker CPU and no GPU acceleration). Each snapshot will take 5 to 20 minutes. Also due to the memory limitation, it can not Deep Dream beyond layer level 6 (i.e. inception_4d_1x1 is the limit).