JP / EN

広告

ヘッドレスOpenCV:GUI省略による軽量化とインストール時の罠

タグ:python machine_learning

ある日PyPIのライブラリ一覧を眺めていてopencv-pythonには2種類の似た名前の異なる版が存在することに気づいた。
    opencv-python 4.9.0.80 2023年12月31日
    Wrapper package for OpenCV python bindings.

    opencv-python-headless 4.9.0.80 2023年12月31日
    Wrapper package for OpenCV python bindings.
  
このヘッドレスとは一体何なのだろうか?

「ヘッドレス(headless)」とは英語としては「首のない・首を斬られた」といった意味の単語である(こわい)。
これがコンピュータ用語としては打って変わってコンピュータを人体にたとえたときの頭部、すなわち ディスプレイなしのサーバ構成を指す。さらにヘッドレス環境に特化してGUI機能を省略した ライブラリやシステムプログラムのことも ヘッドレス版と呼んだりする。opencv-python-headlessもこの意味でヘッドレスと名付けられている。

OpenCVには開発用に簡易的な画像表示、アルゴリズムのパラメータなどを調整するためのスライドバーなどのウィジェット などのUI機能が同梱されている。画像処理アルゴリズムのチューニングは画像を見ながらできればやりやすいのでこれはこれで ありがたいのであるが、完成したアルゴリズムをサーバサイドアプリなどに載せるときは不要であるから このようにパッケージの切り替えで省略できるようになっているのだ。
そのくらいの容量をけちって何になるのか、と思う方もいるかもしれないが、クラウドでは高価なストレージを 節約したり、コンテナベースの構成で何台ものコンテナを同時に走らせたりするときには地味にうれしい量の節約が これでできる。

なお当然ではあるが、ヘッドレス版では省略されたGUI関係の機能を利用できないという弱点もある。 一度インストールしてしまった後は通常版と同名パッケージとして扱われるので、 気づかずにimportしてしまうとこのようなエラーがでる。
    cv2.error: OpenCV(4.9.0) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window.cpp:1272: 
    error: (-2:Unspecified error) The function is not implemented
  
highgui内部などGUI周りのnot implementedが出たらヘッドレス版を間違って入れていないかを疑うとよい。

わかりにくいパターンとして
  • パッケージAがopencv-pythonに依存
  • パッケージBがopencv-python-headlessに依存
しているときに気づかぬうちに両方が入って意図しない方を読んでこのエラーを出している場合もある。 両方入ってこのエラーができるときは、内部でのリンクなどを修正するために両方アンインストールしてから 本当に必要なほうだけを入れなおせば修正できる。(片方を消すだけだとpackage not foundエラーが出たことがある)。

おすすめ記事

PyTorchのテンソルを画像にして保存する

Squeeze / unsqueezeの使い方:要素数1の次元を消したり作ったりする

PyTorch Tensorを確実にNumpy Arrayに変換する



このエントリーをはてなブックマークに追加

https://wonderhorn.net/