OpenCV 5.0.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 5.0.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
非線形分離可能なデータに対するサポートベクターマシン

前のチュートリアル: サポートベクターマシン入門

原著者Fernando Iglesias García
互換性OpenCV >= 3.0

目的

このチュートリアルでは、以下の方法を学ぶ:

  • 訓練データを線形に分離できない場合のSVMの最適化問題を定義する。
  • この種の問題に合わせてSVMを適応させるための引数の設定方法。

動機

線形分離できない訓練データを扱うためにSVMの最適化問題を拡張することには、なぜ意義があるのか。コンピュータビジョンでSVMが用いられる用途の多くは、単純な線形分類器よりも強力なツールを必要とする。これは、こうしたタスクでは 訓練データを超平面で分離できることはまれである という事実に起因する。

こうしたタスクの一つ、たとえば顔検出を考えてみる。この場合の訓練データは、顔である画像の集合と、顔でない画像の集合(顔以外のあらゆるもの)から構成される。この訓練データは非常に複雑であり、顔の集合全体を顔でない集合全体から線形に分離できるような各サンプルの表現(特徴ベクトル)を見つけることは困難である。

最適化問題の拡張

SVMによって分離超平面が得られることを思い出してほしい。したがって、訓練データが線形分離できない以上、見つかった超平面はサンプルの一部を誤分類することを認めざるを得ない。この 誤分類 は、考慮すべき最適化の新たな変数となる。新しいモデルには、最大のマージンを与える超平面を見つけるという従来の要件と、分類誤りを過度に許容せずに訓練データを正しく汎化するという新たな要件の両方を含める必要がある。

ここでは、マージン を最大化する超平面を求める最適化問題の定式化から出発する(これは前のチュートリアル(サポートベクターマシン入門)で説明されている)。

\[\min_{\beta, \beta_{0}} L(\beta) = \frac{1}{2}||\beta||^{2} \text{ subject to } y_{i}(\beta^{T} x_{i} + \beta_{0}) \geq 1 \text{ } \forall i\]

このモデルを修正して誤分類誤差を考慮に入れる方法は複数ある。たとえば、同じ量に、訓練データ中の誤分類誤差の数に定数を掛けたものを加えて最小化することが考えられる。すなわち:

\[\min ||\beta||^{2} + C \text{(misclassification errors)}\]

しかし、これはあまり良い解ではない。いくつかの理由があるが、その一つとして、本来属すべき決定領域からわずかな距離で誤分類されたサンプルと、そうでないサンプルを区別していないことが挙げられる。したがって、より良い解は 誤分類されたサンプルから正しい決定領域までの距離 を考慮する。すなわち:

\[\min ||\beta||^{2} + C \text{(distance of misclassified samples to their correct regions)}\]

訓練データの各サンプルに対して、新たな引数 \(\xi_{i}\) を定義する。これらの引数はそれぞれ、対応する訓練サンプルから正しい決定領域までの距離を保持する。次の図は、2つのクラスからなる線形分離できない訓練データ、分離超平面、および誤分類されたサンプルから正しい領域までの距離を示している。

覚え書き
図には、誤分類されたサンプルの距離のみが示されている。残りのサンプルの距離は、すでに正しい決定領域内に位置しているためゼロである。

図に現れる赤線と青線は、各決定領域に対するマージンである。各 \(\xi_{i}\) が、誤分類された訓練サンプルから、本来属すべき領域のマージンまでを表していることを理解することが非常に 重要 である。

最終的に、最適化問題の新しい定式化は次のようになる:

\[\min_{\beta, \beta_{0}} L(\beta) = ||\beta||^{2} + C \sum_{i} {\xi_{i}} \text{ subject to } y_{i}(\beta^{T} x_{i} + \beta_{0}) \geq 1 - \xi_{i} \text{ and } \xi_{i} \geq 0 \text{ } \forall i\]

引数 C はどのように選べばよいのか。この問いの答えが訓練データの分布の仕方に依存することは明らかである。一般的な答えはないが、次の規則を考慮に入れると役立つ:

  • C を大きくすると、誤分類誤差は少ないマージンが小さい 解が得られる。この場合、誤分類誤差を起こすコストが高いことに注意する。最適化の目的は引数を最小化することなので、誤分類誤差はほとんど許容されない。
  • C を小さくすると、マージンが大きく分類誤差が多い 解が得られる。この場合、最小化は和の項をあまり重視しないため、大きなマージンを持つ超平面を見つけることにより重点が置かれる。

ソースコード

ソースコードはOpenCVソースライブラリの ml/samples フォルダにもある。あるいは ここからダウンロード できる。

解説

  • 訓練データを設定する

この演習の訓練データは、2つの異なるクラスのいずれかに属する、ラベル付き2D点の集合で構成される。演習をより興味深いものにするため、訓練データは一様確率密度関数 (PDF) を用いてランダムに生成される。

訓練データの生成は2つの主要な部分に分けている。

最初の部分では、両クラスについて線形分離可能なデータを生成する。

2番目の部分では、両クラスについて線形分離できない、重なり合うデータを生成する。

  • SVMの引数を設定する
覚え書き
前のチュートリアル サポートベクターマシン入門 では、ここでSVMを訓練する前に設定する cv::ml::SVM クラスの属性について説明している。

ここで行う設定と、参照元とする前のチュートリアル(サポートベクターマシン入門)で行った設定との違いは、わずか2点だけである。

  • C。ここでは、最適化において誤分類誤差を過度に罰しないよう、この引数に小さな値を選んだ。これは、直感的に期待される解に近いものを得たいという考えに基づいている。ただし、この引数を調整して問題への理解を深めることを推奨する。

    覚え書き
    この場合、クラス間の重なり領域にある点はごくわずかしかない。FRAC_LINEAR_SEP に小さい値を与えれば点の密度を高めることができ、引数 C の影響をより深く調べられる。
  • アルゴリズムの終了条件。線形分離できない訓練データを含む問題を正しく解くには、最大反復回数を大幅に増やす必要がある。具体的には、この値を5桁分大きくした。
  • SVMを訓練する

SVMモデルを構築するために cv::ml::SVM::train メソッドを呼び出す。訓練処理にはかなり長い時間がかかる場合があることに注意する。プログラムを実行する際は気長に待ってほしい。

  • 決定領域を表示する

cv::ml::SVM::predict メソッドは、訓練済みSVMを用いて入力サンプルを分類するために使われる。この例では、SVMが行った予測に応じて空間に色を付けるためにこのメソッドを使用した。言い換えると、画像を走査し、その各ピクセルをデカルト平面上の点として解釈する。各点は、SVMが予測したクラスに応じて色付けされ、ラベル1のクラスであれば濃い緑、ラベル2のクラスであれば濃い青で表示される。

  • 訓練データを表示する

cv::circle メソッドは、訓練データを構成するサンプルを表示するために使われる。ラベル1のクラスのサンプルは薄い緑で、ラベル2のクラスのサンプルは薄い青で表示される。

  • サポートベクトル

ここでは、サポートベクトルに関する情報を得るためにいくつかのメソッドを使用する。cv::ml::SVM::getSupportVectors メソッドはすべてのサポートベクトルを取得する。ここでは、このメソッドを使ってサポートベクトルである訓練サンプルを見つけ、それらを強調表示している。

結果

  • このコードは画像を開き、両クラスの訓練サンプルを表示する。一方のクラスの点は薄い緑で表され、もう一方のクラスには薄い青が使われる。
  • SVMは訓練され、画像の全ピクセルを分類するために使われる。その結果、画像は青の領域と緑の領域に分割される。両領域の境界が分離超平面である。訓練データは線形分離できないため、両クラスのサンプルの一部が誤分類されているのがわかる。いくつかの緑の点が青の領域に、いくつかの青の点が緑の領域に位置している。
  • 最後に、サポートベクトルが訓練サンプルの周囲のグレーのリングを用いて表示される。

この実行例は こちらのYouTube で確認できる。