Udemyのデータサイエンス講習がもうすぐ終わりそうなので、次の教材を探しました。
パラパラ見ていると、前から気になっていたOpenCVを使った画像処理レシピ発見。
画像認識で機械学習を使った解説が盛り込まれている模様。
ということで、まずはOpenCVをOSXにインストールしておこう… 今更Python2に戻りたくないからPython3で… なんて腰を上げたのが運の尽き。ハマるハマる。
OpenCVインストール手順
基本的に、こちらのブログで紹介されている手順でOKなはず。
だったのに、自分の場合、Python環境にanyenvを使っているからか、こんなスマートにいきませんでした…。
OpenCVインストール手順(ハマり過程)
まずはシステムにインストール済みのnumpyをアンインストール。
$ brew unlink numpy
$ brew uninstall numpy
python3で使うことを明示しつつ、numpyを再インストールして、ツール類を/usr/local下にリンクする。
$ pyenv global 3.5.1
$ brew install numpy --with-python3
$ brew link numpy
と、ゴミが残っていたのか、既存ファイルを上書きするオプションつけなさいと怒られるので言うとおりにする。
$ rm '/usr/local/bin/f2py'
$ brew link --overwite numpy
いよいよOpenCVのインストール。ここでもpython3で使うことを明示しておく。
$ brew install opencv3 --with-python3
と、setuptoolsをimportできませんエラーにより、早々にコケる。なぜに…?
この辺りはanyenv環境のせいな気がする。
取り急ぎ、Python2系でインストールしてみる。
$ pyenv global 2.7.11
$ brew install numpy --with-python3
$ brew link --overwrite numpy
$ brew install opencv3 --with-python3
今度はうまくビルドできた。
以下のように、anyenv下のpyenv下に、cv2.soのシンボリックリンクを作成して、python2/3両方からimport cv2できるようにする。
~ $ ln -fs /usr/local/Cellar/opencv3/3.1.0_3/lib/python2.7/site-packages/cv2.so ~/.anyenv/envs/pyenv/versions/2.7.11/lib/python2.7/site-packages/
~ $ ls -al ~/.anyenv/envs/pyenv/versions/2.7.11/lib/python2.7/site-packages/cv2.so
lrwxr-xr-x 1 takashi staff 68 5 15 10:16 /Users/takashi/.anyenv/envs/pyenv/versions/2.7.11/lib/python2.7/site-packages/cv2.so -> /usr/local/Cellar/opencv3/3.1.0_3/lib/python2.7/site-packages/cv2.so
~ $ ln -fs /usr/local/Cellar/opencv3/3.1.0_3/lib/python2.7/site-packages/cv2.so ~/.anyenv/envs/pyenv/versions/3.5.1/lib/python3.5/site-packages/
~ $ ls -al ~/.anyenv/envs/pyenv/versions/3.5.1/lib/python3.5/site-packages/cv2.so
lrwxr-xr-x 1 takashi staff 68 5 15 11:04 /Users/takashi/.anyenv/envs/pyenv/versions/3.5.1/lib/python3.5/site-packages/cv2.so -> /usr/local/Cellar/opencv3/3.1.0_3/lib/python2.7/site-packages/cv2.so
python2では無事cv2をインポートできて、顔認識できた!これは感動。
ところが、結局python3でのimport エラーは解決できず。なんでだー。
In [1]: import cv2
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
<ipython-input-1-72fbbcfe2587> in <module>()
----> 1 import cv2
ImportError: dlopen(/Users/takashi/.anyenv/envs/pyenv/versions/3.5.1/lib/python3.5/site-packages/cv2.so, 2): Symbol not found: _PyCObject_Type
Referenced from: /Users/takashi/.anyenv/envs/pyenv/versions/3.5.1/lib/python3.5/site-packages/cv2.so
Expected in: flat namespace
in /Users/takashi/.anyenv/envs/pyenv/versions/3.5.1/lib/python3.5/site-packages/cv2.so
とりあえず、IPythonデータサイエンスクックブックが言うとおり、python2でOpenCVの勉強を始めようと思います…。