【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
【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’で苦しんだ話

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)"

状況

OpenCVを使うプログラムにて、Dlibを利用するとImportErrorが起こる。

 

解決策

どうやら、もしくは、Pip経由ではなく、Brew経由でDlibをインストールしたので依存関係が解決された模様。

もしくは、pipのCacheが邪魔をしていた模様。キャッシュを削除してから再インストールする。

 

  • まずはhomebrewでCmakeをインストールする。
  • 次にHomebrewでDlibをインストールする。
  • OpneCVのインストール
    • pip install opencv-python
  • Pipのキャッシュの削除
    • Pip install dlibを行うと、下記のようにキャッシュを使用しているとログが出る。
    • このキャッシュを削除する。
    • 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