1. ホーム
  2. c++

[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良

2022-03-18 01:05:48

質問

ここ数年、私が担当したプロジェクトの中で最も興味深いもののひとつが 画像処理 . 目標は、コカ・コーラを認識できるシステムを開発することでした。 '缶' (缶」という言葉を強調していることに注意してください、理由はすぐにわかります)。下のサンプルをご覧ください。 緑の長方形 を拡大縮小と回転で表示します。

プロジェクトに関するいくつかの制約事項。

  • 背景が非常にうるさくなる可能性がある。
  • その できる は、任意の 規模 または 回転 またはオリエンテーションも(合理的な範囲内で)使用できます。
  • 画像にはある程度のぼかしが入る可能性があります(輪郭が完全に直線でない可能性があります)。
  • 画像にはコカコーラのペットボトルが写っている可能性があり、アルゴリズムはそのペットボトルのみを検出する必要があります。 できる !
  • 画像の明るさは大きく変化する可能性があります(そのため、色検知に "too much"を依存することはできません)。
  • その できる は、側面や中央の一部が隠れていたり、場合によっては瓶の後ろに隠れていることもあります。
  • がない可能性があります。 その場合、何も見つからず、その旨のメッセージを書かなければなりません。

そのため、次のような厄介なことになりかねません(この場合、私のアルゴリズムは完全に失敗していました)。

このプロジェクトは少し前にやって、とても楽しくて、ちゃんとした実装ができました。以下は、私の実装の詳細です。

使用言語 : を使用してC++で行われました。 OpenCV ライブラリを使用します。

プリプロセッシング : 画像の前処理(アルゴリズムに渡すために画像をより生の状態に変換すること)には、2つの方法を使用しました。

  1. カラードメインをRGBから HSV 色相に基づくフィルタリング、オレンジに近い色を避けるための一定以上の彩度、暗い色調を避けるための低値のフィルタリングを行いました。最終的には、白黒の2値画像となり、すべての白いピクセルは、この閾値に一致するピクセルを表すことになるのです。もちろん、画像にはまだたくさんのゴミが残っていますが、これによって作業する次元の数を減らすことができます。
  2. メディアンフィルタリング(全隣接画素の中央値をとり、この値で画素を置き換える)により、ノイズを低減する。
  3. 使用方法 カニーエッジ検出フィルタ で、2回の前例踏襲の後、全項目の輪郭を取得する。

アルゴリズム : このタスクのために選んだアルゴリズム自体は、以下のものから取得しました。 これ 特徴抽出の素晴らしい本で、その名も 一般化ハフ変換 (通常のハフ変換とはかなり異なる)。基本的にいくつかのことが書かれています。

  • 物体の解析方程式を知らなくても、空間上の物体を記述することができる(ここではそうなっている)。
  • 基本的にスケールファクターと回転ファクターの組み合わせごとに画像をテストするため、拡大縮小や回転などの画像変形に強いです。
  • ベースモデル(テンプレート)を使用し、アルゴリズムが学習します。
  • 輪郭画像に残っている各ピクセルは、モデルから学習した内容に基づいて、オブジェクトの(重力の点で)中心と思われる別のピクセルに投票します。

例えば、ここでは缶の輪郭のすべてのピクセルが重力の中心に投票するので、中心に対応する同じピクセルに多くの投票があり、以下のようにヒートマップにピークが見られます。

これがあれば、単純な閾値ベースのヒューリスティックで中心ピクセルの位置がわかり、そこからスケールと回転を導き出し、その周りに小さな矩形を描くことができます(最終的なスケールと回転の係数は、明らかに元のテンプレートに対する相対的なものです)。理論的には、少なくとも...

結果 : さて、この方法は基本的なケースではうまくいったのですが、いくつかの点でひどく物足りなさを感じました。

  • それは 非常に遅い ! これは強調すべき点ではありません。30枚のテスト画像を処理するのに、ほぼ丸一日必要でした。明らかに、いくつかの缶が非常に小さかったので、回転と移動のためのスケーリング係数を非常に高くしていたためです。
  • 瓶が画像内にあると完全に迷子になり、なぜかほとんど缶ではなく瓶を見つける(おそらく瓶の方が大きく、ピクセル数が多いため、投票数が多いのだろう)。
  • ファジーな画像もだめでした。投票が中央付近のランダムな位置のピクセルで終わってしまうため、非常にノイズの多いヒートマップになってしまいました。
  • 並進と回転のインバランスは実現できたが、向きは実現できなかった。つまり、カメラの対物レンズに正対していない缶は認識されなかった。

を向上させることができますか? 具体的 アルゴリズムを使用しています。 専らOpenCV を解決するための機能です。 4つの特定の ということでしょうか?

質問する人だけが勉強するのではないと思うので、何人かの人にも学んでほしいです。)

解決方法は?

別のアプローチとして、特徴(キーポイント)を抽出するために スケール不変の特徴変換 (SIFT)または スピードアップしたロバスト特性 (SURF)です。

あなたは、素敵な OpenCV のコード例です。 Java , C++ および Python をこのページで紹介します。 特徴2D+ホモグラフィで既知の物体を探す

どちらのアルゴリズムも、拡大縮小や回転に対して不変である。両者とも特徴量を扱うので オクルージョン (キーポイントが十分に見えている限り)。

画像出典:チュートリアルの例

SIFTは数百ms、SURFはもう少し速いですが、リアルタイムには向きません。ORBはFASTを使用していますが、回転不変性に関しては弱いです。

原著論文