■はじめに
こちらは、裏OpenCV Advent Calenderのオオトリ、25日目の記事です! 今回はOpenCV5のさらに次、 OpenCV6 に対する自分の想いをまとめていきたいです。
なお、具体的な根拠はありません!!こうだったらいいな、こうなったらいいな、という 完全にポエム です!!
■OpenCV6が実現する世界:Connected Volition(接続された意志)
これまで、OpenCV 4や5において、開発者は常に『How(どう処理するか)』を記述してきました。画像データに対して、どのフィルタをどの順序で適用し、肥大化するパラメータをどう微調整するか。その複雑さは利用者を混乱させ、ソースコードをマジックナンバーの海に沈めてきました。
しかし、OpenCV 6が目指すべきは、開発者が『What(何をしたいのか)』を記述するだけで、ライブラリがその意図を自律的に推論し、最適な処理系を選択・調整する世界です。開発者がリファレンスマニュアル片手に悩むのはもう終わりにしましょう。
この『What』を実現するために必要なのが、従来の画像入力の枠を超え、あらゆる感覚と文脈を接続する『統合知覚I/Oレイヤー』であり、その中枢を担う『Connected Volition(接続された意志)』という思想なのです。
■cv::Vital
OpenCV6のConnected Volition(接続された意志)では、cv::Vitalという考えがとても重要です。cv::Vitalは、従来のcv::Matのような単なるデータ配列のコンテナではありません。そこには「意思」があるのです。
▢ 統一的なインターフェース(Everything is Vital)
開発者は、入力がカメラ画像であれ、イベントストリームであれ、あるいはAIによる「判断結果」であれ、すべて cv::Vital オブジェクトとして扱う。
- 感官のVital: 画像、音声、EVS(イベントベース)などのRAWデータ と、それを管理するためのメタデータ
- 意志のVital: 「赤い車が時速60kmで移動中」といった、推論層から出力された「判断結果」や「セマンティクス」
▢ 自己記述性(Self-Describing Context)
cv::Vitalは、自分自身が何者であるかを常に知っています。
- 意図の保持: 色空間(BGR/RGB/HSV)、座標系、単位系、確信度(Confidence)などを内包。また、計算精度なども保持
- 出自の証明 (Provenance): どのセンサーから、いつ、どのフィルタを経て生成されたかの履歴を保持。これにより、後続の処理が自律的に最適化されます(後述の遅延実行にも関連)
▢ 遅延実行と自律最適化(On-demand Vitalization)
cv::Vital は「計算のレシピ」を保持しており、必要になるまで実行を猶予します。
- 遅延評価: vital_b = vital_a.filter(...) という記述は、それぞれのvitalの関係性の記述であって、即時実行はされません。これは、処理のスケジューリングの最適化において特に計算資源分配に大きな役割を果たします
ただし、一番のお勧めは、vital_b.proc += Taget(``).Action()記法です。この場合、画像データ内からTargetを選択して、Actionを実行する"予約"をする命令です。 - ハードウェアの隠蔽: vital_b の中身が必要になった瞬間、システムが背後のリソース(GPU/NPU)を自動選択して最短経路で計算を実行します
- 遅延実行と自律最適化(On-demand Vitalization)
計算するときは本当に使うデータだけを、再効率にスケジューリングして処理します。例えばマルチコアCPUならばどこのコアに処理をさせるのか、ハードウェアを使うのか、そういったこともライブラリが自動的に最適化します
■ 統合知覚I/Oレイヤー(Integrated Perceptual I/O Layer)
このcv::Vitalを、現実世界・仮想世界の様々なエンティティと接続する仕組みが、統合知覚I/Oレイヤー(Integrated Perceptual I/O Layer)です。
特に今まで足りていなかった「テキストプロンプト入力」や「外部デバイス制御」、「外部エージェント連携」も扱う事で、現実世界へ積極的に干渉できるようになります!!
| データ種別 | 担当モジュール | OpenCV4 Support |
|---|---|---|
| データコンテナ(YAML/XML/JSON) | core | ✔ |
| 静止画(JPEG/PNG/TIFF/...) | imgcodecs | ✔ |
| 動画/音声(AVI/MP4/...) | videoio | ✔ |
| 画像表示 | highgui | ✔ |
| バーコード・マーカー入出力 | objdetect(QRCode/Aruco) | ✔ |
| テキストプロンプト入出力 | 無し | |
| 外部デバイス制御 | 無し | |
| 外部エージェント連携 | 無し |
これらはすべて、.source() = ... や .sink() = ... という記述によって自動的に接続されます。どこかで見たことがある?そうです、GStreamerのpipelineからヒントを得ています。
開発者は明示的にパラメータ指定する事"も"できますが、必要なパラメータをライブラリ側で判断し、最適化することも可能です。
■コーディングサンプル
auto v = cv::Vital::create();
v.source = cv::camera(0);
v.proc += cv::find("cat").mark("red").console("name");
v.proc += cv::find("dog").mark("blue").console("name");
v.sink = cv::imshow("win", cv::untilExit);
v.run();
cv::find()とした時点で、どのDNN modelを使えばいいのかは自動判別、とかまでやるイメージです。
繰り返しになりますが、開発者は「何をしたいのか」の記述にだけ心を配ってください。「どうやるのか」はライブラリが自動的に判断し、選択し、最適化します。
、
■おわりに: CV(Connected Volition)が変える2030年のコンピュータビジョン。
かつて、私たちがドラえもんのひみつ道具を見て 『こんなことができればいいな』 と夢想した未来は、今、私たちの手元のコードによって 少しずつ現実 になっています。
例えば、ほんやくコンニャク。食べればそれだけで世界中のだれとでも会話ができる夢のような道具。ところが現在、様々な機械学習技術の進化によって、リアルタイムにAI翻訳ができるようになりました。最早これは夢ではありません、現実です。
OpenCV 4や5は堅牢な基盤を築いてきました。しかし、それで終わっては勿体ないのです。いつか 『What』を語るだけで意志が繋がる Connected Volition や、生命の鼓動を宿した cv::Vital が実装される日 が来ることでしょう。
『夢は口にしなければ叶わない』――。
ならば、この妄想に満ちたOpenCV 6への提言が、いつか誰かのコミットメッセージに変わり、リファレンスマニュアルから解放された私たちが、より自由な創造へと踏み出すきっかけになることを願っています。
来年も、その先の未来も、OpenCVと共に。 Happy New Year。よいお年を。