【M1 Mac】ImportError: dlopen(/Users/test/.pyenv/versions/3.7.12/lib/python3.7/site-packages/_dlib_pybind11.cpython-37m-darwin.so, 0x0002): symbol not found in flat namespace ‘_png_do_expand_palette_rgb8_neon’で苦しんだ話
- 2022.02.28
- IT
pythonで画像認識をしようと、OpenCVとdlibを使用しようとして、詰まった話です。
元々は「すぐに使える!業務で実践できる!Pythonによる AI・機械学習・深層学習アプリのつくり方」という本を使って画像認識を行う予定だったのですが、環境構築に詰まったので共有します。
環境
- M1 MacBook Air
- OS: Monterey
- Python 3.9.10
- PyenvとPipenvの仮想環境を使用
-
pip 22.0.3
- zsh
- pythonの環境変数の設定は下記。
eval "$(pyenv init --path)"
- pythonの環境変数の設定は下記。
状況
OpenCVを使うプログラムにて、Dlibを利用するとImportErrorが起こる。
1 2 3 4 5 |
File "facecut.py", line 1, in <module> import cv2, dlib, sys, glob, pprint File "/Users/test/.pyenv/versions/3.7.12/lib/python3.7/site-packages/dlib/__init__.py", line 19, in <module> from _dlib_pybind11 import * ImportError: dlopen(/Users/test/.pyenv/versions/3.7.12/lib/python3.7/site-packages/_dlib_pybind11.cpython-37m-darwin.so, 0x0002): symbol not found in flat namespace '_png_do_expand_palette_rgb8_neon' |
解決策
どうやら、もしくは、Pip経由ではなく、Brew経由でDlibをインストールしたので依存関係が解決された模様。
もしくは、pipのCacheが邪魔をしていた模様。キャッシュを削除してから再インストールする。
- まずはhomebrewでCmakeをインストールする。
- 次にHomebrewでDlibをインストールする。
- OpneCVのインストール
pip install opencv-python
- Pipのキャッシュの削除
- Pip install dlibを行うと、下記のようにキャッシュを使用しているとログが出る。
- このキャッシュを削除する。
-
12345(python) test@tests-MacBook-Air mask % pip install dlibCollecting dlibUsing cached dlib-19.23.0-cp39-cp39-macosx_12_0_arm64.whlInstalling collected packages: dlibSuccessfully installed dlib-19.23.0
-
pip cache purge
- dlibのインストール
pip install dlib
- これで解決した。
まとめ
pythonのバージョンが3.8でないといけない、やM 1特有の問題、など色々情報があったが、
M 1 Macでも、Python3.9系でOpenCVとDlibを使用することができた。
参考
https://github.com/davisking/dlib/issues/2268#issuecomment-800792633