14  幾何プリミティブの検出

部品をカメラの下に配置したとき、産業用ビジョンが最初に答えなければならない問題は、驚くほど単純なものであることが多い:このエッジはどこにあるか?この穴の中心はどこにあるか?位置合わせと実装はエッジ位置で運動閉ループを構成し、寸法検査は2つのエッジ間の距離を測定し、ロボットによるピックアップは穴の中心座標を必要とする——これらはすべて最終的に同じことに帰結する:画像中の点、直線、円などの幾何プリミティブ(geometric primitive)をサブピクセル(subpixel)精度で検出することである。「サブピクセル」という言葉は見せかけではない:10 μm/画素の撮像システムでは、位置決め精度が整数画素にしか達しなければ測定分解能は10 μmに固定されるが、適切なサブピクセル位置決めを用いれば安定して1/10画素以上の精度を実現できる——これはハードウェアを一切交換することなく、システム精度を1桁向上させることに相当する。

本章では、実際の産業用画像(図 14.1)を用いてすべての実験を行う:暗い背景上に置かれた小判形(oblong)の金属接続部品である(2448×2048 シングルチャンネルグレースケール、Smart3の「点検出・直線検出・円検出」標準ソリューションより取得)。部品の外輪郭の上縁は、中央が平坦で両端が丸みを帯びた、ほぼ水平な直線状のエッジである。部品内部には左右対称の2つの中ぐり穴があり、各穴の中央は中ぐりされて暗い背景が露出した円形の穴口になっており、その外側を明るいリング状の段差が囲んでいる。まず上縁の直線エッジに沿って一連のエッジ点を抽出して直線を近似し、次に円形ROIで2つの穴をそれぞれ覆って円を近似する——直線エッジの両端の丸みを帯びた肩部は「妨害者」の役割を果たし、ロバスト近似の真の価値を引き出すことになる。

図 14.1: 実験に用いるテスト画像:暗い背景上の小判形金属接続部品。外輪郭の上縁は中央が平坦で両端が丸みを帯びた、ほぼ水平な直線エッジである。部品内部には左右対称の2つの中ぐり穴があり、穴の中心は位置合わせとピックアップに利用できる。

14.1 エッジ点の抽出

エッジを位置決めするために、画像全体に対してエッジ検出を実行する必要はない(それは チャプター 13 の主題である)。産業界の手法ははるかに直接的である:対象のエッジを大まかに囲むROI内に、互いに平行な \(N\) 本の探索線(search line)を配置し、2次元の位置決め問題を \(N\) 個の1次元問題に分割する。各探索線に沿った処理手順は完全に同一である:

  1. グレープロファイルの取得:探索線方向に沿ってグレースケール値を逐点読み取り、1次元曲線を得る。
  2. 投影平均:探索線に垂直な方向で複数の画素を平均する(投影幅内での投影と呼ぶ)。平均により単一画素ノイズを抑圧する——これは チャプター 6 と同じ原理であり:独立なゼロ平均ノイズは平均によって相殺される。
  3. 1次微分による位置決め:平均後のプロファイルの1次微分を計算する。エッジは微分振幅の極値に対応する。振幅が閾値を下回る極値はノイズとみなし、報告しない。
  4. サブピクセル補間:微分の離散的な極値点とその左右の隣接点における振幅をそれぞれ \(g_0\)\(g_{-1}\)\(g_{+1}\) とする。この3点に放物線を近似し、極値点に対する頂点のオフセットは

\[ \delta = \frac{g_{-1}-g_{+1}}{2\,(g_{-1}-2g_0+g_{+1})}, \]

となる。\(\delta\)\(\pm 1/2\) 画素以内に収まり、エッジのサブピクセル位置は「整数画素の極値位置 \(+\ \delta\)」となる。3つのサンプル値から1本の放物線が決まり、頂点の公式は閉形式であるため計算コストは無視できる——サブピクセル精度はほぼ無料で得られる。

この機構には、原理を理解して初めて適切に設定できる一連のパラメータが存在する。エッジ強度閾値(例:strengthThresh)は1次微分振幅の許容基準である:低く設定しすぎるとノイズの変動がエッジとして計上され、高く設定しすぎるとコントラストの低い真のエッジが見落とされる。極性(polarity)は、どの種類のグレースケール遷移を許容するかを指定する——黒→白(立ち上がりエッジ)、白→黒(立ち下がりエッジ)、または両方である:本例では上から下へ走査し、暗い背景から明るい部品へと横切るため、典型的な黒→白エッジとなる。極性を固定することで、偽エッジの半分が即座に除去される。エッジ幅は、グレースケール遷移帯の予想幅であり、微分の差分幅を決定する:小さすぎるとノイズに敏感になり、大きすぎると隣接する2つのエッジが1つにスメアリングされる。投影幅はノイズ抑圧とぼかしのトレードオフである:投影が広いほど平均化されて除去されるノイズが多くなり、エッジ強度の推定はより安定するが、エッジが探索線と厳密に垂直でない場合、過度に広い投影は傾いたエッジを横方向に「にじませ」、位置決めがかえってずれてしまう——経験的には3~7画素が最も一般的である。エッジタイプは、1本の探索線上で複数の候補エッジが見つかった場合に、最初のエッジ、最後のエッジ、強度が最良のエッジのいずれを報告するかを決定する;「最良」は、油汚れや映り込みによって生じる弱い擬似エッジに対して最もロバストである。

図 14.2 は、上辺のROI内に60本の探索線を配置した場合の抽出結果を示している:ROIは意図的に平坦区間を少し超え、両端の丸みを帯びた肩部に達しているため、60個の白い十字のうち——中央付近の点は真の直線状のエッジに沿って整然と並んでいるのに対し、両端の肩部の点は丸みに沿って明らかに下側にずれている。探索線は自身が「見た」エッジ位置を忠実に報告するため、こうして肩部の点が点集合に紛れ込む(近似直線からの距離が\(|d|>5\)画素のものは計18個である)。これらの点によって方向を誤られないようにする方法は、次節の主題である。

図 14.2: 60本の探索線によって上辺から抽出されたエッジ点(白い十字)。中央付近の点は真の直線状のエッジに沿って並んでいるのに対し、丸みを帯びた肩部にはみ出した点は輪郭に沿って下側にずれ、後続の近似処理における外れ値となる。

14.2 直線当てはめ:最小二乗法とロバスト法

一連のエッジ点が得られたら、次のステップはそこから直線を推定することである。最小二乗(least squares, LSQ)当てはめは、すべての点から直線までの垂直距離の二乗和を最小化する

\[ \min_{L} \sum_{i} r_i^2, \qquad r_i = \operatorname{dist}(\mathbf p_i,\, L), \]

解は閉形式(点群の重心を通り、方向は散布行列の主固有ベクトルで与えられる)であり、高速でハイパーパラメータを持たない。すべての点が「おおむね正しい」場合、この方法は最適である——これはガウス雑音下で平均が最適となるのと同じ統計的事実である。しかし最小二乗法は外れ値(outlier)に極めて敏感であり、その理由は「二乗」という操作に隠されている:残差を二乗してから和をとるため、30 px ずれた肩部分の点が目的関数に与える寄与は、0.5 px ずれた正常な点の3600倍にもなる。少数の大きな残差を持つ点をなだめるため、当てはめ直線はむしろ全体を傾け、大多数の良好な点それぞれの誤差をわずかに大きくする——二乗ペナルティが大きな残差に支配されることが、最小二乗法の不安定性の根源である。

ロバスト推定(robust estimation)の考え方は、二乗ペナルティを大きな残差に対してより寛容なペナルティに置き換えることである。Huber (Huber 1964) の手法は、各点に残差に応じて変化する重みを与えることと等価である:

\[ w(r)=\begin{cases}1 & |r|\le \kappa\\[2pt] \kappa/|r| & |r|>\kappa\end{cases} \]

残差が調整定数 \(\kappa\) 以下の点は完全な発言権を持ち、それを超える点の重みは \(\kappa/|r|\) に従って減衰する——残差が大きいほど発言権は小さくなるが、一票の拒否権が生じることはない。重みは残差に依存し、残差は当てはめ結果に依存するため、求解には反復重み付き最小二乗法(iteratively reweighted least squares, IRLS)を用いる:

入力:エッジ点集合 {p_i},調整定数 κ
1. 通常の最小二乗法で初期直線を当てはめ,すべての重み w_i ← 1 とする
2. 収束するまで(直線のパラメータの変化が十分小さくなるか,最大反復回数に達するまで)繰り返す:
   a. 各点から現在の直線までの距離 r_i を計算する
   b. Huber の規則に従って重みを更新する:|r_i| ≤ κ なら w_i ← 1,そうでなければ w_i ← κ/|r_i| とする
   c. 重み w_i を用いて重み付き最小二乗当てはめを行い,直線を更新する
3. 直線と各点の最終的な残差を出力する

各反復において外れ値の重みはさらに押し下げられ、直線は「大多数の良好な点」に徐々に近づいていき、通常は3~5回程度で収束する。

別の有名なロバストな手法としてRANSAC(ランダムサンプルコンセンサス)(Fischler と Bolles 1981)がある:最小サンプル(直線の場合はわずか2点)を繰り返しランダムに抽出して当てはめを行い、許容帯に収まる「コンセンサス」点の数を集計して、コンセンサスが最大のモデルを採用する。IRLSは全点から出発して重み付けによる収束を用いるのに対し、RANSACはランダムサンプリングによって外れ値を含まないサンプルを偶然に得ることに依存する。外れ値の割合が非常に高い(半数に近いか、それを超える)場合はRANSACの方が信頼できる;外れ値が少なく正常点が連続的な雑音を持つ場合は、IRLSの方が高精度かつ高速で、結果が再現可能(ランダム性がない)——産業におけるエッジ当てはめは大部分が後者の状況に属する。

机上の理論だけでは根拠がないため、前節の60個のエッジ点を用いて対照実験を行う。ROIの両端はそれぞれ丸みのある肩部分にはみ出しており、それらの区間に落ちた探索線は、全体的に下に偏った少数の外れ値(合計18個、60点の3割)を生み出す。最小二乗法側では意図的に外れ値除外を無効にし(rejectRatio=1rejectDist=20——除外閾値20 pxにより、肩部分の外れ値がすべて当てはめに参加する)、Huber法側ではrejectRatio=10rejectDist=5とする。両方の当てはめ直線を統一した規則で評価する——それぞれの当てはめ直線までの距離が \(|d|\le 5\) px である内点のみの二乗平均平方根誤差(RMSE)を算出すると、最小二乗法が2.793 px、Huber法が1.456 pxとなり、2倍近い差が生じた。幾何学的に見ると、最小二乗法の当てはめ直線は両端の肩部分に引っ張られて全体が下がり、両側の非対称な外れ値分布によって傾きが生じているのに対し、Huber法の当てはめ直線は中央の真の直線エッジにしっかりと沿っている。

よくある評価の落とし穴:SDKの当てはめインターフェースが返すRMSEは全点のRMSEである——本実験の最小二乗法側では5.908 pxであり、その大部分は肩部分の外れ値自身の残差である。この値は2つの当てはめの精度を比較するのには適さない:外れ値はどんな「正しい」直線に対しても大きな残差を持つため、全点RMSEは当てはめではなくデータにペナルティを課していることになる。公平な比較には、(本例の \(|d|\le 5\) px のような)統一された内点規則を用いる必要がある。

14.3 円と楕円のフィッティング

円形の穴を位置決めする際、探索線の配置を平行配置から放射状配置に切り替える。すなわち、円形の関心領域(ROI)で穴を囲み、角度に対して均等に探索線を配置し、各線を半径方向(内側から外側へ)に走査する。その他の処理——投影平均、1階微分、サブピクセル補間——は直線の場合と完全に同一である。放射状配置では期待半径 expectRadius半径許容誤差 radiusRange という2つの重要なパラメータが追加され、探索を \([\,\text{expectRadius}-\text{radiusRange},\ \text{expectRadius}+\text{radiusRange}\,]\) の環状探索帯に制約する。本例では expectRadius=45radiusRange=30 であり、探索帯は15~75 pxとなる。探索帯を制約することで2つの利点が得られる。まず、穴内部の穴口と穴外部の環状段差の両方が除外されるため、擬エッジが大幅に減少する。次に、各探索線の走査長が短縮されるため、処理時間が節約される。

円フィッティングには代数フィッティング(algebraic fitting)幾何フィッティング(geometric fitting)の2種類がある。前者は円の方程式の代数的残差を最小化するもので、閉形式解が存在して処理速度が非常に速いが、重み付けに暗黙のバイアスが含まれる。後者は各点から円までの真のユークリッド距離を最小化するもので、反復計算が必要だがバイアスはない。産業用ライブラリで一般的な手法は、代数的解を初期値として幾何的反復で収束させ、速度と精度の両方を得る方法である。

実験では2つの穴に対してそれぞれ1回ずつ円検出を実施した。48本の放射状探索線がすべて穴縁にヒットし、1つの穴あたり48個のエッジ点が得られた(図 14.3 の2つのサブ図中の白十字)。黒十字はフィッティングにより求められた穴中心を示す。左穴のフィッティング結果は中心 (1143.83, 1085.32)、半径 44.60 px、右穴は中心 (1586.00, 1077.59)、半径 44.93 pxであり、2つの穴の中心間距離(ピッチ)は 442.06 px であった。両穴の48個のエッジ点はすべて有効点であり、除外された点は0個であった——この部品の穴縁は損傷がなく、基準円から除外しきい値を超えて逸脱した点は存在しなかった。穴中心の座標とピッチは、コネクタの嵌合とロボットによるピックアップに必要な核心的な量そのものである。ピンの穴位置がピックアップ対象を定め、ピッチが嵌合方向を固定する。

(a) 左穴:48個のエッジ点(白十字)+フィッティングによる穴中心(黒十字)
(b) 右穴:48個のエッジ点(白十字)+フィッティングによる穴中心(黒十字)
図 14.3: 2つの中ぐり穴に対する放射状エッジ点抽出と円フィッティング。(a) 左穴と (b) 右穴のそれぞれについて、48本の放射状探索線により穴縁のエッジ点を抽出し、ロバストフィッティングにより中心(黒十字)と半径を求めた。両穴とも除外点は0個であり、穴縁は損傷がない。

ロバストフィッティングには、ここで指摘すべき「副産物」が隠されている。それは基準円を出力すると同時に、「どの点が基準に従わないか」を記した除外リストも提供する点である。 本例の部品は穴縁が損傷していないため除外リストは空であるが、穴縁に突出したバリ、欠け、あるいは中ぐり工具のびびり模様が生じると、対応するエッジ点は基準円から逸脱し、除外しきい値によって選別される。除外点の位置と密集度は、直接的に欠陥の指標となる。言い換えれば、フィッティングした円を公称輪郭とし、各エッジ点の半径方向の偏差、あるいは除外点の分布を検査することで、1回のフィッティングで測定と欠陥判定を同時に完了できる。チャプター 26 ではこの考え方を体系的に展開する。

14.4 SciVision 実装

エッジ点抽出と直線当てはめは SCIMV::SciSvLineLocator が提供する:

SCIMV::SciSvLineLocator lineLoc;
SciPointArray edgePts;
long rc = lineLoc.LinePointsLocator(src, lineROI, emptyRegion,
    /*strengthThresh*/ 25, /*direction 上->下*/ 0, /*polarity 黒->白*/ 0,
    /*edgeWidth*/ 3, /*projectWidth*/ 5, /*edgeType 最良*/ 2,
    /*searchLineCount*/ 60, /*findPointType 一次微分*/ 1, &edgePts);
rc = lineLoc.FitLine(edgePts, /*fitMethod Huber*/ 1, 10, 5, 0, 0, &lineHuber, &rmseHuber, &distHuber);

LinePointsLocator のパラメータは セクション 14.1 の原理と一対一で対応する:strengthThresh=25 は一次微分の大きさに対する閾値であり;direction=0 は上から下への走査を指定し;polarity=0 は黒→白の遷移のみを受け付け(本例では暗い背景から明るいワークに進入する);edgeWidth=3projectWidth=5 はそれぞれ差分スパンと投影平均幅であり;edgeType=2 は複数の候補の中から強度が最良のものを選択し;searchLineCount=60 は検索線の本数であり;findPointType=1 は一次微分の極値で位置を特定する。出力 edgePts が60個のサブピクセルエッジ点である。FitLinefitMethod は0が最小二乗法、1がHuber法であり、続く rejectRatiorejectDist は当てはめ中の外れ値除去を制御する(除去回数と距離閾値)——セクション 14.2 の実験で最小二乗法側はまさに 1, 20 の値の組を用いて除去を事実上無効化していた。

円の検出は SCIMV::SciSvEllipseLocator によって(検索 + 当てはめの)1ステップで実行され、左右の穴に対して1回ずつ呼び出し、穴の中心と半径を出力図形 circleShape から読み出す:

SCIMV::SciSvEllipseLocator circleLoc;
SciROI circleROI; SciPoint center(holeCx, holeCy);
circleROI.GenCircle(center, 80);   // 円形ROIで穴縁の検索帯を覆う
SciOverlay circleShape;
SciPointArray circlePts, circleEffect, circleReject;
rc = circleLoc.EllipseLocator(src, circleROI, emptyRegion, /*isEllipse*/ false,
    /*strengthThresh*/ 25, /*direction 内側->外側*/ 0, /*polarity 黒->白*/ 0,
    /*edgeWidth*/ 3, /*projectWidth*/ 5, /*edgeType 最良*/ 2, /*fitMethod LSQ*/ 0,
    /*searchLineCount*/ 48, /*rejectRatio*/ 10, /*rejectDist*/ 5,
    /*expectRadius*/ 45, /*radiusRange*/ 30,
    &circleShape, &circlePts, &circleEffect, &circleReject);
SciPoint fc; double fr = 0; circleShape.GetCircle(&fc, &fr);   // 穴の中心と半径を取得

isEllipse=false は楕円ではなく円を当てはめることを意味し;direction=0 は検索線を穴の中心から外側に向かって走査させ;polarity=0 は黒→白の遷移のみを受け付け(暗い穴の口から明るい段差に跨る);fitMethod=0 は最小二乗当てはめであり、rejectRatio=10 はその外れ値除去の回数を制御し;expectRadius=45radiusRange=30 は15~75 pxの環状検索帯を画定する(本例の円形ROIの半径はそれに対応して80に設定されている)。4つの出力は順に、当てはめられた円図形 circleShape、全エッジ点 circlePts、当てはめに参加した有効点 circleEffect、除去された点 circleReject である——図 14.3 の2つのサブ図には各穴の circlePts と当てはめられた中心が描かれている。GetCirclecircleShape から穴の中心座標と半径を抽出する。

率直な注意点として:現在のSDKバージョンでは、fitMethod=1(Huber)の場合、FitLine のRMSE出力パラメータは無効な値(NaN)を返す。そのため付属プロジェクトでは、点から直線までの距離の配列(FitLine の最後の出力パラメータ)からインライアのRMSEを独自に一律で計算している——これが セクション 14.2 における2.793/1.456という2つの数値の出典である。商用SDKにはこうした瑕疵が散見されるが、工学的な対策は:可能な限り原出力(点、距離)から主要指標を再計算し、集計値を無条件に信用しないことである。本章のすべての実験画像と数値を生成する完全な実行可能プロジェクトは code/geometric_primitives/ に配置されており、使用されるサンプル画像は code/geometric_primitives/sample/connector.jpg に自己完結的に格納されている。

産業事例:電池極板のエッジ位置決め

リチウム電池の巻回工程では、陰極板、陽極板、セパレータを0.1 mmオーダーで位置合わせする必要があり、その位置合わせの閉ループは極板エッジのリアルタイム位置決めに依存する。課題は、スリット加工された極板の縁にはほぼ例外なくバリが存在することである:通常の最小二乗当てはめを用いると、バリの点がエッジ線を引きずって偏らせ、巻回位置合わせに系統的な誤差が生じる——これを抑えるためにはHuber法などのロバストな当てはめ(または区分的な局所当てはめ後に中央値を取る方法)を使用する必要がある。検索線の本数は精度とタクトタイムの直接的なトレードオフである:線が多いほど当てはめの統計的精度は高まるが、計算時間も線形に増加する。生産ラインでは一般的に30~100本が使用され、タクトタイムの余裕に応じて上限を選択する。もう1つの実務上の要点は、edgeTypeを「最適エッジ」に設定することである。極板表面の油汚れとローラー面からの反射光によって強度の弱い偽のエッジが生成されるため、「最初のエッジ」を選択すると誤った対象にロックされやすいのに対し、強度が最適なものを選択すれば基本的にこの影響を受けない。

14.5 まとめ

  • 産業用位置決めの標準パイプラインは「探索線サンプリング → 1次元エッジ位置決め → サブピクセル補間 → 幾何フィッティング」である:2次元問題を\(N\)個の1次元問題に分解し、各探索線上で投影平均によるノイズ抑制、1階微分の極値によるエッジ特定、放物線頂点補間によるサブピクセル位置の導出を行う。
  • サブピクセルはほぼ無料で得られるが、前提条件がある:放物線補間はプロファイルが十分に平滑な場合に限りその精度を発揮する。投影幅(ノイズ除去とぼかしのトレードオフ)、エッジ強度閾値、極性、エッジタイプはすべてデフォルト値のままにせず、シーンに応じて設定する必要がある。
  • 最小二乗法が外れ値に敏感である根本的な原因は二乗ペナルティである:大きな残差が目的関数を支配し、少数の肩部外れ値でも直線全体を引きずってずらすのに十分である。Huber重み付け+IRLSにより、残差の大きな点に対して\(\kappa/|r|\)の重み低下が適用され、本章の実験ではインライアのRMSEが2.793 pxから1.456 pxに改善した。
  • フィッティング精度を比較するには統一されたインライアルールが必要である:全点RMSEは外れ値自身の残差までもフィッティングの評価に算入するため、よくある評価の落とし穴である。
  • ロバスト円フィッティングは測定と欠陥の手がかりを一度に提供する:本章では2つの中ぐり穴のそれぞれについて中心と半径をフィッティングし(穴ピッチは442.06 pxであり、嵌合とピックアップに直接利用可能)、健全な穴縁では除外点は0であった。穴縁に欠陥が生じると、除外リストがその位置マーカーとなる——基準幾何は測定に、外れ値リストは欠陥判定に利用される。

円と楕円のより高精度な直接フィッティングについては、代数解法に関する2つの古典的研究が参考になる。Taubinによる陰的曲線と曲面の推定(Taubin 1991)、およびFitzgibbonらによる楕円専用の直接最小二乗法(Fitzgibbon, Pilu, と Fisher 1999)である。サブピクセルエッジ抽出と幾何プリミティブフィッティング(楕円、円弧、不確かさ解析を含む)に関するより体系的な解説については、Stegerらの著書(Steger, Ulrich, と Wiedemann 2018) を参照されたい。