上の写真のように、ニューラル・ネットワークで2つの画像を合成する環境をVagrant上に構築します。WEBサービスのOstagramと同じ機能です。
2つの素材から実用に耐える素材を作り出す力があるので、すでに実用域の技術になってきている気がします。人の輪郭が波で自然に縁取られているのを見ると、単純に合成しているわけではないのが分かります。
最終的に動かしたいプログラムはgitに公開されているneural-styleです。もしNVIDIAのGPUがあれば、CUDA(クーダ)というライブラリを導入することで高速化できるようですが、私の環境はMac mini Late 2012なので地獄のCPU演算で。
Ubuntuのインストール
最初にVagrantにUbuntuをインストールします。MacでVagrantを構築するのが初めてならこちらを。 neural-styleの動作には、事前にTorch7というニューラル・ネットワークのライブラリをインストールする必要がありますが、Torch7はUbuntu12以上推奨のようなので、Ubuntu14.04をVagrantに入れます。
Vagrantにbox add
osx:$ vagrant box add https://atlas.hashicorp.com/rafacas/ubuntu1404-plain
osx:$ vagrant box list
osx:$ vagrant init rafacas/ubuntu1404-plain
一応Vagrantのコマンド
- vagrant box remove
- boxの削除
- vagrant destroy
- インスタンス削除
- vagrant reload
- インスタンス再読み込み
つぎはVagrantfileを編集します。
osx:$ vim Vagrantfile
最終的に画像ファイルを入力するので、先に共有フォルダの設定をしておくのと、標準メモリの512Mではneural-styleが落ちたので4096Mにアップしておきます。neural-styleの作者さんによるとGPU使用時の消費メモリーは3.5GBくらいとのことです。ちなみに8192Mでも試しましたが計算時間に変化はありませんでした。
Vagrantfile
# config.vm.synced_folder "../data", "/vagrant_data"
config.vm.synced_folder ".", "/vagrant_data"
# Provider-specific configuration so you can fine-tune various
# backing providers for Vagrant. These expose provider-specific options.
# Example for VirtualBox:
#
config.vm.provider "virtualbox" do |vb|
# # Display the VirtualBox GUI when booting the machine
# vb.gui = true
#
# # Customize the amount of memory on the VM:
vb.memory = "4096"
end
あとはsshでログインします。
osx:$ vagrant up
osx:$ vagrant ssh
無事にUbuntuにログインできたらアップデート情報を更新。プログラムをダウンロードするために必要なgitをインストールしておきます。
vagrant@ubuntu1404:~$ sudo apt-get update
vagrant@ubuntu1404:~$ sudo apt-get install git
ここまででUbuntuの環境が整いました。
Torch7のインストール
次にTorch7をインストールします。ログインユーザーのホームディレクトリで、インストールコマンドを叩けばよいのですが、Ubuntu14.04では、bash install-deps;の実行中にadd-apt-repositoryがないという理由で失敗しました。なので先にadd-apt-repositoryが入っているパッケージを入れておきます。
add-apt-repositoryが入っているパッケージであるsoftware-properties-commonを先に入れておく
vagrant@ubuntu1404:~$ sudo apt-get install software-properties-common
以上でTorch7をインストールできます。
vagrant@ubuntu1404:~$ git clone https://github.com/torch/distro.git ~/torch --recursive
vagrant@ubuntu1404:~$ cd ~/torch;
vagrant@ubuntu1404:~$ bash install-deps;
vagrant@ubuntu1404:~$ ./install.sh
Torch7のコマンドであるthをパスに通すために環境変数再読み込み。
vagrant@ubuntu1404:~$ source ~/.bashrc
thが動くか確認。thから抜けるにはexitをタイプ。
vagrant@ubuntu1404:~$ th
このTorch7ことthで動くスクリプトが、最終的に動かすneural-styleとなります。
Torch | Scientific computing for LuaJIT.
loadcaffeのインストール
loadcaffeはCaffeの学習済みモデルをTorchで使えるようにするプログラムです。
vagrant@ubuntu1404:~$ sudo apt-get install libprotobuf-dev protobuf-compiler
vagrant@ubuntu1404:~$ luarocks install loadcaffe
GitHub - szagoruyko/loadcaffe: Load Caffe networks in Torch7
これで準備は整いました。いよいよneural-styleのインストール。
neural-styleインストール
Torch7と同じようにコマンドラインのgitでダウンロードします。
GitHub - jcjohnson/neural-style: Torch implementation of neural style algorithm
vagrant@ubuntu1404:~$ cd ~/
vagrant@ubuntu1404:~$ git clone https://github.com/jcjohnson/neural-style
vagrant@ubuntu1404:~$ cd neural-style
vagrant@ubuntu1404:~$ sh models/download_models.sh
画像ファイルを2つ指定して演算開始します。素材は写真ACさんから良さそうなのをピックアップしました。
画像は共有フォルダからホームディレクトリにコピーした後、neural-styleフォルダ内にてスクリプトを実行します。GPUを使わないので-gpu -1を指定します。
vagrant@ubuntu1404:~$ cp /vagrant_data/*.jpg ~/
vagrant@ubuntu1404:~$ th neural_style.lua -style_image ~/style_paper.jpg -content_image ~/content.jpg -gpu -1
実行結果
実行時間は512×512サイズで4時間ほどかかります。Mac mini Late 2012上の仮想環境。さらにCPUパワーだとこれくらいの速度になってしまうようですが、早いGPUでは1分ほどで完成するようです。本格運用するならGPUは必須ですね。
みーをモネ風に。いい感じです。
参考
全体を通してitogのhack日記さんの記事を参考にさせて頂きました。