17 形状マッチング
前章(チャプター 16)ではNCCを産業向け位置決めの主力アルゴリズムとして位置づけたが、同時にその限界も明らかにした。NCCは回転にもオクルージョン(遮蔽)にも耐性がなく、さらに非線形な照明変動にも対応できない。生産ラインではこれら3つの要因が常に発生する。ワークの搬入角度はランダムであり、クランプやキャリアテープがワークの一部を覆い、鏡面反射や油膜によってグレースケール値の写像が任意の曲線に歪められる。これら3つの不具合の根源は共通している。グレースケールマッチングはすべての画素のグレースケール値を比較するが、グレースケール値は画像中で最も不安定な要素であり、かつ画素ブロック自体が向きとサイズに固定されている。解決策は比較対象を変えることである。グレースケール値ではなく形状を比較するのだ。テンプレートをエッジ点(位置 + 勾配方向)の集合として抽象化し、角度とスケールで構成される姿勢グリッド上で探索し、これらの点における画像の勾配方向が一致するかどうかのみを検査する。これが形状ベースマッチングであり、商用ビジョンライブラリにおいて最も耐干渉性の高い位置決めアルゴリズムである。
本章では実際の産業用サンプル画像を用いて実験を行う。輪郭マッチングには、ある位置決めレシピのシルエットサンプル(図 17.1)を使用する。白地に黒い部品が置かれており、主役は五角形のクサビである。垂直な左辺、ほぼ水平な上辺、右側に収束する先端、右下の面取り角を持ち、平辺と面取りによって強い非回転対称性を有する。脇役としてリングワッシャーやラックギアなどの干渉部品も含まれる。5枚のサンプル画像には、このクサビがさまざまな角度で散らばっており(セクション 17.2)、回転に対するロバスト性と耐干渉性を試すのに最適である。スケール実験には別のサンプルセットを使用する。同じ部品(ねじ、つまみ、角型コネクタ)を3つのワーキングディスタンスで撮影し、カメラを後退させるにつれて部品が近くから遠くへと徐々に小さくなる(セクション 17.4)。
17.1 勾配方向に基づく類似度
形状マッチングのモデルは画素ブロックではなく、エッジ点のリストである。学習時にはテンプレートに対してエッジ抽出(チャプター 13 のヒステリシス閾値処理パイプライン)を実行し、\(n\) 個のエッジ点 \(p_i\) を得る。各点にはその位置における勾配方向 \(\theta_i\) が付随する。探索時にはこのリストを候補姿勢(平行移動 + 回転 + スケール)に従って画像上に変換し、各点の対応位置で画像の勾配方向を読み出し、姿勢に合わせて回転させたモデルの方向との差 \(\Delta\theta_i\) を求める。スコアは方向の一致度の平均値として算出される:
\[ s=\frac{1}{n}\sum_{i=1}^{n}\cos\Delta\theta_i . \]
方向が完全に一致すると \(\cos\Delta\theta_i=1\) となり \(s=1\) となる(SDKでは百分率に換算して100点として出力される)。方向がランダムな場合、正と負の寄与が打ち消し合い、スコアは0に近づく。この1つの式に形状マッチングの3つの強みが隠されている。
回転とスケールに対して自然に探索可能である。モデルは幾何学的座標を持つ点のリストであるため、全体を \(\phi\) 回転させ \(\sigma\) スケーリングするだけで新しい姿勢の予測が得られる。姿勢ごとにスコアを計算することで、連続的な角度とスケールの範囲で位置決めができる。これはグレースケールの画素ブロックにはできないことである。画素ブロックは回転するたびに再サンプリングする必要があり、そもそもNCCの式に角度という自由度が存在しない。
照明変動にロバストである。勾配方向はグレースケール値のゲインとオフセットの影響を受けないためである。画像を \(a f + b\)(\(a>0\))に置き換えると、勾配ベクトルは \(a\nabla f\) となる。長さは変化するが、方向は全く変わらない。さらに優れているのは、グレースケール写像が非線形であっても、局所的に単調であれば等グレースケール線の走向は変化せず、方向は保存されることである。NCCは線形な写像にしか対応できないが、勾配方向は滑らかな非線形な写像にも対応できる。
\(a<0\)(明暗反転)の場合、勾配方向は \(180^\circ\) 反転し、\(\cos\Delta\theta_i=-1\) となってスコアが低下する。\(\cos\) で評価する(極性の一致を要求する)か \(\lvert\cos\rvert\) で評価する(極性を無視する)かは、SDKのpolarityパラメータで制御する。曲面の鏡面反射やバックライト(透過照明)の切り替えによって局所的な極性が反転する場合にのみ、この値を2に設定して極性を無視する。
オクルージョンに自然な耐性を持つ。スコアが各点の寄与の平均であるためである。遮蔽物上に対応付けられたモデル点は、モデルと無関係な勾配方向を持つため、それらの寄与は \([-1,1]\) の範囲でランダムとなり平均は0に近づく。欠落した点はスコアを希釈するだけで、残りの可視点の寄与を全く損なわない。部品の7割が可視であれば、スコアはおよそ7割残る。NCCと比較すると、遮蔽された画素は大きなグレースケール残差を持ったまま平方和に全額計上されるため、少量の遮蔽でも相関値が識別不能なほど低下する。一方は「多数決」であり、他方は「1票拒否」である。これがロバスト性の差の根源である。
17.2 回転と耐干渉性実験
SciSvScaleShapeMatchを用いてサンプル1のクサビからモデルを作成し(角度範囲 \(\pm 180^\circ\)、ステップ \(1^\circ\)、スケール固定1.0)、minScore = 40で5枚のサンプル画像全体を探索した。5枚の画像には6個のクサビが散らばっており(サンプル3には2個が同フレーム内に存在)、6個すべてが検出された。角度は \(-152^\circ\) から \(+102^\circ\) まで、実に \(254^\circ\) の回転範囲に及んでいる:
| サンプル | インスタンス | 位置 (px) | 算出角度 | スコア |
|---|---|---|---|---|
| 1 | クサビ(テンプレート元、直立) | \((318, 237)\) | \(0^\circ\) | 99.8 |
| 2 | クサビ(大角度回転) | \((455, 497)\) | \(-152^\circ\) | 99.8 |
| 3 | クサビA | \((325, 196)\) | \(102^\circ\) | 99.6 |
| 3 | クサビB | \((323, 570)\) | \(89^\circ\) | 93.7 |
| 4 | クサビ(ほぼ直立) | \((702, 252)\) | \(1^\circ\) | 99.8 |
| 5 | クサビ(回転) | \((310, 209)\) | \(-68^\circ\) | 95.5 |
位置は \(1006\times 759\) にダウンサンプリングした画像における画素座標である。SDKが返す角度は数学的な正方向(反時計回りを正)であり、画像座標系(\(y\) 軸下向き)で描画する際には符号を反転させる。シルエットのエッジはコントラストが非常に高いため、回転角度が大きくても5枚すべての画像で検出スコアは93点以上を維持している。これはまさに「グレースケール値ではなく方向を比較する」ことの直接的な効果である。
特に注目すべき点が2つある。1つ目は、干渉部品が1つも誤検出されなかったことである。各画像にはmatchCount=3の検出枠を設けたが、リングワッシャーやラックギアといった「形状が異なる」部品はいずれもminScore=40に到達しなかった。勾配方向のリストはクサビ固有のエッジセグメントの組み合わせを認識するため、ワッシャーの円弧やラックの角歯は一致しないのである。2つ目は、再描画されたモデル輪郭が正確にフィットすることである。図 17.2 の各クサビ上の灰色の細線は、モデルのエッジを検出された姿勢(回転角を含む)に従って再描画したものであり、部品の実際の境界にぴったりと重なっている。サンプル2の \(152^\circ\) 回転したクサビでも、全くずれていない。
グレースケールNCCに同じ作業をさせると、すぐにその限界が露呈する。直立したクサビのテンプレート(回転探索なし)を用いて相関を計算すると、サンプル1の直立したインスタンスではNCC = 1.000(テンプレートはここから切り出されたもの)であるが、サンプル2の回転したインスタンスの中心(形状マッチングで得られた位置)ではNCCは 0.585 まで急落し、一般的な判定閾値である0.80を大幅に下回る。NCCの畳み込みウィンドウは1つの向きに固定されているため、ワークが回転すると位置が合わなくなりスコアが崩壊する。形状マッチングは角度を明示的な探索次元としているため、どの角度に回転していても部品を見つけ出す。これがNCCと形状マッチングの最も根本的な違いである。前者は1つの姿勢しか認識しないが、後者は姿勢空間全体を探索するのである。
17.3 オクルージョン実験
実際のサンプルでは部品同士が十分に離れており、既成のオクルージョンシーンが存在しない。そこでサンプル1のクサビ上に合成された中間色の遮蔽バーを重ね合わせ(キャリアテープやクランプがワークを横切る状況を模擬)、その他の画素は実際のままとした。遮蔽バーは部品の面積の36.0%を覆っており(可視率は0.64)、再度探索を行った。形状マッチングは依然として正確に検出し、姿勢は \((318, 237)\)、\(0^\circ\) で遮蔽のない場合と全く同じであった。スコアは99.8から 76.5 に低下し、減衰率は0.77で可視率0.64と同程度である。セクション 17.1 で述べた「スコア ≈ 可視率」は商用実装においておおむね成立する。0.64よりやや高い値になったのは、遮蔽バーがたまたま部品の中央を横切っており、クサビの方向特徴が先端と面取り角により密集していて、それらの部位が露出したままであったためである。
ここからminScoreの工学的な読み方が導かれる。これは許容できる最大のオクルージョン率である。無傷のクサビは95–100点となるため、minScoreを40に設定すると輪郭の約6割の欠落を許容することになり、70に設定すると部品がほぼ完全であることを要求する。ただし、オクルージョン耐性はminScoreだけで決まるわけではない。ピラミッド粗選別パラメータpartialThresholdは、粗いピラミッドレベルでモデルの十分な割合が可視であることを要求するため、オクルージョンの許容量を大きくする場合はこの値も同時に緩和する必要がある(本例では0.4を使用)。さもなければ、遮蔽された候補は粗いレベルで淘汰され、精細なスコアリングに到達することすらできない。
17.4 尺度マッチング
位置決めには第4の自由度が存在する。カメラからワークまでの物距離が変化する——品種切り替え、パレット高さの変更、レンズの再調整——と、画像内の部品のスケール(scale)が変化するため、固定サイズのテンプレートは直ちに輪郭と一致しなくなる。解決策は角度の場合とまったく同様である:スケールも明示的な探索次元とし、学習時にstartScale/scaleExtent/scaleStepに従って角度×スケールの格子上で姿勢を事前生成し、探索時に格子ごとにスコアを計算する。
スケールサンプルはまさにこの目的で用意されたものである:同一の部品群を3つの物距離で撮影し、部品は近距離から遠距離にかけて徐々に縮小する。最も近い画像(サンプル1)に写る角型コネクタ(直方体+下方に突出する角状のタブ、暗い輪郭、非回転対称)をモデルとし、スケール範囲\([0.55, 1.20]\)(ステップ0.05)で3枚の画像を探索した結果を以下に示す:
| スケールサンプル | 推定スケール | 推定角度 | スコア |
|---|---|---|---|
| 1(最も近い、テンプレート元) | 1.000 | \(0^\circ\) | 97.8 |
| 2(中間) | 0.850 | \(-2^\circ\) | 88.0 |
| 3(最も遠い) | 0.650 | \(-2^\circ\) | 74.4 |
3枚の画像からそれぞれスケール1.000、0.850、0.650が推定された——カメラが後退するにつれて部品は元のサイズの85%、65%に縮小し、スケール探索によって各段階のサイズが復元されている(図 17.4)。スコアがスケールとともに低下する(97.8→88.0→74.4)のは、部品が小さくなるほど有効エッジ点が減少し、実写写真のなめらかなエッジの処理が難しくなるためであるが、74.4点はminScore=25を依然として大きく上回っており、位置決めは安定している。推定されたスケールで拡縮されたモデル輪郭の再描画は、各画像のサイズの異なるコネクタにぴったりと重なる。
尺度マッチングは姿勢の第4の自由度を補うものであり、キャリブレーション(チャプター 5)を代替するものではない:物距離が変化すると、画素—ミリメートルの換算係数も変化するため、寸法を正確に測定するには再キャリブレーションが依然として必要である。尺度マッチングが解決するのは「物距離が変動した後でも部品を見つけられるか、どれだけスケールが変化したか」のみである。
17.5 テンプレート設計
サンプル内の部品ならどれでもテンプレートとして使用できるわけではなく、この実データセットは3つの教訓を明らかにしている。
1つ目は、テンプレートは回転対称性を破らなければならないことである。例えば円環ワッシャーをモデル化した場合を考えてみよう:円の輪郭はどの角度に回転させても同じ円であるため、モデル内の大部分のエッジ点はすべての角度に対して「方向が一致」し、スコアは高いままだが、出力される角度は完全にランダムになる——これが典型的な回転対称性の罠である。本章で五角形のくさびを選んだのは、その垂直な辺と面取りされた角が方向の一意なエッジ点を多数提供するため、角度を強固に固定できるからである(6つのインスタンスすべての角度残差が小さい)。教訓を一言にまとめると:スコアは「輪郭が一致した」ことだけを保証し、「姿勢が唯一の解である」ことは保証しない——モデル化の前にテンプレートが(近似的に)回転対称でないか確認することを固定の手順とすべきである。
2つ目は、特徴は唯一無二でなければならないことである。サンプル内のくし歯ラックは繰り返しの角歯の列であり、これをモデルにすると、シーン内の等間隔の方形波エッジがどれでも高スコアを騙し取る可能性がある。くさびの辺の組み合わせはこの部品セットの中で唯一無二であるため、すべての干渉物が除外される。テンプレートはシーン内で唯一無二の構造の組み合わせを選ぶべきであり、閾値は干渉物が獲得しうる最高スコアよりも高くなければならない。
第三に、実写画像のエッジは軟らかいということである。スケールサンプルは金属部品の実写グレースケール画像であり、エッジの幅は数画素程度しかなく、反射やノイズも含まれている。これに直接ボックス型ダウンサンプリングを施すと、勾配振幅がコントラスト閾値を下回ってしまい、部品自身の画像さえもマッチングできなくなる。そのため、全解像度でマッチングを行い、ピラミッド層数を2層に抑える必要がある(自動階層化では上位層で軟らかいエッジが消え去り、粗選別の段階で失敗してしまう)。シルエットサンプルはコントラストが極めて高いため、こうした懸念は一切存在しない——これ自体が、テンプレートとサンプルの「エッジ品質」がパラメータの設定方法を直接決定することを示している。
17.6 SciVision 実装
まず命名の落とし穴について述べる:SDK 内の SciSvOCV は輪郭マッチングではない——OCV は optical character verification の略で、文字欠陥検査を行うものである。輪郭マッチングとスケール輪郭マッチングは統一的に SCIMV::SciSvScaleShapeMatch が担う:scaleExtent=0 の場合は純粋な輪郭マッチングとなり、非ゼロの範囲を指定するとスケールマッチングとなり、1つのクラスで2つの用法をカバーする。訓練と探索のコードは以下の通り:
SCIMV::SciSvScaleShapeMatch sm;
SciROI mask; // 必ず UNDEF にする:GenRect1 矩形はエラー 120001037 を返す
SciMatchModel model;
sm.CreateScaleImageModel(tmplImg, mask, /*pyramidLevel*/ 2, // 軟らかいエッジは2層に制限、シルエットは自動 -1 可
/*startAngle*/ -180, /*angleExtent*/ 360, /*angleStep*/ 1,
/*startScale*/ 1.0f, /*scaleExtent*/ 0.0f, /*scaleStep*/ 0.05f,
/*lowerContrast*/ -1, /*upperContrast*/ -1, // エッジヒステリシス閾値、-1 で自動
/*filterCoefficient*/ 3.0f, /*filterLength*/ -1, // 訓練側の平滑化
/*minContrast*/ -1, /*optimization*/ -1,
/*polarity*/ 0, /*preGeneration*/ 1, &model); // preGeneration は必ず 1 にする
SciPointArray centers; SciVarArray angles, scales, scores;
sm.FindScaleImageModel(sceneImg, searchROI, model,
-180, 360, 1.0f, 0.0f,
/*minScore*/ 40, /*matchCount*/ 3, /*overlapRatio*/ 40,
/*subpixel*/ 0, /*endLevel*/ 0, /*clutter*/ 0.0f,
/*coarseScore*/ 35, /*partialThreshold*/ 0.5f, /*spreadWinSize*/ 2,
¢ers, &angles, &scales, &scores);訓練側の角度、スケールの2組3パラメータは同義である;lowerContrast/upperContrast はテンプレートエッジ抽出のヒステリシス二重閾値であり、どの点をモデルリストに含めるかを決定する;polarity は セクション 17.1 の極性スイッチである。探索側の minScore/matchCount/overlapRatio は閾値、インスタンス数、重複除去を制御する;GetScaleTemplateContours でモデルのエッジ輪郭を取り出すことができ、本章の重ね描き画像はこれを用いて算出された姿勢に従って輪郭を再描画したものである。
本章の実測で経験した落とし穴をそのまま記録する。第一に、mask はデフォルトコンストラクトされた UNDEF ROI を渡さなければならない:GenRect1 で全テンプレートの矩形を渡すと直接エラー 120001037 が発生する——特徴マッチング、カラーマッチングと同じ系統の仕様である。第二に、preGeneration は必ず 1 にする(モデルを完全に事前生成する)、さもないと後続のマッチングが使用できなくなる。第三に、subpixel は 0 しか使用できない:1(補間による精密化)に設定すると直接 0xC0000005 でクラッシュする;2(最小二乗による精密化)に設定すると「高スコアドリフト」が発生する——スコアは高いのに数十度の角度誤差が生じ、より欺瞞的である。第四に、軟らかいエッジの実写画像はピラミッド層数を抑え、全解像度でマッチングを行う:本章のスケールサンプルを慣例通りボックス型ダウンサンプリングして自動階層化(pyramidLevel=-1)を使用すると、接続部品自身の画像でさえ「マッチング失敗」(122411002) を返した;全解像度、pyramidLevel=2 に変更したところ、3枚の画像のスケールが一斉に正しく算出された。また coarseScore は必ず \(\le\) minScore にしなければならない、さもないと粗層で合格候補がふるい落とされてしまう。完全なプロジェクトは code/shape_matching/ にある。
工業事例:油汚れのあるワークの位置決め切り替え
ある機械加工工場で切削液の油汚れが付着したワークの把持位置決めを行う際、当初はグレースケールマッチングを使用していた:油膜により表面のグレースケールが照明角度に応じて変動し、1日の間にスコアが30点も変動したため、閾値の調整が困難であった。形状マッチングに切り替えたところ直ちに安定した——油汚れが変化させるのはグレースケール分布であり、ワークの輪郭は微動だにしないため、勾配方向の類似度は天然的に耐性を持つ。ただし初版ではワーク全体を直接枠で囲んだため、内部の加工テクスチャが全てエッジ点リストに取り込まれてしまった:モデル化とマッチングの両方が低速になり、テクスチャが油汚れで局所的に消えるとスコアが変動した。第二版では外輪郭と2つの重要な位置決め穴のみを残したところ、速度と安定性の両方が基準を満たした。教訓は2つある:形状マッチングの頑健性は「信頼できるエッジのみを比較する」ことに由来し、信頼できない細部をモデルに詰め込むことは自ら長所を捨てるようなものである;テンプレート設計はアルゴリズム選択と同等に重要である。
17.7 まとめ
- 形状マッチングはテンプレートをエッジ点 + 勾配方向のリストに抽象化し、スコア \(s=\frac1n\sum\cos\Delta\theta_i\) は方向一致性の平均である:モデルは幾何座標を持つ点リストであるため、角度、スケールについて明示的に探索できる;勾配方向はゲイン/バイアス、さらには局所的な単調非線形変化によっても変化しない;欠落した点はスコアを希釈するだけで残りの点を損なわない——探索可能性、照明頑健性、オクルージョン耐性の3つの性質はここに同源する。
- 回転頑健性:1枚の五角形クサビテンプレートで5枚の実写サンプル中の全6個のインスタンスを検出し、角度は \(-152^\circ\sim+102^\circ\) に及び、スコアは全て \(\ge 93.7\) であった;リングと櫛歯状の干渉物は一切誤検出されなかった;同一の回転インスタンスにおけるグレースケール NCC はわずか 0.585(< 0.80)であり、NCC が回転に耐性を持たないことを裏付けている。
- オクルージョン下のスコア ≈ 可視割合:合成されたオクルージョンバーが実際のクサビの面積の36%を覆ったところ、スコアは 99.8→76.5(減衰比 0.77)となったが、姿勢は依然として正確であった;
minScoreは許容可能な最大オクルージョン割合となり、partialThresholdなどの粗選別パラメータはオクルージョンの許容範囲に応じて緩和する必要がある。 - スケールは
scaleExtentによって第4の次元として有効化され、実際の接続部品が物距離に応じて縮小すると、3枚の画像からそれぞれスケール 1.000 / 0.850 / 0.650 が算出された;スケールマッチングは姿勢を補完するものであり、キャリブレーションを代替するものではない。 - SDK 側ではいくつかの事柄を記憶しておく必要がある:mask は UNDEF を渡す、preGeneration=1、subpixel は 0 のみ使用可、coarseScore \(\le\) minScore;軟らかいエッジの実写画像は全解像度でマッチングを行い、ピラミッドを2層に抑える、さもないと部品自身の画像さえもマッチングに失敗する。
形状マッチングは「部品がどこにあるか」という最も困難な形態の問題を解決する;探索対象が剛体の輪郭ではなく色の塊やテクスチャ特徴である場合は、特徴マッチングとカラーマッチングが選択肢となる(チャプター 18)。エッジベースの形状マッチングには他にも2つの古典的な手法がある:Borgefors の階層的チャンファーマッチングは距離変換で輪郭の類似度を計測し (Borgefors 1988)、Belongie らのシェイプコンテキストは分布ヒストグラムで点集合の形状を記述して対応関係を求める (Belongie, Malik, と Puzicha 2002)。形状マッチングの原理と工学的な詳細については、Steger らの著作に最も体系的な記述がある (Steger, Ulrich, と Wiedemann 2018)。










