この記事はOpenCV Advent Calendar 2022の22日目の記事です。
1. はじめに
https://www.youtube.com/watch?v=DEWr-iOEuvEにてOpenCV Development Team LeaderであるVadim Pisarevskyさんのインタビュー動画が公開されており、そこでcv::Mat
の設計経緯が語られています。古くからOpenCVを使っている人、最近OpenCVを使い始めた人どちらにも興味深い内容だと思われるのでこの動画の内容を紹介していきます。
2. IplImage時代
- OpenCVはIntelのIPL(Intel Image Processing Library)に追加する形で開発が始まったため、OpenCV開発初期のデータ構造はIplImageであった
- しかし、コンピュータビジョンの用途で使うにはIplImageでは不十分であることがわかった
- カメラ幾何を扱おうとすると汎用的に行列を扱えるクラスが必要
- 3次元以上の多次元配列が必要
- そのような背景もあり、CvMat、CvMatND、CvSparseMatを追加した
- ・・・が、IntelはIPLの開発を停止したため、IPLとの互換性を維持する必要がなくなった
3. IplImageからcv::Matへ
- 2008年にWillow Garageが資金提供を開始し、リソースも増えたので、以前から要望があったC++ APIを追加するためにOpenCVを再設計することにした
- C++ API設計の参考になるものを探していたところ、MATLABが非常に良い例であることわかった
- MATLABのmatrixやarrayのデータ構造はツールボックス間で共通であり、互換性に優れている
- 画像、行列を同じデータ構造で扱え、変換処理が不要
- そのため、MATLAB APIを参考にしてC++でcv::Matを実装し、IplImageから置き換えることにした
4. Q&A
4.1 cv::Matでスマートポインタを使わなかったのはなぜ?
- スマートポインタが使えるようになるのはC++11からだが、cv::Matを作ったのが2009年。C++11が標準化されるまでcv::Matの開発を待つことができなかった
- メモリ管理については参照カウントを使った実装を独自に入れているが、開発初期からアトミック操作となるようなメカニズムで実装したため、cv::Matは複雑なアーキテクチャになっている
4.2 cv::Matをテンプレートクラスにしなかったのはなぜ?
- テンプレートクラスにするとコンパイルに時間が掛かるため
- Pythonにテンプレートがないため。当時からPythonに注目していたが、cv::MatをテンプレートクラスにしてしまうとPythonラッパーが実現しにくくなるため採用されなかった。
4.3 なぜcv::Mat_<T>を作った?
- 要素にアクセスする便利な操作を提供するため
- この機能を使うとOpenCV内部のコード量が減らせる、くらいの意味合いが強い
4.4 cv::Matは異なるデバイスのメモリをサポートできるようになる?
- GPUなどのアクセラレータでコンピュータビジョンの処理を高速化するのがトレンドであることを理解している
- 10年ほど前にこれから標準になるであろうOpenCLをサポートしようという話になり、UMatを実装した
- ・・・が、OpenCLは今や半ば放棄された規格になってしまっており、多くのメーカーは他のフレームワーク(Vulkanなど)を使おうとしているように見える
- 現状、皆がそれぞれ異なるフレームワークを使っていて今後どのAPIに依存するかわからないため、cv::Matを異なるデバイスで汎用的に使えるユニバーサルなクラスにするのは難しい状況であると考えている
4.5 cv::Matのアップデート計画
今のところ、cv::Matから新しいものに完全に置き換えるような計画はないが、以下のようなアップデートを予定している。
- BFloat16(https://cloud.google.com/tpu/docs/bfloat16)サポート追加
- GoogleのTPUやIntelのハードウェアでサポートしている
- 1-dimensional tensorsサポート追加
- ディープラーニング分野のニーズに合わせて
- cv::Matにデータの中身を表すようなタグを追加
- 例えば、データの中身がRGBなのかBGRなのかを表すタグ https://github.com/opencv/opencv/wiki/OE-5.-OpenCV-5#extended-set-of-basic-types-built-in-color-space-information
- 意図せず不適切なチャンネルの画像を入力するとDNNで得られる精度が低下してしまうため、このタグを使ってチェックするとこの問題を防ぐことができるはず
5. おわりに
この記事では「Interview with Vadim Pisarevsky on class cv::Mat in OpenCV」の動画の内容を紹介しました。間違っている箇所があればコメント等でフィードバックください。