import cv がsegfalするので AnacondaでOpenCVしたMacの話

Macにpyenv+opencvをインストールしたいのです

pyenv install 2.7.3 でインストールしたもの (A)

  • npymath.ini が見つからないエラー
  • scipyがインストール出来ない

pyenv virtualenv --distribute 2.7.3 venc27 でインストールしたもの (B)

libpython2.7.a (libpython2.7.dylib) が見つからない?

  • scipyはインストールできる
  • matplotlibがインストール出来ない
  • CC=clang pip install matplotlib なら通る

Linux(Ubuntu) でインストールしてみる (C)

Ubuntuなら動く

(A) と コレ(C) を比較してみると (A)には PYTHON_PATH/lib/python2.7/site-packages/numpy/core の下に lib ディレクトリが無い => numpyのインストールに失敗では?

numpyがきちんとインストールされない => opencvのpythonモジュールはnumpy必須なのでインストール出来ない

A,B はnumpyがきちんとインストールされていないであろうと思われる

どちらも numpyのimport_array() でsegfalしてる

このとき使ったインストールスクリプト

# brew switch ffmpeg 1.0

VERSION=2.4.3
INSTALL_DIR=$HOME/lib/opencv
# PYTHON_HOME=$HOME/.pyenv/versions/venv27
PYTHON_HOME=$HOME/.pyenv/versions/2.7.3
PYTHON_VERSION=2.7

mkdir -p opencv
cd opencv

curl -L http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/${VERSION}/OpenCV-${VERSION}.tar.bz2/download -o OpenCV-${VERSION}.tar.bz2
tar jxvf OpenCV-${VERSION}.tar.bz2

mkdir -p ${INSTALL_DIR}
cd OpenCV-${VERSION}

mkdir -p build
cd build

cmake \
  -G "Unix Makefiles" \
  -D CMAKE_BUILD_TYPE=RELEASE \
  -D CMAKE_INSTALL_PREFIX=$INSTALL_DIR \
  -D BUILD_NEW_PYTHON_SUPPORT=ON \
  -D PYTHON_LIBRARY=$HOME/.pyenv/versions/2.7.3/lib/libpython${PYTHON_VERSION}.a \
  -D PYTHON_EXECUTABLE=$PYTHON_HOME/bin/python \
  -D PYTHON_PACKAGES_PATH=$PYTHON_HOME/lib/python${PYTHON_VERSION}/site-packages \
  -D PYTHON_INCLUDE_DIR=$PYTHON_HOME/include/python${PYTHON_VERSION} ..

make -j4
make install

ScipySuperpackの力を借りる (D)

ScipySuperpack

(A) や (B) とほぼ同じ import_array() でsegfalする

Anacondaの力を借りる (E)

scipy勉強会で知ったAnacondaを入れてみる

Anaconda - Scalable Data Analytics and Scientific Computing in Python

  • パッケージコレクション
  • Anaconda CE は無料
  • 同梱されているパッケージはこちら http://docs.continuum.io/anaconda/1.3/pkgs.html
  • Mac用はOpenCVは同梱されていない
  • ローカルディレクトリにインストールできる
  • matplotlibやqt, scikit-learnやpandas, cythonまで一緒にインストールされる お手軽!!

Anaconda すんなり入りませんでした

libgcc_s.1.dylibがない

Python 2.7.3 :: Continuum Analytics, Inc.
creating default environment...
Traceback (most recent call last):
  File "/Users/yano/lib/anaconda/pkgs/conda-1.3.5-py27_0/lib/python2.7/site-packages/conda/install.py", line 28, in <module>
    import json
  File "/Users/yano/lib/anaconda/pkgs/python-2.7.3-6/lib/python2.7/json/__init__.py", line 108, in <module>
    from .decoder import JSONDecoder
  File "/Users/yano/lib/anaconda/pkgs/python-2.7.3-6/lib/python2.7/json/decoder.py", line 5, in <module>
    import struct
  File "/Users/yano/lib/anaconda/pkgs/python-2.7.3-6/lib/python2.7/struct.py", line 1, in <module>
    from _struct import *
ImportError: dlopen(/Users/yano/lib/anaconda/pkgs/python-2.7.3-6/lib/python2.7/lib-dynload/_struct.so, 2): Library not loaded: /usr/local/lib/libgcc_s.1.dylib
  Referenced from: /Users/yano/lib/anaconda/pkgs/python-2.7.3-6/lib/python2.7/lib-dynload/_struct.so
  Reason: image not found

みたいなエラーがでたので ln -s /usr/lib/libgcc_s.1.dylib /usr/local/lib/libgcc_s.1.dylib した

gccbrewからインストールしたgccを使っている

hfx_codecがインポートされてない

LookupError: unknown encoding: hex

と出てインストールが停止する。インストールスクリプトはAnacondaのインストール指定したディレクトリに展開されているので ~/lib/anaconda/pkgs/conda-1.3.5-py27_0/lib/python2.7/site-packages/conda/install.pyfrom encodings import hex_codec を追加して、インストールを再開

Anacondaのインストーラーのシェルスクリプトから抜き出したものを再度実行する

PREFIX=/Users/yano/lib/anaconda
PYTHON=python

echo "creating default environment..."
CONDA_INSTALL="$PREFIX/pkgs/conda-1.3.5-py27_0/lib/python2.7/site-packages/conda/install.py"
$PYTHON $CONDA_INSTALL --prefix=$PREFIX --pkgs-dir=$PREFIX/pkgs --activate-all || exit 1
echo "installation finished."

pyenvにAnacondaを管理させるには

pyenvは ~/.pyenv/versions ディレクトリ以下にPYTHON_PATHにあたるディレクトリをまるっと 移動させてやるとそれだけで認識してくれるので、 ~/lib/anaconda にインストールしたPythonとライブラリを anaconda ディレクトリをそのまま ~/.pyenv/versions/anaconda として移動してやれば大丈夫だと思いましたが、 どうやらanacondaがインストールするライブラリの参照しているパスや、shebangのパスが /usr/bin/env python でなく決め打ちになっているので、 インストール時に指定するパスを ~/.pyenv/versions/anaconca としましょう。

Anacondaのインストールはこれで終わり!

Anaconda環境にOpenCVをインストールする

さっきと同じようなスクリプトで。違いはPYTHON_HOMEとcmakeのPYTHON_LIBRARY

VERSION=2.4.3
INSTALL_DIR=$HOME/lib/opencv
PYTHON_HOME=$HOME/.pyenv/versions/anaconda
PYTHON_VERSION=2.7

mkdir -p opencv
cd opencv

curl -L http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/${VERSION}/OpenCV-${VERSION}.tar.bz2/download -o OpenCV-${VERSION}.tar.bz2

tar jxvf OpenCV-${VERSION}.tar.bz2

mkdir -p ${INSTALL_DIR}
cd OpenCV-${VERSION}

mkdir -p build
cd build

cmake \
  -G "Unix Makefiles" \
  -D CMAKE_BUILD_TYPE=RELEASE \
  -D CMAKE_INSTALL_PREFIX=$INSTALL_DIR \
  -D BUILD_NEW_PYTHON_SUPPORT=ON \
  -D PYTHON_LIBRARY=$PYTHON_HOME/lib/libpython${PYTHON_VERSION}.dylib \
  -D PYTHON_EXECUTABLE=$PYTHON_HOME/bin/python \
  -D PYTHON_PACKAGES_PATH=$PYTHON_HOME/lib/python${PYTHON_VERSION}/site-packages \
  -D PYTHON_INCLUDE_DIR=$PYTHON_HOME/include/python${PYTHON_VERSION} ..

make -j4
make install

cv2.soが参照しているライブラリのパスがおかしい

先程はDYLD_FALLBACK_LIBRARY_PATHを設定することで、この問題を回避しました。

libpython2.7.dylibのパスがおかしいのですが、では、どこを参照しているかというと、 /opt/anaconda1anaconda2anaconda3/lib/libpython2.7.dylib とかふざけたパスが設定されてるので、これをinstall_name_tool で修正します

% cd ~/.pyenv/versions/anaconda/lib/python2.7/site-packages
% install_name_tool -change /opt/anaconda1anaconda2anaconda3/lib/libpython2.7.dylib @executable_path/../lib/libpython2.7.dylib ./cv2.so

実行するpython~/.pyenv/versions/anaconda/binにあるので@executable_pathからの相対パスでいいと思います

追記:パスを修正するスクリプトを書きました >>

OpenCVのライブラリのパスはDYLD_LIBRARY_PATHに

追記:OpenCVのライブラリをanacondaに突っ込むスクリプトを書きました >>

OpenCVのライブラリのパスはずっとこのままの予定なので、DYLD_LIBRARY_PATHにセットしちゃいます

```sh

opencv

if [ -n "$DYLD_LIBRARY_PATH" ]; then export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:~/lib/opencv/lib else export DYLD_LIBRARY_PATH=~/lib/opencv/lib fi

</del>

<del>
ライブラリパスを修正したのとpyenvで管理するようになったので、
`PATHとDYLD_FALLBACK_LIBRARY_PATH の設定`で設定した環境変数は両方要らなくなりました。消しましょう
</dek>


これで`penv global anaconda`などでanacondaのpythonが使えるようになって、
さらにimport cvしてもsegfalしなくなりました。やったね!

# まとめ

- Anaconda便利
- OpenCVのpythonモジュールインストールすげぇはまるというか鬼門はnumpyだと思う
- pyenvとAnacondaは共存できる!