この記事はOpenCV Advent Calendar 2024の18日目の記事です。
はじめに
2024年12月6日にOpenCV 5.0.0 alphaがリリースされました。この記事執筆時点では、alpha版ではありますが、OpenCV 5系リリースを心待ちにしていた方も多いのではないでしょうか?https://github.com/opencv/opencv/wiki/OpenCV-Change-Logs#version50-alphaにOpenCV 5.0.0 alpha変更点のハイライトが書いてあるのでこちらを読みながら正式版リリースに備えてキャッチアップしていきましょう。
本記事では公式のChange Logsでは触れられていない変更経緯、追加情報を一部加筆しています。
変更点は以下のものに分類されます。
- [5+4.x] 既に最新の4.x系に組み込まれているが重要なもの
- [5.0] 5.0リリース時点で完了予定のもの
- [5.x] 5.0リリースに何かしら入るが、以降の5.xリリースで完成を目指すもの
OpenCV 5.0.0 alphaのハイライト
全般的な変更、改善
- [5+4.x] OpenCV 4.5.0以降およびOpenCV 5.0はApache 2 ライセンスで配布されるようになりました(参考1、参考2)
- OpenCV 5.0のminimum C++ standardはC++ 17となりました。デフォルトはC++ 17となっていますが、C++ 20、C++ 23との互換性も計画されています。
- OpenCVでPython 2サポートは削除されました。Python 3の場合、Python 3.6+のみサポートされます。
大規模なリファクタリング
- OpenCV 4.xで一部残っていたC API(
cvCreateMat()
、cvFindContours()
)や構造体(CvMat
など)が削除されました。-
CV_8U
などのCV_
マクロは残っています。
-
- OpenVXサポート削除
- ベンダーがOpenCVアクセラレーションのためにOpenVXカーネルを使用する場合、後述するカスタム「非CPU」HALを使用してください
- 詳細はhttps://github.com/opencv/opencv/issues/24995を参照ください。
- gapiモジュール(Graph API)のopencv_contribへの移動
- mlモジュール(クラシックなMLアルゴリズム)のopencv_contribへの移動
- 詳細はhttps://github.com/opencv/opencv/issues/24997を参照ください。
- Pythonの場合、scikit-learnを使う方がはるかに優れているためです。
- features2dモジュールからfeaturesモジュールへのリネーム
-
[5.0] flannモジュール見直し
- 近似最近傍検索は今日でもよく使われている重要なアルゴリズムである
- しかし、flannモジュールのベースとなっているFLANN(https://github.com/flann-lib/flann)は非常に古く、メンテナンスされていない
- そのため、Annoy(https://github.com/spotify/annoy)への置き換えを行う
- 詳細はhttps://github.com/opencv/opencv/issues/24998、https://github.com/opencv/opencv/pull/25708を参照ください。
- objdetectモジュールにあったHaar-basedおよびHOG-based detectorsをopencv_contribのxobjdetectモジュールへの移動
- コードクリーンアップのため、ディープラーニング以前のクラシックなobject detectionアルゴリズムをopencv_contribに移動
- 詳細はhttps://github.com/opencv/opencv/issues/25004を参照ください。
- calib3dモジュールの分離
- OpenCV 5.0から以下のモジュールに分離された
- 3dモジュール:基本的な3Dジオメトリ、3Dビジョンアルゴリズム
- calibモジュール:カメラキャリブレーションアルゴリズム
- stereoモジュール:ステレオ対応による深度マップ推定アルゴリズム
- OpenCV 5.0から以下のモジュールに分離された
- サンプルコードクリーンアップ
- 多くの古いサンプル(C++サンプルの約50%、Pythonサンプルの5%)が削除され、残りのサンプルの多くは改訂。
詳細を知りたい方はhttps://github.com/opencv/opencv/issues/25007を参照ください。
coreモジュール改善
- サポートするデータ型の拡張
- OpenCV 5.0から新規追加されるデータ型
- bfloat (a.k.a. bfloat16_t):
CV_16BF
- uint32_t:
CV_32U
- uint64_t:
CV_64U
- int64_t:
CV_64S
- bool:
CV_Bool
- bfloat (a.k.a. bfloat16_t):
- CV_Bool型のデータをマスクとして利用できるようになった
- 詳細はhttps://github.com/opencv/opencv/issues/25895を参照してください。
- hfloat、bfloatをネイティブにサポートしていないハードウェア上でも実行可能に
- 必要に応じてインライン関数で効率的に変換を行う
- OpenCV 5.0から新規追加されるデータ型
- 2次元未満の配列、つまり 1D(ベクトル)と0D (スカラー)をサポート
- LAPACKをOpenCV内で常に利用できるようになった
- システムに外部LAPACKライブラリがインストールされていない場合、OpenCVはLAPACKの内部の小さなサブセットを構築して使用
- 詳細はhttps://github.com/opencv/opencv/pull/18571を参照ください。
- 5.0、5.x: 5.0リリースの前後にさらなるリファクタリングと改善が期待されています https://github.com/opencv/opencv/issues/25011
imgprocモジュール改善
- warping処理(warpAffine、warpPerspective、remap)の高速化
- プラットフォーム、画像サイズ、タイプ、操作フラグによるが、10%から300%以上高速化を図った
- これらの関数およびその他の重要な画像処理関数のさらなる最適化は5.0正式リリースで対応予定
- 詳細はhttps://github.com/opencv/opencv/pull/26505を参照ください。
- STBベースのTrueTypeエンジンと埋め込みTrueTypeフォントが使用されるようになりました。ユーザーはカスタムフォントを読み込んで使用することもできます。
- STB対応についてはputText()関数でtruetype fontを使ったテキスト描画ができるようになりました! #OpenCV - Qiitaを参照ください。
- この機能を使う際、いくつかの注意点があります。
- アラビア語やデーヴァナーガリー文字などの一部の文字は適切にレンダリングされないため、Harfbuzzを追加する必要があります。
- いくつかの複合Unicode記号は適切にレンダリングされません。
- STBは単純な白黒エンジンであるため、カラー絵文字はサポートされていません。
- [5.0、5.x] 5.0リリースの前後にさらなるリファクタリングと改善が予定されています https://github.com/opencv/opencv/issues/25012
HAL(Hardware Acceleration Layer)更新
HAL(Hardware Acceleration Layer)について気になる方はOpenCVのHALモジュールと高速な数値計算ライブラリ #画像処理 - Qiitaを参照ください。
- [5+4.x] OpenCV HALに多くの新しいエントリが追加され、さまざまなベンダーがOpenCV関数にカスタムアクセラレーションを提供できるようになりました。5.0では、さらにいくつかの新しいHALエントリが追加されます。
-
[5+4.x] アルゴリズムによっては、ユーザーが速度と精度のどちらかを優先するかを選択できるように
AlgorithmHint
でヒント情報を設定できるようになりました。これは、ベンダーが高速な実装を提供していてもOpenCVのジェネリックな実装と出力互換性がないケースを考慮するためです。ALGO_HINT_DEFAULT
ALGO_HINT_ACCURATE
ALGO_HINT_FAST
-
[5+4.x] ディープラーニング推論、画像処理、その他のアルゴリズムを高速化するために数学関数 (v_exp, v_log, v_erf, v_sincos)の実装がUniversal intrinsicsに追加されました。
- 詳細はhttps://github.com/opencv/opencv/pull/24941を参照してください。
- Universal intrinsicsにおけるFP16実装がARMv8 NEONおよびRISC-V RVVバックエンドに追加されました。FP16 SIMD演算はデフォルトでは利用できないため、特別なオプションを使用してコードをビルドする必要があります。OpenCVでは、実際のハードウェアに応じて最適なカーネルの種類を選択するランタイムディスパッチメカニズムを使用します。
- [5.0, 5.x] UMatは、CPUまたは非CPUの配列/テンソルを格納できるように拡張されます。つまり、OpenCLのみのソリューション (T-API)から、ユニバーサルな異種API(U-APIまたは「非CPU HAL」と呼ぶこともあります)に移行し、UMatがそのメインのデータコンテナーになります。他にも多くの改善が期待されています。https://github.com/opencv/opencv/issues/25019、https://github.com/opencv/opencv/issues/25025
dnnモジュール更新
- 新しい推論エンジンが導入され、古い推論エンジンと共存できるようになりました。新しい推論エンジンは、dynamic shapesやその他の最新のONNX機能のサポートを強化します。5.0では、古い推論エンジンよりもONNX仕様のカバレッジが大幅に向上しました。
- 使用する推論エンジンを制御するためのパラメータが
cv::dnn::readNet()
に追加されました。詳細はhttps://docs.opencv.org/5.x/d6/d0f/group__dnn.html#gab13999feed711a37d50c1bdb4f01b458を参照ください。- デフォルトでは、最初に新しいエンジンを試し、モデルのロードに失敗すると、古い推論エンジンに戻ります。新しい推論エンジンまたは古い推論エンジンを強制的に使用することもできます。内部表現が異なるため、モデルがロードされた後に推論エンジンを切り替えることはできません。
- ONNX、Caffe、TF、TFLite形式のパーサーが更新され、エンジンが選択できるようになりました。
- [5.0, 5.x] 新しいエンジンはデフォルトのバックエンドとCPUターゲットのみをサポートしています。5.0までにさらに多くのバックエンドとターゲットが有効になり、その後の5.xリリースではさらに多くのバックエンドが有効になる予定です。 #26198
calib3dモジュール更新
- [5+4.x] ホモグラフィ、基本行列の推定、PnP 問題の解決などを行う RANSAC ベースのアルゴリズムに、大幅に効率化された USAC フレームワーク (特にノイズの多いデータセットの場合) が使用されるようになりました。詳細はhttps://docs.opencv.org/5.x/de/d3e/tutorial_usac.htmlを参照ください。
- 新しい Levenberg Marquardtアルゴリズムが実装され、高速化および精度向上しています。
- 詳細はhttps://github.com/opencv/opencv/pull/21018を参照してください。
- 効率的なマルチカメラ キャリブレーション フレームワークが calib モジュールに追加されました。これには、スマート初期化と USAC ベースの最適化パイプラインが含まれており、同時にキャリブレーションされたすべてのカメラの相対位置を最初のカメラに対して計算します。さまざまなカメラ構成がサポートされています (すべてのピンホール カメラ、すべての魚眼カメラ、および混合ケース)。詳細についてはチュートリアルを参照してください。
- 基本的なメッシュ処理およびポイントクラウド処理アルゴリズム (TSDF、ICP など) に関する作業を開始
- .plyや.objなどの一般的なポイントクラウド形式のインポーターとエクスポーターを追加
サンプルコード改訂
- classification、segmentation、object detection、edge detection、tracking、person reidのサンプルコード改訂
-
cd <opencv>/samples/dnn && python3 download_models.py
でモデルコレクションをダウンロード可
-
- LLM (GPT2)のサンプル、diffusion(LDM)モデルのサンプル追加
おわりに
本記事ではOpenCV 5.0.0 alpha変更点のハイライトを駆け足で追っていきました。変更点をキャッチアップしてOpenCV 5.0移行でライバルに差をつけていきましょう。明日は@nonbiri15さんの担当でタイトルは「Open3Dを使い始めてみた」です。お楽しみに。