CaffeをUbuntu16.04LTS + GTX1070の環境でインストール

GTX1070を購入したのでCaffeで遊んでみようと思いインストールを試みたのですが、なかなか苦労したのでインストール手順をまとめておきます。

環境

  • Ubuntu 16.04 LTS (64bit)
  • NVIDIA GeForce GTX1070
  • CUDA Toolkit 8.0 RC
  • cuDNN v5.1
  • OpenCV3.1.0
  • GCC5.4
  • Anaconda2-4.1.11

GTX1070は最新のPascalアーキテクチャを採用しており、GPUを使って高速化するにはCUDA Toolkit 8.0 RCを用いる必要があります。RC(Release Candidate)がなので不具合がないのか心配ではありますが、他に選択肢もないのでこれをインストールします。
加えてCaffeにはOpenCVやPython関連の環境が必要です。OpenCVのバージョンは3.1とし、Python関連の環境はAnaconda (Pythonによる機械学習・数値計算のためのパッケージ)で整えました。

 

1. 必要なソフトウェアのダウンロード

Caffeのインストールに必要な以下のソフトウェアをダウンロードしました。

 

2. Anacondaのインストール

以下のように実行して、あとは全て”yes”で大丈夫です。

インストール後は以下のようにアップデートします。

 

3. CUDA Toolkitのインストール

まずは、NVIDIAのドライバをインストールします。(すでにインストールされている場合は不要)
GTX1070を動作させるにはnvidia-367というドライバが必要です。
以下のようにapt-getを使うと簡単にインストールできます。

続いて、CUDA Toolkitをインストールします。
インストーラはRUNインストーラ(.run)としました。Debianインストーラ(.deb)でインストールしたところ、ドライバのバージョンが367.35だと、”CUDA driver version is insufficient”といわれ正しく動作しませんでした。バージョンが367.27というような古いドライバをインストールするのもうまくいかなかったので、結局.runでインストールすることにしました。
手順は以下の通りです。

3.1. GCCのインストール・シンボリックリンクの作成

Ubuntu 16.04ではGCC5.4がインストールされていましたが、CUDA Toolkit 8.0 RCはこのバージョンに対応していませんでした。(現在はパッチファイルを用いれば対応可能、後述)
なのでGCC4.9をインストールします。

3.2. CUDA Toolkitのインストール

続いて、本題となるCUDA Toolkitのインストールですが、GUIサービスを停止させてから実行します。
もしもファイルに実行権限がなかった場合はchmodで変更してください。
なお、GUIサービスが停止した後は、”Ctrl”+”Alt”+”F1″でコマンドラインモードに移行できます。

このとき、デフォルトのドライバをインストールするか尋ねられますが、”no”を選択する必要があります。
その他はデフォルトのままで、サンプルプログラムもインストールしたほうが良いと思います。
最後の行はパッチファイルのインストールです。これでGCC5.4にも対応できます。
GCCのバージョンを5.4にするためにシンボリックリンクを書き換えます。

そして.bashrcに以下のように書き加えてください。これでnvccなどのコマンドが使えます。

3.3. サンプルの実行

GPUの情報を取得できるdeviceQueryを実行してみます。

正しく実行できればひとまずCUDA Toolkitのインストールは完了です。

 

4. OpenCVのインストール

続いてOpenCVをインストールします。CMakeを使ってビルドするので、まずは以下のように必要なパッケージを揃えます。

これらのインストールが終わったらunzipでOpenCVのイントーラを展開し、展開先で以下のようにビルドを実行します。

このときIPPCVのインストールファイル(ippicv_linux_20151201.tgz)がダウンロードが失敗するため、ここからダウンロードして、opencv-3.1.0/3rdparty/ippicv/downloads/linux-xxx/の中に置きます。古いファイルは消してください。
また、ビルドを進めていくとcudalegacyのGraphCutのビルドで失敗しますが、以下のページを参考にopencv-3.1.0/module/cudalegacy/src/の中のgraphcuts.cppを書き換えました。
cudalegacy not compile — nppiGraphcut missing

ビルド終了後、再起動をします。ここで、適当なソースコードをコンパイルして動作確認しようとしましたが、

とエラーが出てしまったので、以下のようにシンボリックリンクを貼って対応しました。

なお、以下のコード(cvtest.cpp)を試しました。lenna.jpegが対応するディレクトリにある前提です。
以下のようにコンパイルします。

正しく画像が表示されれば完了です。

 

5. cuDNNのインストール

以下のように実行すれば完了です。

 

6. Caffeのインストール

ようやくCaffeをインストールする準備が整いました。
まずは以下のように必要なパッケージを揃えます。

続いて、ダウンロードしたcaffe-master.zipを展開し、その展開先に移動して以下のようにMakefike.configを作成します。

そして、それを以下のように変更します。(一部抜粋です)
cuDNNやOpenCV、Anacondaを使うためコメントを外したり、逆にコメントアウトしたりしています。

Makefile.configを編集したらPython関連の必要なソフトをインストールします。

インストール時のエラーを回避するため、以下のように実行すると良いようです。

そして展開先直下に戻り、以下のように実行してビルドします。

このとき、runtestを走らせるときにエラーが出ますが、以下のように.bashrcに記述することで正常に走らせることができました。

さらに、

と.bashrcに記述するとpythonでcaffeをimportできます。<path-to-caffe-master>は自分のインストール環境に合わせてください。

無事にインポートできればインストール完了です。

 

主に参考にしたページ

VisualStudioのMFCプロジェクトにCUDAを組み込む

Visual Studioで作ったMFC(Microsoft Foundation Class)プロジェクトにCUDAを組み込む手順が少し面倒だったので,ここに記しておきます.
使用したVisual Studioのバージョンは2013で,CUDAのバージョンは7.0です.それぞれ,PCに既にインストールしている前提で説明します.

組み込みの例として,まず以下のようなGUIを作成します.
“Run”というボタンをクリックすると,GPUを使った並列計算が実行されるという非常にシンプルなものです.

MFC_CUDA1

これを作成するために,ダイアログベースでプロジェクトを作成しました.

MFC_CUDA2

ここで,CUDA関連のコードをコンパイルできるように,「ソリューションエクスプローラー」から,プロジェクトファイルを右クリックし,「ビルド依存関係」→「ビルドのカスタマイズ」を選択します.

MFC_CUDA3

そして,インストールされたバージョンのCUDAにチェックをつけ,「OK」をクリックします.

MFC_CUDA4

続いて,CUDA関連のコードを追加します.今回の例では,カーネル関数について記述した”kernel.cu”と”kernel.cuh”,そしてカーネル関数を実行する記述を書いた”kernel_test.cu”と”kernel_test.cuh”を追加しました.
それぞれ,以下に示します.このカーネル関数は2つの行列を加算するという極めて簡単なものです.

kernel.cu

kernel.cuh

kernel_test.cu

kernel_test.cuh

ここで注意点ですが,ソリューションエクスプローラーから”kernel.cu”と”kernel_test.cu”を右クリックし,「プロパティ」を選択します.
このとき,項目の種類が”CUDA C/C++”になっていなければ変更します.

MFC_CUDA5

これで,これらのファイルがCUDAのコンパイラによってコンパイルされます.カーネル関数に加え,カーネル関数を呼び出すファイルもCUDAコンパイラでコンパイルされる必要があるため,わざわざkernel_test.cuというファイルを作ったのでした.
そして,MFC側のファイルに”kernel_test.cuh”をインクルードし,”Run”ボタンのイベントハンドラにCuAddMatrix();を記述すれば,ボタンを押した瞬間,行列加算が並列実行されます.

ここで,コンパイルしてみるとうまくいくとおもいきや,うまくビルドできません.
例えば以下のようなエラーです.

error LNK2001: 外部シンボル “_cudaSetDevice@4” は未解決です。
調べてみると,以下のように“cudart.lib”をリンカの入力に追加する必要がありました.

MFC_CUDA6

ようやくビルドが通り,プログラムを実行して生成されたテキストファイルを確認してみると,正しく動作していることが確認できました.

・参考ページ

既存のVSプロジェクトにCUDAコードを追加する方法
CUDA対応メモ

BeagleBone BlackにOpenCVをインストール

今回はBeagleBone Blackで画像処理を行うため,画像処理ライブラリであるOpenCVをインストールします.
関連する記事をWebで探しましたが,多くはOpenCVのファイルをダウンロードして,CMakeでmakeしてビルドするというものでした.普通のパソコンと比べるとCPU性能もメモリ容量も少ないBeagleBone Blackでは,このビルドに何時間もかかるようです.

makeしたりビルドしたりするのが面倒なので,別の方法を探しました.するとどうやらUbuntuではパッケージからインストールができるようです.
せっかくUbuntuをインストールしたので,apt-getを使ってパッケージから楽にインストールします.
必要なのは以下のコマンドだけです.

sudo apt-get install libopencv-dev
インストールはそれほど時間がかからなかったと思います.10分ぐらいで終わった記憶があります.

また,上記のパッケージはC++用のライブラリですが,PythonでOpenCVを扱いたければ以下のコマンドもターミナルから実行します.

sudo apt-get install python-opencv
これでPythonでも扱えるようになります.

試しに以下のPythonスクリプトを実行してみました.

このスクリプトは,lena.jpgという画像を読み込んで表示させ,さらに,グレースケール画像に変換してからガウシアンフィルタをかけてぼかした画像を表示させています.実行結果は以下のようになり,正しくインストールできていることが確認できました.

opencvtest

BeagleBone Blackで無線LAN設定

以前,BeagleBone BlackにUbuntuをインストールしましたが,有線のLANポートにケーブルを繋ぐ以外にネットワークに接続する手段がありませんでした.今回は,BeagleBone Blackに無線LANアダプタを接続し,無線でインターネットに接続できるようにします.

今回使用したのは以下の無線LANアダプタです.
I-O DATA IEEE802.11n/g/b準拠 300Mbps(規格値) 無線LANアダプター WN-G300UA
これは,基本的にWindows対応となっていますが,Linuxでも使用できます.BeagleBone Blackには以下のように接続して使用しました.
wifi-adapter
ただし,この写真のようにボードのUSBポートに直接接続したときにはうまくいきましたが,USBハブを介して接続するとうまくいきませんでした.
I/Oポートが多いのがBeagleBone Blackの強みですが,USBポートが1つしかないのはやはり不便ですね.

さて,無線でインターネットに接続するにはBeagleBone Blackで設定が必要です.
ネットワーク関連の設定は,以下のディレクトリにあるinterfacesというテキストファイルで設定します.

/etc/network/interfaces
無線LANを設定するには,interfaces内に,以下の記述を書き加えてください.テキストエディタは何でも大丈夫です.私はVimで編集しました.

wpa-ssidのところには,接続したいルーターのSSIDを記述してください.ダブルコーテーション(“)も必要です.
wpa-pskのところには,ルーターの暗号化キーを記述してください.こちらはダブルコーテーションは不要です.

上の記述を追加してから,

sudo ifup wlan0
というコマンドを実行し,上記で設定した無線LANを有効化します.その後,BeagleBone Blackを再起動してpingなどで確認すれば,ネットワークに接続できていることが確認できるはずです.

・参考ページ
BeagleBone Blackの初期設定


BeagleBone BlackでGUI環境を整える

BeagleBone BlackにUbuntuをインストールで,BeagleBone BlackにUbuntuをインストールしてセットアップしました.
しかし,この状態ではCUI環境なので,黒い画面に文字だけしか表示されていません.CUIも好きなのでそのままでもよかったのですが,いずれは画像処理なども行ないたいのでGUI環境があったほうが便利かと思いました.

今回は比較的軽量なデスクトップ環境であるLXDE (Lightweight X11 Desktop Environment)を入れました.
ネットワークがつながった状態で,ターミナルから以下のコマンドを入力します.

インストール後に再起動をするとLXDEが自動で起動します.
LXDE

・参考ページ
BeagleBone BlackにUbuntu+WindowManager(LXDE)を入れてみる

BeagleBone BlackにUbuntuをインストール

先日,BeagleBone Blackを買いました.同じように安価な組込みLinuxボードとしてRaspberry Piが有名ですが,ARMコアがRaspberry Piよりも新しいCortex-A8であり,I/Oも多いのでBeagleBone Blackを選びました.
Cortex-A8はNEONというSIMDエンジンも搭載されているので,画像処理や音声処理をやる場合には何かと便利かなと思います.

秋月電子でボードを購入しました.デフォルトのOSはDebianでした.
これはボートに実装されているeMMCにイントールされていますが,この容量は4GBということでなんとなく物足りなさを感じます.
BeagleBone BlackはSDカードからもブートすることができるので,こちらに新しくOSを入れることにしました.

Linuxディストリビューションの中でも親しみのあるものをインストールしようと思ったので,今回はUbuntu 14.04 LTS (Long Term Support)をインストールすることにしました.
インストール手順は,記事の最後に示したページが非常にわかりやすかったので,ほとんどその通りに従っています.

1. micro SDカードの用意とブートイメージのダウンロード

まずは,OSをインストールするSDカードを準備します.私は,TOSHIBA製 16GBのmicro SDカードを購入しました.1000円もしませんでした.sdカードのスピードクラスはclass 10です.OSを走らせる以上,データ転送速度は速いほうがいいかなと思いました.

続いてUbuntu 14.04 LTSのブートイメージを作業用PCでダウンロードします.https://rcn-ee.net/deb/microsd/trusty/から,bone-ubuntu-14.04….というファイルと選択してダウンロードします.私がダウンロードしたときは,bone-ubuntu-14.04.1-console-armhf-2014-10-29-2gb.img.xzというファイルでした.

ダウンロードしたファイルは圧縮されているので解凍します.MacやLinuxではターミナルからunxzコマンドで解凍できます.

Windowsでは7zなどのソフトを使えば解凍できるでしょう.

2. ブートイメージの書き込み

まずはmicro SDカードを作業用PCに挿入します.私はMacを使用しましたので以下はMacでの手順になります.なお,Linuxでも同じ手順でブートイメージの書き込みができると思います.Windowsの場合はWin32 Disk Imagerといったようなソフトを使用すれば簡単に書き込みができると思います.

MacではSDカードを挿入すると自動でマウントします.ブートイメージを書き込むためにはマウントを解除しないといけません.
まずは,どこにマウントされているかを調べます.
ターミナルで以下のコマンドを実行するとSDカードがどこにマウントされているのかがわかります.

私は場合は/dev/disk1でした.場所がわかったので以下のようにマウント解除します.

そして,解凍したブートイメージがあるディレクトリまで移動し,ddコマンドでSDカードに書き込みます.

この書き込みにはかなり時間がかかります.参考にしたページは15分ほどだと書いてありましたが,私の場合は30分以上かかりました.この時間はマシンのスペックによると思うので気長に待ちましょう.

3. OSの起動とディスク領域の拡張

SDカードへの書き込みが完了したら,BeagleBone BlackにSDカードを挿入して起動します.
本来,SDカードからブートするには,ボードのブートスイッチを押しながら電源を入れるのですが,なぜか押さないで電源を入れてもSDカードからブートされました.
起動後はsshで接続できますし,HDMIでディスプレイにつないで直接キーボードを叩いても操作できます.
ただし,DebianやÅngströmでは,作業用PCとボードをUSBで接続することでネットワークに接続出来ました(network-over-USBという機能)が,今回インストールしたUbuntuでは,何か設定しないとできないみたいです.
なので,LANケーブルを接続してBeagleBone Blackにネットワークを通します.

今回インストールしたUbuntuでは,デフォルトでディスク領域がおよそ2GBまでしかありません.せっかく16GBのSDカードにインストールしたのに,とんでもないムダです.
16GBフルで使用するにはディスクの領域を拡張する必要があります.
Webで調べると自分でコマンドを打ってパーティションを拡張している例が多く見られましたが,はっきり言って面倒です.
どうやら,パーティションを自動で拡張してくれるスクリプトがあるらしいのでそれを利用しましょう.
BeagleBone BlackでUbuntuにログインしたら,以下のコマンドを実行します.

再起動後に,

とすると,使用できるディスク領域が拡張されていることが確認できます.

・参考ページ
Getting started with OpenCV on the BeagleBone Black with Ubuntu 14.04 LTS

OpenCVのカメラ入力で発生するエラーへの対処法

OpenCVでカメラからの画像を入力するときに発生したエラーについてまとめます.

動作環境

  • OS: Windows 7
  • 開発環境: Visual Studio 2012 C++
  • OpenCVのバージョン: 2.4

USB接続のWebカメラから画像を取得して表示させようと以下のページを参考にコードを書きました.
入出力とGUI — OpenCV-CookBook

これを上記の環境でコンパイルして実行すると,うまく動作するときもありましたが,
まれに以下のようなエラーメッセージが表示されました.
opencv_videocapture1

また,コンソール画面には,

OpenCV Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, file ……
というようなメッセージが表示されており,imshow関数でエラーが発生していることが確認できます.

このエラーは,“cap >> frame;”として画像をキャプチャするとき,正しくキャプチャされないとMatに画像が入らず,その状態でimshow関数で表示しようしたことが原因で発生したと考えられます.

対処法としては,

というように正しくキャプチャされるまで待つようにすることで,エラーなく動作させることができます.
よって,全体としては以下のようなコードとなります.これでまったくエラーが発生しなくなりました.

Google Inboxで新しいBundleを追加する方法

Googleの新しいメールアプリのInbox by Gmailでは,受信したメールをある決められたカテゴリごとに自動的に振り分けることができます.
これをバンドル(Bundle)と呼びますが,デフォルトでは,

  • Travel
  • Purchases
  • Finance
  • Social
  • Updates
  • Forums
  • Promos

の7つのバンドルが利用できます.
しかし,Inboxを使用していると,他にも様々なカテゴリを設けたくなると思いますので,ここでは新しくオリジナルのバンドルを追加する方法を説明します.

まず,ホーム画面の左上のメニューをタップします.

inbox_bundle1

メニューの下の方にあるCreate Newをタップします.

inbox_bundle2

バンドルの名前を入力します.下の例ではFamilyという名前をつけています.

inbox_bundle3

それからAdd をタップして,どのようなルールでバンドルにメールを振り分けるかを設定します.

inbox_bundle4

ここで,送られてくるメールアドレスやキーワードなどを設定して,振り分けるルールを作成します.

inbox_bundle5

具体的には以下のような設定ができます.

  • From: 差出人メールアドレス・名前を指定
  • To: 送信先メールアドレス・名前を指定
  • Subject: メールの件名に含まれる文字を指定
  • Includes: メール本文に含まれているキーワードを指定
  • Excludes: メール本文に含まれてはいないキーワードを指定

そのほか,設定したバンドルに振り分けられるメールの通知設定や,どのようなタイミングでバンドルをinboxのトップに表示させるかといった設定も行えます.

・参考ページ
How to Create Your Own Bundle in Google Inbox: 12 Steps

バイナリファイルの作成方法 (Python)

Pythonで何らかのデータを書き込んでバイナリファイルを作成する場合には,組み込み関数のopenで’wb’とモード指定します.
ただし,そのまま整数型や浮動小数点型のデータを書き込むことはできないのでstructモジュールを使用します.
以下が浮動小数点型や整数型のデータを文字列形式に変換し,バイナリファイルを生成するスクリプトの例です.

hexdump (Unixコマンド)で生成したバイナリファイルの中身を確認してみると,

0000000 19 04 9e 3f ff 03 00 00
0000008
となっています.

1.2345は32bitの浮動小数点型の場合,16進数表記で0x3F9E0419となります.
また,1023は32bitの整数型の場合,16進数表記で0x000003FFとなります.
バイトオーダーはデフォルトでリトルエンディアンとなっているので,正しくバイナリに変換されていることが確認できます.

浮動小数点型や整数型データを文字列に変換するstructモジュールについて,詳しくはこちらをご覧ください.
今回は,変換するデータのフォーマットをfloat (“f”)とint (“i”)にしましたが,その他のデータ型も対応できます.

・参考ページ
Pythonでバイナリファイルを作成する

浮動小数点データ型を16進で表記する方法

C++ではfloatやdoubleという浮動小数点のデータ型がありますが,
これらを16進表記する場合についての解説です.

通常,浮動小数点はIEEE754というフォーマットに従ってデータとして表現されます.
例えば,単精度(float)の場合,10進で1.2345という値は,16進では0x3F9E0419となります.

C++でこの16進表記に変換するには,共用体(union)を用いれば実現できます.
以下が単精度の場合の変換を行う関数です.

このように,一度整数型(unsigned int)に変換してから,関数の呼び出し元で

と16進(std::hex)で指定して表示すれば,浮動小数点の16進表記が確認できます.