「はじめてのパターン認識」読書会がそろそろ終わりそうなので、次のシリーズなに読むかの話題で『実践コンピュータビジョン』が出てきました。
丁度家に死蔵されているので、引っ張り出してちょっと読んでみようと思ったのですが、環境作るところでドハマりしてしまいました。しかも割とどうでもいい理由で。情けない、、、
同じ轍を踏む人が現れないよう、メモっておきます。
環境
- Ubuntu 12.04
- Pythonはvirtualenvを使用
PILをインストールする前に
なんにも考えずにpip install PILすればインストールできるんですが、jpegファイルを読み込んでpylabでshowしようとすると下記のエラーを吐きやがります。
IOError: decoder jpeg not available
jpegのデコーダーがないよ、って言われたのでググってみると、libjpeg-devをインストールする必要があるらしいです。
ところがsudo apt-get install libjpeg-devすると、「もうあるよーーー!」って怒られました。
aptでlibjpeg-devをインストールすると、/usr/lib/x86_64-linux-gnu/配下にlibjpeg.soが作られるんですが、pipでPILをインストールするときにこのフォルダを見てくれないらしいです。
なので、pipから見える場所にシンボリックリンクを貼りましょう。
sudo ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so /usr/lib/libjpeg.so
リンク張った後でPILインストールしなおしたらちゃんと動作してくれました。
参考
http://atasatamatara.hatenablog.jp/entry/20120723/1343044059
matplotlibをインストールする前に
matplotlibもpipで入ります。依存性の関係でnumpyも入ります。
ところが、pylab.show()しても何も表示されない。エラーすら出てこない。なんだこりゃ???
調べたところ、画面表示のためのbackendを適切に設定するらしいです。どこで設定してるかというと、matplotlibrcというファイルがあります。下記コマンドで場所教えてくれます。
>>> import matplotlib
>>> matplotlib.matplotlib_fname()
backend : agg
aggっていうbackendだと、ファイルへの書き込みはできるけどウィンドウ開いて画面に表示とかはできないらしいです。
実はシステムワイドのpythonにもmatplotlib入れちゃってるんですが、そっちのmatplotlibrcを見るとbackendはTkaggになってました。Tkinterを使ってるみたい。
なのでaggからTkaggに書き換えてみます。すると今度は下記のエラーが出るようになりました。
No module named _tkagg
matplotlibをコンパイルするときに_tkagg.pyというファイルが生成されてないみたいです。これを解消するには、tk-devをインストールする必要があります。
sudo apt-get install tk-dev
今度は/usr/lib配下に入るのでリンク貼る必要はないです。tk-devを入れた後でmatplotlibをインストールし直せばおk
まとめ
私が手探りで色々試した順番で書いてしまってますが、本来はこんな流れでセットアップするべきでしょう。
sudo apt-get install libjpeg tk-dev
sudo ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so /usr/lib/libjpeg.so
pip install PIL
pip install matplotlib
vim /path/to/your/matplotlibrc
### backendをTkappに書き換える
ちなみに、ググれば情報はそれなりに出てくるんですが、「システムワイドのmatplotlibだとtkでちゃんと表示されるんだからtk-devが入ってないわけがない」って決めつけて確認しなかったせいでドハマりしてしまいました。
経緯は覚えてないですが、たぶんシステムワイドに入れた時にはaptで、バイナリで入れたからtk-devがなくても_tkaggが入ってたんでしょうね、、、