HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

2018/08/04

【ビルド版】Raspberry Piで DeepDreamを動かしてキモイ絵をモリモリ量産 Caffe Deep Learning Framework 【ビルド版】Raspberry Piで DeepDreamを動かしてキモイ絵をモリモリ量産 Caffe Deep Learning Framework

(ラズパイで Caffe Deep Learning Frameworkをビルドして Deep Dreamを動かしてキモイ絵を生成する)

Tags: [Raspberry Pi], [電子工作], [ディープラーニング]





● Raspberry Piで Google DeepDreamを動かしてキモイ絵を量産する

 Raspberry Piで DeepDreamを動かせる事を知ったので動かしてみます。生成速度は超遅いです。また、ラズパイはメモリが少ないので 1024x575pxのサイズで 1時間掛かります。

 Raspberry Piで Google DeepDreamを動かして一時期流行したキモイ絵を量産します。

DeepDream - Wikipedia

 DeepDreamで生成した画像の例(Wikipediaより引用)
・DeepDream
DeepDream




● Raspberry Piで Google DeepDreamを動かしてキモイ絵を量産する方法

 DeepDreamを動かすには Caffeと言う Deep Learning Frameworkを使用します。
 Caffeは apt-getでもインストールできますが、その後に DeepDreamを動かす方法が分からないのでビルドする方法を取ります。
 (apt-getでインストールした Caffeの場合は PYTHONPATHと LD_LIBRARY_PATHへのパス設定は不要)


● Raspberry Piで Caffe Deep Learning Frameworkをビルド不要で DeepDreamする方法

2018/08/04
【インストール版】Raspberry Piで DeepDreamを動かしてキモイ絵をモリモリ量産 Caffe Deep Learning
【インストール版】Raspberry Piで DeepDreamを動かしてキモイ絵をモリモリ量産 Caffe Deep Learning

  ラズパイで Caffe Deep Learning Frameworkをインストールして Deep Dreamを動かしてキモイ絵を生成する


●今回動かした Raspberry Pi Raspbian OSのバージョン

 RASPBIAN STRETCH WITH DESKTOP
 Version:June 2018
 Release date: 2018-06-27
 Kernel version: 4.14
pi@raspberrypi:~/pytorch $ uname -a
Linux raspberrypi 4.14.50-v7+ #1122 SMP Tue Jun 19 12:26:26 BST 2018 armv7l GNU/Linux


● Raspberry Piで Caffe Deep Learning Frameworkをビルドする

Caffe - Deep Learning Framework

BVLC/caffe
 Caffe: a fast open framework for deep learning. http://caffe.berkeleyvision.org/

 BVLC = Berkeley Vision and Learning Center(カリフォルニア大学バークレー校)

Caffeの作者 Yangqing Jia氏
 Facebookに入り、後継の Caffe2になった。(ざっくりな経緯解説。時系列は未確認)

● caffeのビルド方法の情報源

 下記の caffe公式のインストール手順書を見ながらラズパイ環境に合わせて総合的に読み砕き応用して試行錯誤で Caffe Deep Learning Frameworkをビルドします。
Caffe - Installation
Caffe - Ubuntu Installation

● Installation
● Prerequisites
 BLAS via ATLAS, MKL, or OpenBLAS.
 Boost >= 1.55
 protobuf, glog, gflags, hdf5

● Pycaffe interfaces have their own natural needs.
 For Python Caffe: Python 2.7 or Python 3.3+, numpy (>= 1.7), boost-provided boost.python

● CPU-only Caffe
 for cold-brewed CPU-only Caffe uncomment the CPU_ONLY := 1 flag in Makefile.config to configure and build Caffe without CUDA. This is helpful for cloud or cluster deployment.

● BLAS
 OpenBLAS: free and open source; this optimized and parallel BLAS could require more effort to install, although it might offer a speedup.
 Install OpenBLAS
 Set BLAS := open in Makefile.config

● Python Caffe (optional)
 The main requirements are numpy and boost.python (provided by boost). pandas is useful too and needed for some examples.
 You can install the dependencies with
 pip install -r requirements.txt

● Compilation with Make
cp Makefile.config.example Makefile.config
# Adjust Makefile.config (for example, if using Anaconda Python, or if cuDNN is desired)
make all
make test
make runtest

● Ubuntu Installation
● General dependencies
sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libhdf5-serial-dev protobuf-compiler
sudo apt-get install --no-install-recommends libboost-all-dev
sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev

● BLAS
 install ATLAS by
sudo apt-get install libatlas-base-dev

 install OpenBLAS by
sudo apt-get install libopenblas-dev

 MKL for better CPU performance.
※ MKLはラズパイでは関係有りません(Intel CPU専用)

● Python (optional)
 if you use the default Python you will need to
sudo apt-get install python-dev
 package to have the Python headers for building the pycaffe interface.
# glog
wget https://github.com/google/glog/archive/v0.3.3.tar.gz
tar zxvf v0.3.3.tar.gz
cd glog-0.3.3
./configure
make && make install

# gflags
wget https://github.com/schuhschuh/gflags/archive/master.zip
unzip master.zip
cd gflags-master
mkdir build && cd build
export CXXFLAGS="-fPIC" && cmake .. && make VERBOSE=1
make && make install

# lmdb
git clone https://github.com/LMDB/lmdb
cd lmdb/libraries/liblmdb
make && make install


●メモリを沢山使うので不要なサービス等を停止して使えるメインメモリを増やす

 ビルドの前に行なうとビルド処理に対しても有利


2018/08/14
Raspberry Piでメモリを馬鹿食いするアプリ用に不要なサービスを停止してフリーメモリを増やす方法
Raspberry Piでメモリを馬鹿食いするアプリ用に不要なサービスを停止してフリーメモリを増やす方法

  ラズパイでメモリを沢山使用するビルドやアプリ用に不要なサービス等を停止して使えるメインメモリを増やす


● Raspberry Piで Caffe Deep Learning Frameworkをビルドする。

# ラズパイでお決まりの sudo apt-get update
sudo apt-get update

# BVLC/caffeの Gitからソースリスト一式を clone(ダウンロード)する
cd
git clone https://github.com/BVLC/caffe.git --depth 1
cd
cd caffe

# Makefile.configファイルを作成(参考例のファイルからコピー)する
cp Makefile.config.example Makefile.config
# Adjust Makefile.config (for example, if using Anaconda Python, or if cuDNN is desired)

# Makefile.configファイルをラズパイ環境に合わせて編集する
nano Makefile.config

# ラズパイ環境は演算処理に CPUしか使えないので CPU_ONLY := 1の行のコメント文字#を取って有効にする
# CPU-only switch (uncomment to build without GPU support).
CPU_ONLY := 1

# BLAS(Basic Linear Algebra Subprograms、ベクトルと行列に関する数値演算ライブラリの名称)
# 今回は BLASライブラリとして ATLAS実装(Automatically Tuned Linear Algebra Software)を使用します
# BLAS choice:
# atlas for ATLAS (default)
# mkl for MKL
# open for OpenBlas
BLAS := atlas
# BLAS := open

# hdf5関係で「ファイルが見つからないエラー」が出るのでパスを設定する
# https://support.hdfgroup.org/HDF5/
# Whatever else you find you need goes here.
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/arm-linux-gnueabihf/hdf5/serial

# コマンドラインでサクッと Makefile.configファイルを変更する
sed -i 's/# CPU_ONLY := 1/CPU_ONLY := 1/' Makefile.config
sed -i 's/BLAS :=.*/BLAS := atlas/' Makefile.config
sed -i 's/^INCLUDE_DIRS :=.*/INCLUDE_DIRS := $(PYTHON_INCLUDE) \/usr\/local\/include \/usr\/include\/hdf5\/serial/' Makefile.config
sed -i 's/^LIBRARY_DIRS :=.*/LIBRARY_DIRS := $(PYTHON_LIB) \/usr\/local\/lib \/usr\/lib \/usr\/lib\/arm-linux-gnueabihf\/hdf5\/serial/' Makefile.config

# 編集内容を確認する
grep "BLAS " Makefile.config
grep "CPU" Makefile.config
grep "_DIRS :" Makefile.config
# 編集内容を確認する
pi@raspberrypi:~/caffe $ grep "BLAS " Makefile.config
# BLAS choice:
BLAS := atlas

pi@raspberrypi:~/caffe $ grep "CPU" Makefile.config
# CPU-only switch (uncomment to build without GPU support).
CPU_ONLY := 1

pi@raspberrypi:~/caffe $ grep "_DIRS :" Makefile.config
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/arm-linux-gnueabihf/hdf5/serial

● (1) 事前に Caffeのビルドに必要なライブラリ等を apt-get installする
sudo apt-get -y install protobuf-compiler libprotoc-dev libboost-dev libgflags-dev libgoogle-glog-dev

# Makefile.config, BLAS := atlas
sudo apt-get -y install libatlas-base-dev
# Makefile.config, BLAS := open
# sudo apt-get -y install libopenblas-dev
sudo apt-get -y install libhdf5-dev libleveldb-dev liblmdb-dev libopencv-dev libsnappy-dev
sudo apt-get -y install libboost-system-dev libboost-filesystem-dev libboost-thread-dev

● (2) make pycaffeの実行時にエラーが出ない様に必要なライブラリ等を apt-get installする
# make pycaffe
sudo apt-get -y install libboost-python-dev

● (3) deepdreamer.pyの実行時にエラーが出ない様に必要なライブラリ等を apt-get installする
# python deepdreamer.py sample.jpg
sudo apt-get -y install python-skimage python-protobuf python-numpy python-pil

●上記の (1)~(3)の apt-get installを 1行で実行する
# Makefile.config, BLAS := atlas
sudo apt-get -y install libatlas-base-dev protobuf-compiler libprotoc-dev libboost-dev libgflags-dev libgoogle-glog-dev libhdf5-dev libleveldb-dev liblmdb-dev libopencv-dev libsnappy-dev libboost-system-dev libboost-filesystem-dev libboost-thread-dev libboost-python-dev python-skimage python-protobuf python-numpy python-pil

# Makefile.config, BLAS := open
# sudo apt-get -y install libopenblas-dev
# libturbojpegをインストールする
sudo apt-get -y install libturbojpeg0 libturbojpeg0-dev
sudo ldconfig

# libboost-regex-devをインストールする
sudo apt-get -y install libboost-regex-dev

# libopenblas-base libopenblas-devをインストールする
sudo apt-get -y install libopenblas-base libopenblas-dev

●実際に caffeをビルドする
# make clean

# make all -j3で 3 coreを使ってビルド速度を高速化(4 coreはあまり意味が無い)
# make all -j3で 3 coreを使う場合は上記の「メモリ使用量を減らす」を行なう事(ビルド中にメモリ不足でエラーになる)
# 「メモリ使用量を減らす」を行なわない場合は make all -j2で 2 coreビルドが無難。
date >BUILD_START
time make all -j3
date >BUILD_END
cat BUILD_START
cat BUILD_END

# make testと make runtest
make test -j3
make runtest -j3

# Python用の Caffeの作成と distributeでビルド内容を反映
make pycaffe
make distribute

# ここまで成功すれば Caffeのビルドは完了

# 環境変数 CAFFE_HOMEに PATHを設定する
# export CAFFE_HOME=/home/pi/caffe
export CAFFE_HOME=$(pwd)

echo ${CAFFE_HOME}

# パスにビルドで作成した Caffeを追加する
export PYTHONPATH=${CAFFE_HOME}/python:$PYTHONPATH
export LD_LIBRARY_PATH=${CAFFE_HOME}/distribute/lib:$LD_LIBRARY_PATH
 ※ apt-getでインストールした Caffeの場合は PYTHONPATHと LD_LIBRARY_PATHへのパス設定は不要

pi@raspberrypi:~/caffe $ pwd
/home/pi/caffe

pi@raspberrypi:~/caffe $ export CAFFE_HOME=/home/pi/caffe

pi@raspberrypi:~/caffe $ echo $CAFFE_HOME
/home/pi/caffe


● Raspberry Pi 3B+で Caffe Deep Learning Frameworkをビルドする時の使用コア数によるビルド時間短縮の効果の比較

 Caffe Deep Learning Frameworkを Raspberry Piでビルドする時の使用コア数によるビルド時間短縮の効果を実際にビルド時間を計測して比較をしました。

 下記の結果からメモリ使用量とビルド速度との兼ね合いで 2コアまたは 3コアでビルドするのが適切と思います。4コアは「メモリ使用量」のリスクが有るのでメリットが感じられない。

 あーメモリ 2GBのラズパイ欲しい。ワンボードマイコンにギガイーサなんか要らないから!(本当は 4GB欲しいが現実路線として 2GB)

● Raspberry Piで ビルド時の使用コア数とビルド時間短縮の効果の実測結果

 Raspberry Pi 3B+、32GB SDHC Class 10 microSD Card
コア数1 core2 core3 core4 core
real25m41s14m55s11m18s9m44s
real(秒)1541秒895秒678秒584秒
user24m58s28m56s32m44s37m10s
sys0m42s0m50s0m56s1m9s
1 core時と realで比較--1.7倍2.2倍2.6倍

● make all
 -j指定無しで 1 core指定
# 1コアでビルドで 26分程度
# real 25分41秒(1541sec)で、4コア時の real 584secより 2.6倍遅いです。
# real    25m41.666s
# user    24m58.530s
# sys     0m42.284s
# Sat 11 Aug 18:00:40 UTC 2018
# Sat 11 Aug 18:26:21 UTC 2018

● make all -j2
 -j2指定で 2 core指定
# 2コアでビルドで 15分程度
# real    14m55.817s
# user    28m56.790s
# sys     0m50.334s
# Sat 11 Aug 18:30:49 UTC 2018
# Sat 11 Aug 18:45:45 UTC 2018

● make all -j3
 -j3指定で 3 core指定
 3コア時の realが 11分で userが 32分なので 3コアによる並列実行が有効に働いています。
 しかし、1コアビルドの 3倍速にはなりませんでした。
# 3コアでビルドで 11分程度
# real    11m18.701s
# user    32m44.597s
# sys     0m56.491s
# Sat 11 Aug 19:00:28 UTC 2018
# Sat 11 Aug 19:11:47 UTC 2018

● make all -j4
 -j4で 4 core指定
 4コア時の userが 37分で 1コア時の userが 25分で 12分余分に掛かっているのはメモリ SWAPによる SDカードの読み書き(I/O)がボトルネックになっているんでしょうか?
# 4コアでビルドで 10分程度
# real    9m44.505s
# user    37m10.403s
# sys     1m9.108s
# Sat 11 Aug 17:49:48 UTC 2018
# Sat 11 Aug 17:59:32 UTC 2018
pi@raspberrypi:~/caffe $ make all -j4
PROTOC src/caffe/proto/caffe.proto
CXX .build_release/src/caffe/proto/caffe.pb.cc
CXX src/caffe/solvers/nesterov_solver.cpp
CXX src/caffe/solvers/adagrad_solver.cpp
...
AR -o .build_release/lib/libcaffe.a
LD -o .build_release/lib/libcaffe.so.1.0.0
CXX/LD -o .build_release/tools/upgrade_net_proto_binary.bin
CXX/LD -o .build_release/tools/upgrade_net_proto_text.bin
CXX/LD -o .build_release/tools/upgrade_solver_proto_text.bin
CXX/LD -o .build_release/tools/convert_imageset.bin
CXX/LD -o .build_release/tools/compute_image_mean.bin
CXX/LD -o .build_release/tools/extract_features.bin
CXX/LD -o .build_release/tools/caffe.bin
CXX/LD -o .build_release/examples/siamese/convert_mnist_siamese_data.bin
CXX/LD -o .build_release/examples/cpp_classification/classification.bin
CXX/LD -o .build_release/examples/cifar10/convert_cifar_data.bin
CXX/LD -o .build_release/examples/mnist/convert_mnist_data.bin


●この時点で Caffeを動かしてみる
pi@raspberrypi:~/caffe $ ./.build_release/tools/caffe -version
caffe version 1.0.0
pi@raspberrypi:~/caffe $ ./.build_release/tools/caffe
caffe: command line brew
usage: caffe <command> <args>

commands:
  train           train or finetune a model
  test            score a model
  device_query    show GPU diagnostic information
  time            benchmark model execution time

  Flags from tools/caffe.cpp:
    -gpu (Optional; run in GPU mode on given device IDs separated by ','.Use
      '-gpu all' to run on all available GPUs. The effective training batch
      size is multiplied by the number of devices.) type: string default: ""
    -iterations (The number of iterations to run.) type: int32 default: 50
    -level (Optional; network level.) type: int32 default: 0
    -model (The model definition protocol buffer text file.) type: string
      default: ""
    -phase (Optional; network phase (TRAIN or TEST). Only used for 'time'.)
      type: string default: ""
    -sighup_effect (Optional; action to take when a SIGHUP signal is received:
      snapshot, stop or none.) type: string default: "snapshot"
    -sigint_effect (Optional; action to take when a SIGINT signal is received:
      snapshot, stop or none.) type: string default: "stop"
    -snapshot (Optional; the snapshot solver state to resume training.)
      type: string default: ""
    -solver (The solver definition protocol buffer text file.) type: string
      default: ""
    -stage (Optional; network stages (not to be confused with phase), separated
      by ','.) type: string default: ""
    -weights (Optional; the pretrained weights to initialize finetuning,
      separated by ','. Cannot be set simultaneously with snapshot.)
      type: string default: ""

● make test -j3
 -j3で 3 core指定
 3コアで実行で 19分程度
real    18m44.714s
user    52m4.221s
sys     1m43.358s
pi@raspberrypi:~/caffe $ make test -j4
CXX src/caffe/test/test_maxpool_dropout_layers.cpp
CXX src/caffe/test/test_im2col_layer.cpp
CXX src/caffe/test/test_tanh_layer.cpp
CXX src/caffe/test/test_data_transformer.cpp
...
LD .build_release/src/caffe/test/test_contrastive_loss_layer.o
LD .build_release/src/caffe/test/test_pooling_layer.o
LD .build_release/src/caffe/test/test_reshape_layer.o
LD .build_release/src/caffe/test/test_solver.o
LD .build_release/src/caffe/test/test_convolution_layer.o
LD .build_release/src/caffe/test/test_threshold_layer.o
LD .build_release/src/caffe/test/test_lrn_layer.o
LD .build_release/src/caffe/test/test_slice_layer.o
LD .build_release/src/caffe/test/test_scale_layer.o

● make runtest -j2
 -j2で 2 core指定
 2コアで実行で 5分程度
real    5m11.137s
user    4m48.411s
sys     0m2.134s
pi@raspberrypi:~/caffe $ make runtest -j4
...
[ RUN      ] UniformFillerTest/1.TestFill1D
[       OK ] UniformFillerTest/1.TestFill1D (0 ms)
[----------] 4 tests from UniformFillerTest/1 (1 ms total)

[----------] Global test environment tear-down
[==========] 1158 tests from 152 test cases ran. (302981 ms total)
[  PASSED  ] 1158 tests.

● make pycaffe
pi@raspberrypi:~/caffe $ make pycaffe
CXX/LD -o python/caffe/_caffe.so python/caffe/_caffe.cpp
touch python/caffe/proto/__init__.py
PROTOC (python) src/caffe/proto/caffe.proto

● make distribute
pi@raspberrypi:~/caffe $ make distribute
# add proto
cp -r src/caffe/proto distribute/
# add include
cp -r include distribute/
mkdir -p distribute/include/caffe/proto
cp .build_release/src/caffe/proto/caffe.pb.h distribute/include/caffe/proto
# add tool and example binaries
cp .build_release/tools/upgrade_solver_proto_text.bin .build_release/tools/upgrade_net_proto_binary.bin .build_release/tools/upgrade_net_proto_text.bin .build_release/tools/convert_imageset.bin .build_release/tools/extract_features.bin .build_release/tools/compute_image_mean.bin .build_release/tools/caffe.bin distribute/bin
cp .build_release/examples/siamese/convert_mnist_siamese_data.bin .build_release/examples/cpp_classification/classification.bin .build_release/examples/cifar10/convert_cifar_data.bin .build_release/examples/mnist/convert_mnist_data.bin distribute/bin
# add libraries
cp .build_release/lib/libcaffe.a distribute/lib
install -m 644 .build_release/lib/libcaffe.so.1.0.0 distribute/lib
cd distribute/lib; rm -f libcaffe.so;   ln -s libcaffe.so.1.0.0 libcaffe.so
# add python - it's not the standard way, indeed...
cp -r python distribute/

● distributeの内容の確認
pi@raspberrypi:~/caffe $ ls -l distribute/
total 20
drwxr-xr-x 2 pi pi 4096 Aug  8 11:08 bin
drwxr-xr-x 3 pi pi 4096 Aug  8 11:08 include
drwxr-xr-x 2 pi pi 4096 Aug  8 11:08 lib
drwxr-xr-x 2 pi pi 4096 Aug  8 11:08 proto
drwxr-xr-x 3 pi pi 4096 Aug  8 11:08 python

pi@raspberrypi:~/caffe $ ls -l distribute/bin/
total 456
-rwxr-xr-x 1 pi pi 113004 Aug  8 11:08 caffe.bin
-rwxr-xr-x 1 pi pi  61648 Aug  8 11:08 classification.bin
-rwxr-xr-x 1 pi pi  21076 Aug  8 11:08 compute_image_mean.bin
-rwxr-xr-x 1 pi pi  30064 Aug  8 11:08 convert_cifar_data.bin
-rwxr-xr-x 1 pi pi  38368 Aug  8 11:08 convert_imageset.bin
-rwxr-xr-x 1 pi pi  26464 Aug  8 11:08 convert_mnist_data.bin
-rwxr-xr-x 1 pi pi  26248 Aug  8 11:08 convert_mnist_siamese_data.bin
-rwxr-xr-x 1 pi pi  80584 Aug  8 11:08 extract_features.bin
-rwxr-xr-x 1 pi pi  14372 Aug  8 11:08 upgrade_net_proto_binary.bin
-rwxr-xr-x 1 pi pi  14364 Aug  8 11:08 upgrade_net_proto_text.bin
-rwxr-xr-x 1 pi pi  14392 Aug  8 11:08 upgrade_solver_proto_text.bin

pi@raspberrypi:~/caffe $ ls -l distribute/lib/
total 17524
-rw-r--r-- 1 pi pi 13906940 Aug  8 11:08 libcaffe.a
lrwxrwxrwx 1 pi pi       17 Aug  8 11:08 libcaffe.so -> libcaffe.so.1.0.0
-rw-r--r-- 1 pi pi  4031784 Aug  8 11:08 libcaffe.so.1.0.0

pi@raspberrypi:~/caffe $ ls -l distribute/python/
total 36
drwxr-xr-x 5 pi pi 4096 Aug  8 11:08 caffe
-rwxr-xr-x 1 pi pi 4262 Aug  8 11:08 classify.py
-rw-r--r-- 1 pi pi 1523 Aug  8 11:08 CMakeLists.txt
-rwxr-xr-x 1 pi pi 5734 Aug  8 11:08 detect.py
-rwxr-xr-x 1 pi pi 2254 Aug  8 11:08 draw_net.py
-rw-r--r-- 1 pi pi  261 Aug  8 11:08 requirements.txt
-rw-r--r-- 1 pi pi 3145 Aug  8 11:08 train.py


● Raspberry Piで Google Deep Dreamアプリを動かす

GitHub - google/deepdream
 Googleの deepdreamは IPythonと言う言語で、そのままではラズパイでは動きません。

 IPythonの deepdreamを実行する方法。

2018/08/10
Raspberry Piに Jupyter Notebookをインストールして拡張子 ipynb形式の IPythonを動かす
Raspberry Piに Jupyter Notebookをインストールして拡張子 ipynb形式の IPythonを動かす

  ラズパイに IPython Notebookをインストールして Google DeepDream dream.ipynbを動かす

 普通の Pythonで動く様に移植した下記を使用します。
kesara/deepdreamer
 Easy to configure Python program that make use of Google's DeepDream. https://deepdreamer.fq.nz/

Deep Dreamer | deepdreamer

# Python版の Google Deep Dream kesara/deepdreamerをダウンロードする
cd
git clone https://github.com/kesara/deepdreamer
cd deepdreamer

# 学習データ bvlc_googlenet.caffemodelをダウンロードする
wget http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel

# deploy.prototxtをダウンロードする
# https://github.com/BVLC/caffe/tree/master/models/bvlc_googlenet
wget https://raw.githubusercontent.com/BVLC/caffe/master/models/bvlc_googlenet/deploy.prototxt

# deploy.prototxtの一番最後に force_backward: trueの行を追加する
# nano deploy.prototxt
# force_backward: true

# コマンドラインでサクッと force_backward: trueの行を追加する
echo "force_backward: true" >> deploy.prototxt

# tailコマンドで最後に追加された事を確認する
tail deploy.prototxt

 python3で動かない。
pi@raspberrypi:~/deepdreamer $ python3 deepdreamer.py sample.jpg

Traceback (most recent call last):
  File "deepdreamer.py", line 9, in <module>
    from deepdreamer.deepdreamer import deepdream, deepdream_video, list_layers
  File "/home/pi/deepdreamer/deepdreamer/deepdreamer.py", line 11, in <module>
    from caffe import Classifier, set_device, set_mode_gpu
  File "/home/pi/DeepDream/caffe/python/caffe/__init__.py", line 1, in <module>
    from .pycaffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, RMSPropSolver, AdaDeltaSolver, AdamSolver, NCCL, Timer
  File "/home/pi/DeepDream/caffe/python/caffe/pycaffe.py", line 13, in <module>
    from ._caffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, \
ImportError: dynamic module does not define module export function (PyInit__caffe)

 python(python2)で動かない。
pi@raspberrypi:~/deepdreamer $ python deepdreamer.py sample.jpg

Traceback (most recent call last):
  File "deepdreamer.py", line 9, in <module>
    from deepdreamer.deepdreamer import deepdream, deepdream_video, list_layers
  File "/home/pi/deepdreamer/deepdreamer/deepdreamer.py", line 12, in <module>
    from deepdreamer.images2gif import writeGif
ImportError: No module named images2gif

 python(python2)で動かないので、
./deepdreamer/deepdreamer.py
 の
 images2gif import writeGifの gif動画書き出し機能を無効にする。
nano ./deepdreamer/deepdreamer.py

● 12行目をコメントにする。
# from deepdreamer.images2gif import writeGif

● 196~198行目をコメントにする。
#         writeGif(
#             "{}.gif".format(img_path), frames, duration=duration,
#             repeat=loop)

# コマンドラインでサクッと deepdreamer/deepdreamer.pyを編集する
# 196~198行目を削除する
sed '196,198d' -i ./deepdreamer/deepdreamer.py
# 12行目を削除する
sed '12d' -i ./deepdreamer/deepdreamer.py

 python(python2)で動く様になる。
pi@raspberrypi:~/deepdreamer $ python deepdreamer.py sample.jpg

● flowers.jpgで Google DeepDreamを動かしてみる
cd
cd deepdreamer
wget https://github.com/google/deepdream/raw/master/flowers.jpg

python deepdreamer.py flowers.jpg

● deepdreamer.pyの引数を指定した例
# Copy File
cp flowers.jpg flowers_3a.jpg
cp flowers.jpg flowers_3b.jpg

cp flowers.jpg flowers_4a.jpg
cp flowers.jpg flowers_4c.jpg
cp flowers.jpg flowers_4e.jpg

cp flowers.jpg flowers_5a.jpg
cp flowers.jpg flowers_5b.jpg

# 3
python deepdreamer.py flowers_3a.jpg --dreams 1 --itern 15 --layers inception_3a/output

python deepdreamer.py flowers_3b.jpg --dreams 1 --itern 15 --layers inception_3b/output

# 4
python deepdreamer.py flowers_4a.jpg --dreams 1 --itern 15 --layers inception_4a/output

python deepdreamer.py flowers_4c.jpg --dreams 1 --itern 15 --layers inception_4c/output

python deepdreamer.py flowers_4e.jpg --dreams 1 --itern 15 --layers inception_4e/output

# 5
python deepdreamer.py flowers_5a.jpg --dreams 1 --itern 15 --layers inception_5a/output

python deepdreamer.py flowers_5b.jpg --dreams 1 --itern 15 --layers inception_5b/output

● exportのディレクトリの内容の確認
pi@raspberrypi:~ $ export PYTHONPATH=/home/pi/DeepDream/caffe/python:$PYTHONPATH

pi@raspberrypi:~ $ export LD_LIBRARY_PATH=/home/pi/DeepDream/caffe/distribute/lib:$LD_LIBRARY_PATH

pi@raspberrypi:~/deepdreamer $ ls -l /home/pi/caffe/distribute/lib
total 17524
-rw-r--r-- 1 pi pi 13906940 Aug  4 12:50 libcaffe.a
lrwxrwxrwx 1 pi pi       17 Aug  4 12:50 libcaffe.so -> libcaffe.so.1.0.0
-rw-r--r-- 1 pi pi  4031784 Aug  4 12:50 libcaffe.so.1.0.0

pi@raspberrypi:~/deepdreamer $ ls -l /home/pi/caffe/python/
total 36
drwxr-xr-x 6 pi pi 4096 Aug  4 15:38 caffe
-rwxr-xr-x 1 pi pi 4262 Aug  4 08:25 classify.py
-rw-r--r-- 1 pi pi 1523 Aug  4 08:25 CMakeLists.txt
-rwxr-xr-x 1 pi pi 5734 Aug  4 08:25 detect.py
-rwxr-xr-x 1 pi pi 2254 Aug  4 08:25 draw_net.py
-rw-r--r-- 1 pi pi  261 Aug  4 08:25 requirements.txt
-rw-r--r-- 1 pi pi 3145 Aug  4 08:25 train.py


●数値演算ライブラリに OpenBLASを使うとマルチスレッドで Caffe DeepDreamが動きます

 ATLASの代わりに OpenBLASの数値演算ライブラリを使う。
 OpenBLASの数値演算ライブラリはマルチスレッドに対応している。

OpenBLAS - An optimized BLAS library
nano Makefile.config
BLAS := open

# Makefile.config, BLAS := open
sudo apt-get -y install libopenblas-dev

# 環境変数で OpenBLASライブラリを 4コアで動かす指定をする
export OPENBLAS_NUM_THREADS=4

# Setting the number of threads using environment variables
# The priorities are OPENBLAS_NUM_THREADS > GOTO_NUM_THREADS > OMP_NUM_THREADS .
# https://github.com/xianyi/OpenBLAS
export OPENBLAS_NUM_THREADS=4
export GOTO_NUM_THREADS=${OPENBLAS_NUM_THREADS}
export OMP_NUM_THREADS=${OPENBLAS_NUM_THREADS}

Dreaming...
/usr/lib/python2.7/dist-packages/scipy/ndimage/interpolation.py:568: UserWarning: From scipy 0.13.0, the output shape of zoom() is calculated with round() instead of int() - for these inputs the size of the returned array has changed.
  "the returned array has changed.", UserWarning)
Segmentation fault

export OPENBLAS_NUM_THREADS=2
Segmentation fault
マルチコアのマルチスレッドで動きません!

vcgencmd get_throttled

pi@raspberrypi:~/deepdreamer $ vcgencmd get_throttled
throttled=0x50000
Segmentation fault
マルチコアのマルチスレッドで動きません!

export OPENBLAS_NUM_THREADS=1
1を指定して 1コアで動かせば安定して動きました(意味ねー)

OpenBLAS - SEGFAULT with multi-threading
 I get a SEGFAULT with multi-threading on Linux. What's wrong ?

 This may be related to a bug in the Linux kernel 2.6.32 (?).
 Try applying the patch segaults.patch to disable mbind using
patch < segfaults.patch
 and see if the crashes persist.
 Note that this patch will lead to many compiler warnings.

OpenBLAS/segfaults.patch

diff -ruN common_linux.h.orig common_linux.h
--- common_linux.h.orig	2012-04-23 11:27:55.000000000 +0800
+++ common_linux.h	2012-05-08 23:43:00.000000000 +0800
@@ -77,7 +77,7 @@
 #else
 //Fixed randomly SEGFAULT when nodemask==NULL with above Linux 2.6.34
 //	unsigned long null_nodemask=0;
-	return syscall(SYS_mbind, addr, len, mode, nodemask, maxnode, flags);
+	return 0;
 #endif
 }


● Debian 9 Raspbian Stretchの Raspberry Piで Caffe Deep Learning Frameworkをビルドする。

 必要なライブラリを組み込んでいない状態で総当りでエラーを解決していく手順。

make: protoc: Command not found
pi@raspberrypi:~/caffe $ make all
PROTOC src/caffe/proto/caffe.proto
make: protoc: Command not found
Makefile:638: recipe for target '.build_release/src/caffe/proto/caffe.pb.cc' failed
make: *** [.build_release/src/caffe/proto/caffe.pb.cc] Error 127

# Solution
sudo apt-get -y install protobuf-compiler
sudo apt-get -y install libprotoc-dev

./include/caffe/solver.hpp:3:30: fatal error: boost/function.hpp: No such file or directory
pi@raspberrypi:~/caffe $ make all
...
CXX src/caffe/solvers/adagrad_solver.cpp
In file included from ./include/caffe/sgd_solvers.hpp:7:0,
                 from src/caffe/solvers/adagrad_solver.cpp:3:
./include/caffe/solver.hpp:3:30: fatal error: boost/function.hpp: No such file or directory
 #include <boost/function.hpp>
                              ^
compilation terminated.

# Solution
apt-cache search boost
sudo apt-get -y install libboost-dev

./include/caffe/common.hpp:5:27: fatal error: gflags/gflags.h: No such file or directory
pi@raspberrypi:~/caffe $ make all
...
CXX src/caffe/solvers/adam_solver.cpp
In file included from ./include/caffe/blob.hpp:8:0,
                 from ./include/caffe/net.hpp:10,
                 from ./include/caffe/solver.hpp:7,
                 from ./include/caffe/sgd_solvers.hpp:7,
                 from src/caffe/solvers/nesterov_solver.cpp:3:
./include/caffe/common.hpp:5:27: fatal error: gflags/gflags.h: No such file or directory
 #include <gflags/gflags.h>
                           ^
compilation terminated.
Makefile:581: recipe for target '.build_release/src/caffe/solvers/nesterov_solver.o' failed
make: *** [.build_release/src/caffe/solvers/nesterov_solver.o] Error 1

# Solution
sudo apt-get -y install libgflags-dev

./include/caffe/common.hpp:6:26: fatal error: glog/logging.h: No such file or directory
pi@raspberrypi:~/caffe $ make all
...
CXX src/caffe/solvers/nesterov_solver.cpp
In file included from ./include/caffe/blob.hpp:8:0,
                 from ./include/caffe/net.hpp:10,
                 from ./include/caffe/solver.hpp:7,
                 from ./include/caffe/sgd_solvers.hpp:7,
                 from src/caffe/solvers/nesterov_solver.cpp:3:
./include/caffe/common.hpp:6:26: fatal error: glog/logging.h: No such file or directory
 #include <glog/logging.h>
                          ^
compilation terminated.
Makefile:581: recipe for target '.build_release/src/caffe/solvers/nesterov_solver.o' failed
make: *** [.build_release/src/caffe/solvers/nesterov_solver.o] Error 1

# Solution
sudo apt-get -y install libgoogle-glog-dev

./include/caffe/util/mkl_alternate.hpp:14:19: fatal error: cblas.h: No such file or directory
pi@raspberrypi:~/caffe $ make all
...
CXX src/caffe/solvers/nesterov_solver.cpp
In file included from ./include/caffe/util/math_functions.hpp:11:0,
                 from ./include/caffe/layer.hpp:12,
                 from ./include/caffe/net.hpp:12,
                 from ./include/caffe/solver.hpp:7,
                 from ./include/caffe/sgd_solvers.hpp:7,
                 from src/caffe/solvers/nesterov_solver.cpp:3:
./include/caffe/util/mkl_alternate.hpp:14:19: fatal error: cblas.h: No such file or directory
 #include <cblas.h>
                   ^
compilation terminated.
Makefile:581: recipe for target '.build_release/src/caffe/solvers/nesterov_solver.o' failed
make: *** [.build_release/src/caffe/solvers/nesterov_solver.o] Error 1

# Solution
# BLAS 数値計算ライブラリ ATLASをインストール
# Makefile.config, BLAS := atlas
sudo apt-get -y install libatlas-base-dev

./include/caffe/util/hdf5.hpp:6:18: fatal error: hdf5.h: No such file or directory
pi@raspberrypi:~/caffe $ make all
...
CXX src/caffe/solvers/sgd_solver.cpp
In file included from src/caffe/solvers/sgd_solver.cpp:5:0:
./include/caffe/util/hdf5.hpp:6:18: fatal error: hdf5.h: No such file or directory
 #include "hdf5.h"
                  ^
compilation terminated.
Makefile:581: recipe for target '.build_release/src/caffe/solvers/sgd_solver.o' failed
make: *** [.build_release/src/caffe/solvers/sgd_solver.o] Error 1

# Solution
# NG
# sudo apt-get install libhdf5-cpp-11
# E: Unable to locate package libhdf5-cpp-11

# OK
apt-cache search libhdf5
sudo apt-get -y install libhdf5-dev

# Solution 2
Makefile.config
INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial
LIBRARY_DIRS := $(PYTHON_LIB) /usr/local/lib /usr/lib /usr/lib/arm-linux-gnueabihf/hdf5/serial

pi@raspberrypi:~ $ ls -l /usr/include/hdf5/serial/hdf5.h
-rw-r--r-- 1 root root 2719 Aug 19  2017 /usr/include/hdf5/serial/hdf5.h

pi@raspberrypi:~ $ ls -l /usr/lib/arm-linux-gnueabihf/hdf5/serial/
total 0
lrwxrwxrwx 1 root root 31 Aug 19  2017 include -> ../../../../include/hdf5/serial
lrwxrwxrwx 1 root root  1 Aug 19  2017 lib -> .
lrwxrwxrwx 1 root root 22 Aug 19  2017 libhdf5.a -> ../../libhdf5_serial.a
lrwxrwxrwx 1 root root 19 Aug 19  2017 libhdf5_cpp.a -> ../../libhdf5_cpp.a
lrwxrwxrwx 1 root root 20 Aug 19  2017 libhdf5_cpp.so -> ../../libhdf5_cpp.so
lrwxrwxrwx 1 root root 30 Aug 19  2017 libhdf5_fortran.a -> ../../libhdf5_serial_fortran.a

./include/caffe/util/db_leveldb.hpp:7:24: fatal error: leveldb/db.h: No such file or directory
pi@raspberrypi:~/caffe $ make all
...
CXX src/caffe/util/db_leveldb.cpp
In file included from src/caffe/util/db_leveldb.cpp:2:0:
./include/caffe/util/db_leveldb.hpp:7:24: fatal error: leveldb/db.h: No such file or directory
 #include "leveldb/db.h"
                        ^
compilation terminated.
Makefile:581: recipe for target '.build_release/src/caffe/util/db_leveldb.o' failed
make: *** [.build_release/src/caffe/util/db_leveldb.o] Error 1

# Solution
sudo apt-get -y install libleveldb-dev


./include/caffe/util/db_lmdb.hpp:8:18: fatal error: lmdb.h: No such file or directory
pi@raspberrypi:~/caffe $ make all
...
CXX src/caffe/util/db_lmdb.cpp
In file included from src/caffe/util/db_lmdb.cpp:2:0:
./include/caffe/util/db_lmdb.hpp:8:18: fatal error: lmdb.h: No such file or directory
 #include "lmdb.h"
                  ^
compilation terminated.
Makefile:581: recipe for target '.build_release/src/caffe/util/db_lmdb.o' failed
make: *** [.build_release/src/caffe/util/db_lmdb.o] Error 1

# Solution
sudo apt-get -y install liblmdb-dev

src/caffe/util/io.cpp:6:33: fatal error: opencv2/core/core.hpp: No such file or directory
pi@raspberrypi:~/caffe $ make all
...
CXX src/caffe/util/io.cpp
src/caffe/util/io.cpp:6:33: fatal error: opencv2/core/core.hpp: No such file or directory
 #include <opencv2/core/core.hpp>
                                 ^
compilation terminated.
Makefile:581: recipe for target '.build_release/src/caffe/util/io.o' failed
make: *** [.build_release/src/caffe/util/io.o] Error 1

# Solution
sudo apt-get -y install libopencv-dev

# Snappy is a compression/decompression library.
# https://google.github.io/snappy/
/usr/bin/ld: cannot find -lsnappy
pi@raspberrypi:~/caffe $ make all
...
AR -o .build_release/lib/libcaffe.a
LD -o .build_release/lib/libcaffe.so.1.0.0
/usr/bin/ld: cannot find -lsnappy
collect2: error: ld returned 1 exit status
Makefile:572: recipe for target '.build_release/lib/libcaffe.so.1.0.0' failed
make: *** [.build_release/lib/libcaffe.so.1.0.0] Error 1

# Solution
sudo apt-get -y install libsnappy-dev
# Setting up libsnappy-dev:armhf (1.1.3-3) ...

/usr/bin/ld: cannot find -lboost_system
/usr/bin/ld: cannot find -lboost_filesystem
/usr/bin/ld: cannot find -lboost_thread
pi@raspberrypi:~/caffe $ make all
...
AR -o .build_release/lib/libcaffe.a
LD -o .build_release/lib/libcaffe.so.1.0.0
/usr/bin/ld: cannot find -lboost_system
/usr/bin/ld: cannot find -lboost_filesystem
/usr/bin/ld: cannot find -lboost_thread
collect2: error: ld returned 1 exit status
Makefile:572: recipe for target '.build_release/lib/libcaffe.so.1.0.0' failed
make: *** [.build_release/lib/libcaffe.so.1.0.0] Error 1

# Solution
sudo apt-get -y install libboost-system-dev libboost-filesystem-dev libboost-thread-dev
# Setting up libboost-system1.62-dev:armhf (1.62.0+dfsg-4) ...
# Setting up libboost-filesystem-dev:armhf (1.62.0.1+b4) ...
# Setting up libboost-thread1.62-dev:armhf (1.62.0+dfsg-4) ...

/usr/bin/ld: cannot find -lboost_python
pi@raspberrypi:~/caffe $ make pycaffe
CXX/LD -o python/caffe/_caffe.so python/caffe/_caffe.cpp
/usr/bin/ld: cannot find -lboost_python
collect2: error: ld returned 1 exit status
Makefile:507: recipe for target 'python/caffe/_caffe.so' failed
make: *** [python/caffe/_caffe.so] Error 1

# Solution
# NG sudo apt-get -y install libboost_python
# E: Unable to locate package libboost_python

apt-cache search libboost | grep python
sudo apt-get -y install libboost-python-dev
# Setting up libboost-python-dev (1.62.0.1+b4) ...

ImportError: No module named caffe
pi@raspberrypi:~/deepdreamer $ python deepdreamer.py flowers.jpg
Traceback (most recent call last):
  File "deepdreamer.py", line 9, in <module>
    from deepdreamer.deepdreamer import deepdream, deepdream_video, list_layers
  File "/home/pi/deepdreamer/deepdreamer/deepdreamer.py", line 11, in <module>
    from caffe import Classifier, set_device, set_mode_gpu
ImportError: No module named caffe

# Solution
export PYTHONPATH=/home/pi/caffe/python:$PYTHONPATH
export LD_LIBRARY_PATH=/home/pi/caffe/distribute/lib:$LD_LIBRARY_PATH

ImportError: No module named skimage.io
pi@raspberrypi:~/deepdreamer $ python deepdreamer.py flowers.jpg
Traceback (most recent call last):
  File "deepdreamer.py", line 9, in <module>
    from deepdreamer.deepdreamer import deepdream, deepdream_video, list_layers
  File "/home/pi/deepdreamer/deepdreamer/deepdreamer.py", line 11, in <module>
    from caffe import Classifier, set_device, set_mode_gpu
  File "/home/pi/caffe/python/caffe/__init__.py", line 1, in <module>
    from .pycaffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, RMSPropSolver, AdaDeltaSolver, AdamSolver, NCCL, Timer
  File "/home/pi/caffe/python/caffe/pycaffe.py", line 15, in <module>
    import caffe.io
  File "/home/pi/caffe/python/caffe/io.py", line 2, in <module>
    import skimage.io
ImportError: No module named skimage.io

# Solution
sudo apt-get -y install python-skimage

ImportError: No module named google.protobuf.internal
pi@raspberrypi:~/deepdreamer $ python deepdreamer.py flowers.jpg
Traceback (most recent call last):
  File "deepdreamer.py", line 9, in <module>
    from deepdreamer.deepdreamer import deepdream, deepdream_video, list_layers
  File "/home/pi/deepdreamer/deepdreamer/deepdreamer.py", line 11, in <module>
    from caffe import Classifier, set_device, set_mode_gpu
  File "/home/pi/caffe/python/caffe/__init__.py", line 1, in <module>
    from .pycaffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, RMSPropSolver, AdaDeltaSolver, AdamSolver, NCCL, Timer
  File "/home/pi/caffe/python/caffe/pycaffe.py", line 15, in <module>
    import caffe.io
  File "/home/pi/caffe/python/caffe/io.py", line 8, in <module>
    from caffe.proto import caffe_pb2
  File "/home/pi/caffe/python/caffe/proto/caffe_pb2.py", line 6, in <module>
    from google.protobuf.internal import enum_type_wrapper
ImportError: No module named google.protobuf.internal

# Solution
sudo apt-get -y install python-protobuf

ImportError: No module named numpy
pi@raspberrypi:~/deepdreamer $ python deepdreamer.py flowers.jpg
Traceback (most recent call last):
  File "deepdreamer.py", line 9, in <module>
    from deepdreamer.deepdreamer import deepdream, deepdream_video, list_layers
  File "/home/user/deepdreamer/deepdreamer/deepdreamer.py", line 10, in <module>
    import numpy as np
ImportError: No module named numpy

pi@raspberrypi:~ $ apt-cache search numpy | grep python-numpy
python-numpy - Numerical Python adds a fast array facility to the Python language
python-numpy-dbg - Fast array facility to the Python language (debug extension)
python-numpy-doc - NumPy documentation
python-numpydoc - Sphinx extension to support docstrings in Numpy format -- Python 2

# Solution
sudo apt-get -y install python-numpy

ImportError: No module named images2gif
pi@raspberrypi:~/deepdreamer $ python deepdreamer.py flowers.jpg
Traceback (most recent call last):
  File "deepdreamer.py", line 9, in <module>
    from deepdreamer.deepdreamer import deepdream, deepdream_video, list_layers
  File "/home/pi/deepdreamer/deepdreamer/deepdreamer.py", line 12, in <module>
    from deepdreamer.images2gif import writeGif
ImportError: No module named images2gif

# Solution
# images2gif import writeGifの gif動画書き出し機能を無効にする。
# コマンドラインでサクッと deepdreamer/deepdreamer.pyを編集する
sed '196,198d' -i ./deepdreamer/deepdreamer.py
sed '12d' -i ./deepdreamer/deepdreamer.py

ImportError: No module named PIL.Image
pi@raspberrypi:~/deepdreamer $ python deepdreamer.py flowers.jpg
Traceback (most recent call last):
  File "deepdreamer.py", line 9, in <module>
    from deepdreamer.deepdreamer import deepdream, deepdream_video, list_layers
  File "/home/user/deepdreamer/deepdreamer/deepdreamer.py", line 13, in <module>
    from PIL.Image import fromarray as img_fromarray, open as img_open
ImportError: No module named PIL.Image

# Solution
# pip install pillow
# The program 'pip' is currently not installed. You can install it by typing:
# sudo apt install python-pip
# pip install pillow
sudo apt-get -y install python-pil

pi@raspberrypi:~ $ apt-cache search pillow
python-pil - Python Imaging Library (Pillow fork)
python-pil.imagetk - Python Imaging Library - ImageTk Module (Pillow fork)
python-pyocr - Python wrapper for OCR engines (Python 2)
python-sane - Python Imaging Library - SANE interface (Pillow fork)
python-willow - Python image library combining Pillow, Wand and OpenCV
python-willow-doc - Python image library (documentation)
python3-pil - Python Imaging Library (Python3)
python3-pyocr - Python wrapper for OCR engines (Python 3)


●上記のビルド手順では python3では動きません。(python2では動く)
pi@raspberrypi:~/deepdreamer $ python3 deepdreamer.py flowers.jpg
Traceback (most recent call last):
  File "deepdreamer.py", line 9, in <module>
    from deepdreamer.deepdreamer import deepdream, deepdream_video, list_layers
  File "/home/pi/deepdreamer/deepdreamer/deepdreamer.py", line 11, in <module>
    from caffe import Classifier, set_device, set_mode_gpu
  File "/home/pi/caffe/python/caffe/__init__.py", line 1, in <module>
    from .pycaffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, RMSPropSolver, AdaDeltaSolver, AdamSolver, NCCL, Timer
  File "/home/pi/caffe/python/caffe/pycaffe.py", line 13, in <module>
    from ._caffe import Net, SGDSolver, NesterovSolver, AdaGradSolver, \
ImportError: dynamic module does not define module export function (PyInit__caffe)


●生成したキモイ絵
元絵 https://github.com/google/deepdream/ より引用
320x240px 1枚(1世代)生成するのに 3分

wget https://github.com/google/deepdream/raw/master/flowers.jpg
・https://github.com/google/deepdream/raw/master/flowers.jpg
https://github.com/google/deepdream/raw/master/flowers.jpg


・第1世代
第1世代


・第3世代
第3世代


・第5世代
第5世代


・第7世代
第7世代


・第10世代
第10世代


・第20世代
第20世代


・第30世代
第30世代


・第40世代
第40世代


・第50世代
第50世代


・第60世代
第60世代


・第70世代
第70世代


・第80世代
第80世代


・第90世代
第90世代


・第100世代
第100世代



●生成したキモイ絵
元絵 https://github.com/google/deepdream/ より引用
1024x575px 1枚生成するのに 1時間
・https://github.com/google/deepdream/raw/master/sky1024px.jpg
https://github.com/google/deepdream/raw/master/sky1024px.jpg


・第1世代
第1世代


・第2世代
第2世代



●生成したキモイ絵(800x449pxに縮小)
元絵 https://github.com/google/deepdream/ より引用
800x449px 1枚生成するのに 30分
・https://github.com/google/deepdream/raw/master/sky1024px.jpg
https://github.com/google/deepdream/raw/master/sky1024px.jpg


・第1世代
第1世代


・第2世代
第2世代


・第3世代
第3世代


・第5世代
第5世代


・第7世代
第7世代



●生成したキモイ絵
 某アニメ
320x240px 1枚生成するのに 3分
・第7世代
第7世代


・第17世代
第17世代


・第27世代
第27世代


・第37世代
第37世代


・第47世代
第47世代


・第57世代
第57世代


・第67世代
第67世代


・第77世代
第77世代


・第87世代
第87世代


・第97世代
第97世代



●生成したキモイ絵
 サンタのアニメ絵
 元絵
760x400px 1枚生成するのに 12分
・元絵
元絵


・第1世代
第1世代


・第2世代
第2世代


・第3世代
第3世代


・第5世代
第5世代


・第7世代
第7世代


・第9世代
第9世代


・第11世代
第11世代






pi@raspberrypi:~/deepdreamer $ python deepdreamer.py sample.jpg

...

I0806 11:33:55.667161   583 layer_factory.hpp:77] Creating layer data
I0806 11:33:55.667289   583 net.cpp:84] Creating Layer data
I0806 11:33:55.667322   583 net.cpp:380] data -> data
I0806 11:33:55.667415   583 net.cpp:122] Setting up data
I0806 11:33:55.667438   583 net.cpp:129] Top shape: 10 3 224 224 (1505280)
I0806 11:33:55.667469   583 net.cpp:137] Memory required for data: 6021120
I0806 11:33:55.667491   583 layer_factory.hpp:77] Creating layer conv1/7x7_s2

...

I0806 11:34:01.427542   583 net.cpp:744] Ignoring source layer loss2/classifier
I0806 11:34:01.427561   583 net.cpp:744] Ignoring source layer loss2/loss
I0806 11:34:01.445107   583 net.cpp:744] Ignoring source layer loss3/loss3
Dreaming...
/usr/lib/python2.7/dist-packages/scipy/ndimage/interpolation.py:568: UserWarning: From scipy 0.13.0, the output shape of zoom() is calculated with round() instead of int() - for these inputs the size of the returned array has changed.
  "the returned array has changed.", UserWarning)
Dream 0 saved.
/usr/lib/python2.7/dist-packages/scipy/ndimage/interpolation.py:430: UserWarning: The behaviour of affine_transform with a one-dimensional array supplied for the matrix parameter has changed in scipy 0.18.0.
  "The behaviour of affine_transform with a one-dimensional "
Dream 1 saved.
Dream 2 saved.

...


● OpenBLASを自前でビルドする

https://github.com/xianyi/OpenBLAS.git

cd
git clone https://github.com/xianyi/OpenBLAS.git
cd OpenBLAS

# SEGFAULT with multi-threading patch to disable mbind using
patch < segfaults.patch

# quick build 32bit
make -j 2 BINARY=32

# install
sudo make install
make[1]: Leaving directory '/home/pi/OpenBLAS/exports'

 OpenBLAS build complete. (BLAS CBLAS LAPACK LAPACKE)

  OS               ... Linux
  Architecture     ... arm
  BINARY           ... 32bit
  C compiler       ... GCC  (command line : cc)
  Fortran compiler ... GFORTRAN  (command line : gfortran)
  Library Name     ... libopenblas_armv7p-r0.3.3.dev.a (Multi threaded; Max num-threads is 4)

To install the library, you can run "make PREFIX=/path/to/your/installation install".


● kesara/deepdreamerのコマンドラインオプション

usage: deepdreamer.py [-h] [--zoom {true,false}] [--scale SCALE]
                      [--dreams DREAMS] [--itern ITERN] [--octaves OCTAVES]
                      [--octave-scale OCTAVE_SCALE] [--layers LAYERS]
                      [--clip {true,false}] [--gpuid GPUID]
                      [--network {bvlc_googlenet,googlenet_place205}]
                      [--gif {true,false}] [--reverse {true,false}]
                      [--duration DURATION] [--loop {true,false}]
                      [--framerate FRAMERATE] [--list-layers] [--video VIDEO]
                      [image]

positional arguments:
  image

optional arguments:
  -h, --help            show this help message and exit
  --gpuid GPUID         enable GPU with id GPUID (default: disabled)
  --zoom {true,false}   zoom dreams (default: true)
  --scale SCALE         scale coefficient for zoom (default: 0.05)
  --dreams DREAMS       number of images (default: 100)
  --itern ITERN         dream iterations (default: 10)
  --octaves OCTAVES     dream octaves (default: 4)
  --octave-scale OCTAVE_SCALE
                        dream octave scale (default: 1.4)
  --layers LAYERS       dream layers (default: inception_4c/output)
  --clip {true,false}   clip dreams (default: true)
  --network {bvlc_googlenet,googlenet_place205}
                        choose the network to use (default: bvlc_googlenet)
  --gif {true,false}    make a gif (default: false)
  --reverse {true,false}
                        make a reverse gif (default: false)
  --duration DURATION   gif frame duration in seconds (default: 0.1)
  --loop {true,false}   enable gif loop (default: false)
  --framerate FRAMERATE
                        framerate for video (default: 24)
  --list-layers         list layers
  --video VIDEO         video file

● --layers LAYERS dream layers (default: inception_4c/output)
 これを変更する事で夢の性質(生成されるグロ画像の画風)を変更する事ができます。
 画像にフィードバックするレイヤーを指定します。
 レイヤーは大きく 3層有り、3層の中に子階層が有ります。
 レイヤーが浅いと小さな「部分」を強調します。
 レイヤーが深くなると「全体像」を強調します。
inception_3a/output
inception_3b/output

inception_4a/output
inception_4b/output
inception_4c/output *default
inception_4d/output
inception_4e/output

inception_5a/output
inception_5b/output

 モデル定義のテキストファイルの中にも記載が有ります。
 bvlc_googlenet/deploy.prototxt
(抜粋)
...
layer {
  name: "inception_3b/output"
  type: "Concat"
  bottom: "inception_3b/1x1"
  bottom: "inception_3b/3x3"
  bottom: "inception_3b/5x5"
  bottom: "inception_3b/pool_proj"
  top: "inception_3b/output"
}
...
layer {
  name: "inception_4a/output"
  type: "Concat"
  bottom: "inception_4a/1x1"
  bottom: "inception_4a/3x3"
  bottom: "inception_4a/5x5"
  bottom: "inception_4a/pool_proj"
  top: "inception_4a/output"
}
...
layer {
  name: "inception_4e/output"
  type: "Concat"
  bottom: "inception_4e/1x1"
  bottom: "inception_4e/3x3"
  bottom: "inception_4e/5x5"
  bottom: "inception_4e/pool_proj"
  top: "inception_4e/output"
}
...
layer {
  name: "inception_5b/output"
  type: "Concat"
  bottom: "inception_5b/1x1"
  bottom: "inception_5b/3x3"
  bottom: "inception_5b/5x5"
  bottom: "inception_5b/pool_proj"
  top: "inception_5b/output"
}

● deepdreamer.pyの引数を指定した例

# 3a
python deepdreamer.py flowers_3a.jpg --dreams 1 --itern 15 --layers inception_3a/output
・inception_3a/output
inception_3a/output

# 3b
python deepdreamer.py flowers_3b.jpg --dreams 1 --itern 15 --layers inception_3b/output
・inception_3b/output
inception_3b/output

# 4a
python deepdreamer.py flowers_4a.jpg --dreams 1 --itern 15 --layers inception_4a/output
・inception_4a/output
inception_4a/output

# 4c
python deepdreamer.py flowers_4c.jpg --dreams 1 --itern 15 --layers inception_4c/output
・inception_4c/output
inception_4c/output

# 4e
python deepdreamer.py flowers_4e.jpg --dreams 1 --itern 15 --layers inception_4e/output
・inception_4e/output
inception_4e/output

# 5a
python deepdreamer.py flowers_5a.jpg --dreams 1 --itern 15 --layers inception_5a/output
・inception_5a/output
inception_5a/output

# 5b
python deepdreamer.py flowers_5b.jpg --dreams 1 --itern 15 --layers inception_5b/output
・inception_5b/output
inception_5b/output


● --network {bvlc_googlenet,googlenet_place205}
 これを変更する事で夢で生成される画像を変更する事ができます。

Places205-GoogLeNet
 googlenet_places205.tar.gz
googlenet_places205/deploy_places205.protxt
googlenet_places205/googlelet_places205_train_iter_2400000.caffemodel

cd
cd deepdreamer

wget http://places.csail.mit.edu/model/googlenet_places205.tar.gz

tar xvfz googlenet_places205.tar.gz

cp googlenet_places205/googlelet_places205_train_iter_2400000.caffemodel .
cp googlenet_places205/deploy_places205.protxt .

python deepdreamer.py flowers_4c.jpg --dreams 1 --itern 20 --layers inception_4c/output --network googlenet_place205
python deepdreamer.py flowers_3a.jpg --dreams 1 --itern 20 --layers inception_3a/output --network googlenet_place205
python deepdreamer.py flowers_5a.jpg --dreams 1 --itern 20 --layers inception_5a/output --network googlenet_place205
python deepdreamer.py flowers_3b.jpg --dreams 1 --itern 20 --layers inception_3b/output --network googlenet_place205
python deepdreamer.py flowers_5b.jpg --dreams 1 --itern 20 --layers inception_5b/output --network googlenet_place205
python deepdreamer.py flowers_4a.jpg --dreams 1 --itern 20 --layers inception_4a/output --network googlenet_place205
python deepdreamer.py flowers_4e.jpg --dreams 1 --itern 20 --layers inception_4e/output --network googlenet_place205

# 3a
python deepdreamer.py flowers_3a.jpg --dreams 1 --itern 20 --layers inception_3a/output --network googlenet_place205
・inception_3a/output
inception_3a/output

# 3b
python deepdreamer.py flowers_3b.jpg --dreams 1 --itern 20 --layers inception_3b/output --network googlenet_place205
・inception_3b/output
inception_3b/output

# 4a
python deepdreamer.py flowers_4a.jpg --dreams 1 --itern 20 --layers inception_4a/output --network googlenet_place205
・inception_4a/output
inception_4a/output

# 4c
python deepdreamer.py flowers_4c.jpg --dreams 1 --itern 20 --layers inception_4c/output --network googlenet_place205
・inception_4c/output
inception_4c/output

# 4e
python deepdreamer.py flowers_4e.jpg --dreams 1 --itern 20 --layers inception_4e/output --network googlenet_place205
・inception_4e/output
inception_4e/output

# 5a
python deepdreamer.py flowers_5a.jpg --dreams 1 --itern 20 --layers inception_5a/output --network googlenet_place205
・inception_5a/output
inception_5a/output

# 5b
python deepdreamer.py flowers_5b.jpg --dreams 1 --itern 20 --layers inception_5b/output --network googlenet_place205
・inception_5b/output
inception_5b/output


●インターネット黎明期から存在するキモイ絵サイト

 DeepDreamを見た時、真っ先にこれを連想しました。

 【閲覧注意】【精神崩壊】(音が出るので注意)

http://mayhem.net/
w e l c o m e . w w w . m a y h e m . n e t



Tags: [Raspberry Pi], [電子工作], [ディープラーニング]

●関連するコンテンツ(この記事を読んだ人は、次の記事も読んでいます)

NVIDIA Jetson Nano 開発者キットを買ってみた。メモリ容量 4GB LPDDR4 RAM
NVIDIA Jetson Nano 開発者キットを買ってみた。メモリ容量 4GB LPDDR4 RAM

  Jetson Nanoで TensorFlow PyTorch Caffe/Caffe2 Keras MXNet等を GPUパワーで超高速で動かす!

Raspberry Piでメモリを馬鹿食いするアプリ用に不要なサービスを停止してフリーメモリを増やす方法
Raspberry Piでメモリを馬鹿食いするアプリ用に不要なサービスを停止してフリーメモリを増やす方法

  ラズパイでメモリを沢山使用するビルドやアプリ用に不要なサービス等を停止して使えるメインメモリを増やす

【成功版】最新版の Darknetに digitalbrain79版の Darknet with NNPACKの NNPACK処理を適用する
【成功版】最新版の Darknetに digitalbrain79版の Darknet with NNPACKの NNPACK処理を適用する

  ラズパイで NNPACK対応の最新版の Darknetを動かして超高速で物体検出や DeepDreamの悪夢を見る

【成功版】Raspberry Piで NNPACK対応版の Darknet Neural Network Frameworkをビルドする方法
【成功版】Raspberry Piで NNPACK対応版の Darknet Neural Network Frameworkをビルドする方法

  ラズパイに Darknet NNPACK darknet-nnpackをソースからビルドして物体検出を行なう方法

【成功版】Raspberry Piで Darknet Neural Network Frameworkをビルドする方法
【成功版】Raspberry Piで Darknet Neural Network Frameworkをビルドする方法

  ラズパイに Darknet Neural Network Frameworkを入れて物体検出や悪夢のグロ画像を生成する

【成功版】Raspberry Piに TensorFlow Deep Learning Frameworkをインストールする方法
【成功版】Raspberry Piに TensorFlow Deep Learning Frameworkをインストールする方法

  ラズパイに TensorFlow Deep Learning Frameworkを入れて Google DeepDreamで悪夢を見る方法

Raspberry Piで TensorFlow Deep Learning Frameworkを自己ビルドする方法
Raspberry Piで TensorFlow Deep Learning Frameworkを自己ビルドする方法

  ラズパイで TensorFlow Deep Learning Frameworkを自己ビルドする方法

Raspberry Piで Caffe Deep Learning Frameworkで物体認識を行なってみるテスト
Raspberry Piで Caffe Deep Learning Frameworkで物体認識を行なってみるテスト

  ラズパイで Caffe Deep Learning Frameworkを動かして物体認識を行なってみる

【インストール版】Raspberry Piで DeepDreamを動かしてキモイ絵をモリモリ量産 Caffe Deep Learning
【インストール版】Raspberry Piで DeepDreamを動かしてキモイ絵をモリモリ量産 Caffe Deep Learning

  ラズパイで Caffe Deep Learning Frameworkをインストールして Deep Dreamを動かしてキモイ絵を生成する

Raspberry Piで Caffe2 Deep Learning Frameworkをソースコードからビルドする方法
Raspberry Piで Caffe2 Deep Learning Frameworkをソースコードからビルドする方法

  ラズパイで Caffe 2 Deep Learning Frameworkをソースコードから自己ビルドする方法

Orange Pi PC 2の 64bitのチカラで DeepDreamしてキモイ絵を高速でモリモリ量産してみるテスト
Orange Pi PC 2の 64bitのチカラで DeepDreamしてキモイ絵を高速でモリモリ量産してみるテスト

  OrangePi PC2に Caffe Deep Learning Frameworkをビルドして Deep Dreamを動かしてキモイ絵を生成する

Raspberry Piに Jupyter Notebookをインストールして拡張子 ipynb形式の IPythonを動かす
Raspberry Piに Jupyter Notebookをインストールして拡張子 ipynb形式の IPythonを動かす

  ラズパイに IPython Notebookをインストールして Google DeepDream dream.ipynbを動かす

Raspberry Piで Deep Learningフレームワーク Chainerをインストールしてみる
Raspberry Piで Deep Learningフレームワーク Chainerをインストールしてみる

  ラズパイに Deep Learningのフレームワーク Chainerを入れてみた

Raspberry Piで DeepBeliefSDKをビルドして画像認識フレームワークを動かす方法
Raspberry Piで DeepBeliefSDKをビルドして画像認識フレームワークを動かす方法

  ラズパイに DeepBeliefSDKを入れて画像の物体認識を行なう

Raspberry Piで Microsoftの ELLをビルドする方法
Raspberry Piで Microsoftの ELLをビルドする方法

  ラズパイで Microsoftの ELL Embedded Learning Libraryをビルドしてみるテスト、ビルドするだけ

Raspberry Piで MXNet port of SSD Single Shot MultiBoxを動かして画像の物体検出をする方法
Raspberry Piで MXNet port of SSD Single Shot MultiBoxを動かして画像の物体検出をする方法

  ラズパイで MXNet port of SSD Single Shot MultiBox Object Detectorで物体検出を行なってみる

Raspberry Piで Apache MXNet Incubatingをビルドする方法
Raspberry Piで Apache MXNet Incubatingをビルドする方法

  ラズパイで Apache MXNet Incubatingをビルドしてみるテスト、ビルドするだけ

Raspberry Piで OpenCVの Haar Cascade Object Detectionでリアルタイムにカメラ映像の顔検出を行なってみる
Raspberry Piで OpenCVの Haar Cascade Object Detectionでリアルタイムにカメラ映像の顔検出を行なってみる

  ラズパイで OpenCVの Haar Cascade Object Detection Face & Eyeでリアルタイムでカメラ映像の顔検出をする方法

Raspberry Piで NNPACKをビルドする方法
Raspberry Piで NNPACKをビルドする方法

  ラズパイで NNPACKをビルドしてみるテスト、ビルドするだけ

Raspberry Pi 3の Linuxコンソール上で使用する各種コマンドまとめ
Raspberry Pi 3の Linuxコンソール上で使用する各種コマンドまとめ

  ラズパイの Raspbian OSのコマンドラインで使用する便利コマンド、負荷試験や CPUシリアル番号の確認方法等も




[HOME] | [BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c) 2018 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator

http://www.neko.ne.jp/~freewing/raspberry_pi/raspberry_pi_build_caffe_google_deep_dream/