2013年08月11日

[Homebrew] Python + OpenCV開発環境の再構築

05/2806/01の記事に、virtualenvwrapperを使ってPython + OpenCV環境の構築した際の作業記録を書いたが、その後、Pythonライブラリやvirtualenvwrapperについて調べていくうちに色々と有益な情報が得られた。前記事で紹介したNumPyやSciPyをインストールするのに便利なリポジトリを見つけこともその一つだ。こういう情報を活かすために、Python + OpenCV環境の全面的な再構築を行った。前回とは環境の構成が少し違っているので、新しい環境を構築した際の作業内容について備忘録を兼ねて記録を残す。なお、本記事は自分ための備忘録だが、同時にHomebrewを使ってPython + OpenCV環境を構築する人のためのガイド情報になるように書いていく。そのため、過去の記事と重複する部分も多い。ただし、Homebrew環境はすでにインストール済みで、Python 2.7.x, virtualenv, virtualenvwrapperによるPython環境も構築済みだと仮定して説明していく(前者については05/09の記事、後者については05/22の記事を参照)。

前回の作業で構築したPython + OpenCV環境では、すべてのライブラリをvirtualenvwrapperで作成した仮想環境へ入れたが、今回はこれらをすべて共通環境側へインストールした。共通環境側の全ライブラリを継承した仮想環境を作成できる機能がvirtualenvwrapperに存在するのを発見したことが作業方針を変えた大きな理由だ。汎用性の高いライブラリを入れた共通環境を用意しておいて、この環境に含まれるライブラリを継承した仮想環境を作成する方が、仮想環境側で個別にライブラリを入れていくより合理的だと考えた。

今回構築したPython + OpenCV環境には以下のライブラリを入れた。
 nose       単体テストフレームワーク
 SciPy  科学計算ライブラリ
 NumPy  数値計算ライブラリ
 Pillow  画像処理ライブラリ
 matplotlib グラフ描画ライブラリ
 Sphinx  ドキュメンテーションビルダー

noseを加えたのは、すべての仮想環境で単体テストができるようにしたかったからだ。また、画像処理ライブラリをPILからPillowに置き換えた。PillowはPILをsetuptools互換にするためにPILから分岐したライブラリで、PILとの完全互換を目指して開発が進められているので実装の違いはない。PILの開発は停滞しておりPython 2.7.xまでしか対応していないのに対して、PillowはPython 3.3.xにも対応している。

■Python共通環境の構築


上のように作業方針を変更したのは、前記事で紹介したsamueljohn/pythonリポジトリを見つけたことも影響している。このリポジトリを利用すると、SciPy, NumPy, Pillow, matplotlibはHomebrewを使ってインストールできる。しかも、これらのインストール時にオプションを指定してライブラリの機能を拡張することも可能で、その中には「--with-python3」というオプションもある。このオプションを指定すると、一つのコマンドでPython 2とPython 3の両方の環境にライブラリをインストールすることができる。HomebewでPython環境を構築する場合は、このリポジトリを利用することを強く勧める。

下のコマンドを実行すれば、Homebewでsamueljohn/pythonリポジトリのフォーミュラを利用できるようになる。
% brew tap samueljohn/python

ただし、samueljohn/pythonリポジトリを利用する場合一つ注意しなければならないことがある。それは、あらかじめ次のコマンドを実行してhomebrew/scienceリポジトリをHomebrewに追加しておかないと、samueljohn/pythonリポジトリに含まれるNumPyやSciPyのフォーミュラをインストールできないという点だ。
% brew tap homebrew/science

NumPyの依存フォーミラであるsuite-sparseや、「--with-openblas」オプションを指定した際にNumPyやSciPyへ組み込まれるopenblasはいずれもhomebrew/scienceリポジトリに所属するフォーミュラだからだ。

前記事にNumPyとSciPyのフォーミュラ情報を載せたので、Pillowとmatplotlibのフォーミュラ情報を下に示す。
% brew info pillow
pillow: stable 2.0.0, HEAD
https://github.com/python-imaging/Pillow
Conflicts with: pil
/usr/local/Cellar/pillow/2.0.0 (182 files, 1.9M) *
Built from source
From: https://github.com/samueljohn/homebrew-python/commits/master/pillow.rb
==> Dependencies
Required: little-cms, graphicsmagick, freetype, jpeg, libtiff
==> Options
--with-python3
Build with python3 support
--without-python
Build without python support
% brew info matplotlib
matplotlib: stable 1.2.1, HEAD
http://matplotlib.org
Not installed
From: https://github.com/samueljohn/homebrew-python/commits/master/matplotlib.rb
==> Dependencies
Required: numpy
Optional: cairo, ghostscript, pyside, pyqt, pygtk, homebrew/dupes/tk
==> Options
--with-cairo
Build with cairo support
--with-ghostscript
Build with ghostscript support
--with-pygtk
Build with pygtk support
--with-pyqt
Build with pyqt support
--with-pyside
Build with pyside support
--with-tk
Build with tk support
==> Caveats
If you want to use the `wxagg` backend, do `brew install wxwidgets`.
This can be done even after the matplotlib install.

これ以降Pythonライブラリを順番に入れていくが、その前に、フォーミュラやライブラリのビルド処理で必要となる2つのフォーミュラをインストールしておくことを勧める。pkg-configとcmakeがそれだ。
% brew install pkg-config
% brew install cmake

pkg-configは環境変数PKG_CONFIG_PATHによってpcファイルの参照先を決めるので、下の設定記述を.zshrc(bashの場合は、.bash_profile.bashrc)へ追加する必要がある。
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/lib/pkgconfig:/usr/X11/lib/pkgconfig

それから、gfortran(Gnu Fortran Compiler)もインストールしておこう。
% brew install gfortran

NumPyやSciPyの高速な計算処理は部分的にFortranで実装されているからだ。Fortranが存在しなくてもどちらもビルドできるが、計算速度がかなり遅くなるので、gfortranをインストールすることは必須と考えるべきだ。

上の操作が済んだら、ターミナルを再起動して、最初に、「pip」コマンドを使ってPython環境へnoseライブラリをインストールしよう。
% pip install nose

次にインストールするnumpyやscipyがnoseに依存しているので、samueljohn/pythonリポジトリに所属するフォーミュラをインストールする場合は、一番最初にnoseをインストールしなければならない。

noseを入れたら、Homebrewを使ってnumpyとscipyフォーミュラをインストールしよう(「pip」コマンドは使わない)。
% brew install numpy
% brew install scipy --with-openblas

scipyの方だけに「--with-openblas」オプションをつける理由は前記事に書いた。numpyとscipyフォーミュラをインストールすると、依存関係によって、suite-sparse, tbb, swig, pcre, openblas(「--with-openblas」オプションを指定した場合のみ)も一緒にインストールされる。

私の環境ではここまでの作業は終わっていた。今回行ったのはこれ以降からだ。まずは、Pillowをインストールした。
% brew install pillow

Pillowをインストールすると、依存関係でlittle-cms, graphicsmagick, freetype, jpeg, libtiffの4つのフォーミュラも一緒に追加される。

次にmatplotlibをインストールすることになるが、まだqtフォーミュラが入っていないなら、先にこれをインストールしておいた方が良い。
% brew install qt

matplotlibフォーミュラを入れる際にオプションを指定することでQtも一緒にインストールできるが、Qtのインストールは結構時間がかかるので、あらかじめて入れておくことを勧める。

matplotlibのインストールを行う前に、そのフォーミュラ定義ファイルに以下のような変更を加えた。
% brew edit matplotlib
require 'formula'

.... ....
.... ....
.... ....

class Matplotlib < Formula
.... ....
#! To link with Homebrew's freetype instead of MacOS's one
#depends_on :freetype
depends_on 'freetype'
#! To link with Homebrew's libpng instead of MacOS's one
#depends_on :libpng
depends_on 'libpng'
.... ....
.... ....
.... ....

def install
# Tell matplotlib, where brew is installed
inreplace "setupext.py",
"'darwin' : ['/usr/local/', '/usr', '/usr/X11', '/opt/local'],",
#"'darwin' : ['#{HOMEBREW_PREFIX}', '/usr', '/usr/X11', '/opt/local'],"
"'darwin' : ['#{HOMEBREW_PREFIX}', '#{HOMEBREW_PREFIX}/opt/freetype', '#{HOMEBREW_PREFIX}/opt/libpng', '/usr', '/usr/X11', '/opt/local'],"
.... ....
.... ....
.... ....
.... ....
.... ....
.... ....
end

変更前のフォーミュラ定義ファイルではMac OS X側のfreetypeとlibpngがmatplotlibにリンクされるが、変更後はHomebrew側のライブラリがリンクされる。前者でも特に問題はないが、いずれもHomebrewのフォーミュラとして存在しているので、そちらを使いたかった。

上の操作を行った上で、matplotlibのインストールを実行した。
% brew install matplotlib --with-cairo --with-pyqt --with-pyside

PyQtPySide(どちらもQtを利用するためのPythonバインディング)を一緒に入れたのは、Qtに大きな興味を持っている私にとって、この2つが利用価値の高いソフトウェアだと思えたからだ。matplotlibをインストールすると、依存関係によって、以下のフォーミュラも一緒に追加される。
 libpng                                   ← フォーミュラ定義ファイルに加えた変更により
 cairo, xz, pixman, glib, gettext, libffi ←「--with-cairo」オプションにより
 pyqt, qt, sip ←「--with-pyqt」オプションにより
 pyside, qt, shiboken ←「--with-pyside」オプションにより

pysideとpyqtのサイズが大きいようで、この2つのビルドにかなり時間がかかった。qtフォーミュラが未インストールだったら、さらに時間がかかっていただろう。

最後に、「pip」コマンドを使ってSphinxをインストールした。
% pip install Sphinx

SphinxはPygments, Jinja2, docutils, MarkupSafeの4つに依存しているので、これらのライブラリも一緒にインストールされる。

Pythonライブラリのインストールがすべて終わったら、最後に、「pip」コマンドを使ってライブラリ一覧を確認してみると良いだろう。
% pip list
distribute (0.6.40)
docutils (0.11)
Jinja2 (2.7.1)
MarkupSafe (0.18)
matplotlib (1.2.1)
nose (1.3.0)
numpy (1.7.1)
Pillow (2.0.0)
Pygments (1.6)
scipy (0.12.0)
Sphinx (1.2b1)
stevedore (0.10)
virtualenv (1.9.1)
virtualenv-clone (0.2.4)
virtualenvwrapper (4.1.1)
wsgiref (0.1.2)


■OpenCVのインストール


06/01の記事に書いたように、OpenCVはNumPyに依存している。また、Sphinxが存在していると、OpenCVのインストール時にドキュメントが自動生成される。いずれのライブラリもPython共通環境に入れたので、OpenCVをインストールするためPython側の条件はすでに整っている。

もしffmpegが存在していないなら、OpenCVをインストールする前に、ffmpegとその依存フォーミュラを入れておくことを勧める。
% brew install ffmpeg --with-libvorbis --with-libvpx --with-schroedinger

ffmpegはOpenCVの依存フォーミュラではないが、あらかじめffmpegを入れておくと、ビルド時にその存在を認識して、OpenCVにビデオキャプチャ機能が組み込まれるようになっている。

これでOpenCVをインストールするための条件は整った。OpenCVのフォーミュラはHomebrewのメインリポジトリではなくhomebrew/scienceリポジトリに所属しているが、このリポジトリすでにHomebrewに追加済みだ。後はopencvフォーミュラのインストールを実行するだけだが、その前に、OpenCVのフォーミュラ定義ファイルに以下の変更を加えた。

% brew edit opencv
require 'formula'

class Opencv < Formula
.... ....
.... ....
#! To link with Homebrew's libpng instead of MacOS's one
#depends_on :libpng
depends_on 'libpng'

.... ....
.... ....
.... ....
.... ....
.... ....
.... ....
.... ....
.... ....
end

.... ....
.... ....

コメントが示しているとおり、この変更の目的はHomebrew側のlibpngをopencvとリンクするためだ。上の変更を行った後、opencvフォーミュラのインストールを実行した。
% brew install opencv --with-eigen --with-jasper --with-libtiff --with-qt --with-tbb

opencvフーミュラのオプションは好みで決めれば良いだろう。上の各オプションを指定するとオプション名に対応したフォーミュラが一緒にインストールされるが、ここまでの操作によってlibtiff, qt, tbbはすでに存在しているはずなので、実際に追加されるのはeigenとjasperだけだ。

■OpenCV開発用Python仮想環境の作成


OpenCVと連携使用する基本的なライブラリはすべてPython共通環境に入っているし、opencvフォーミュラをインストールしたので、OpenCVのPythonバインディングも同環境で利用できる状態になっている。この状態で、virtualenvwrapperを使って共通環境の全ライブラリを継承した仮想環境を作成すれば、その仮想環境からOpenCVを利用することも同様に可能だ。次のコマンドを実行すれば、共通環境の全イブラリを継承した仮想環境を作成できる。
% mkvirtualenv --system-site-packages opencv_work

上で使っている「--system-site-packages」というオプションは、共通環境側のライブラリをコピーする訳ではなく、ファイルのリンクを作成することで仮想環境からライブラリを参照できるようにしているようだ。

上のコマンドで作成した仮想環境からOpenCVが利用できるか動作確認をやってみると良いだろう。OpenCVのソースパッケージにPythonで書かれたサンプルプログラムが格納されているので、それを利用するのが一番手っ取り早い。その具体的な方法は06/01の記事に書いたので、そちらを参照してほしい。

【参考ページ】



posted by とみやん at 09:29| Comment(0) | TrackBack(0) | 開発・プログラミング > Mac
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/72271648

この記事へのトラックバック