24
画像処理:「コカ・コーラ缶」認識のためのアルゴリズムの改善
私が過去数年間取り組んだ最も興味深いプロジェクトの1つは、画像処理に関するプロジェクトでした。目標は、コカコーラの「缶」を認識できるシステムを開発することでした(「缶」という言葉を強調していることに注意してください。その理由はすぐにわかります)。下のサンプルを見ることができます。缶はスケールと回転で緑色の長方形で認識されます。 プロジェクトに関するいくつかの制約: 背景は非常に騒々しいかもしれません。 缶は、任意の可能性があり、スケールまたは回転(合理的な範囲内で)、あるいは配向を。 画像にある程度のぼやけがある可能性があります(輪郭が完全にまっすぐではない場合があります)。 画像にコカコーラのボトルが含まれている可能性があり、アルゴリズムは缶を検出するだけです! 画像の明るさは大きく異なる可能性があります(そのため、色の検出に「過度に」依存することはできません)。 缶は、部分的側面または途中に隠された、おそらく一部は瓶の後ろに隠れてすることができます。 画像にはまったく缶がありません。その場合、何も見つからず、そのことを伝えるメッセージを書く必要がありました。 したがって、次のようなトリッキーなものになる可能性があります(この場合、アルゴリズムが完全に失敗しました)。 私はこのプロジェクトを少し前にやっていましたが、それを行うのはとても面白かったし、適切な実装がありました。ここに私の実装に関するいくつかの詳細があります: 言語:OpenCVライブラリを使用してC ++で実行。 前処理:画像の前処理、つまり画像をより生の形式に変換してアルゴリズムに提供するために、2つの方法を使用しました。 カラードメインをRGBからHSVに変更し、「赤」の色相に基づいてフィルタリングし、特定のしきい値を超える彩度でオレンジ色のような色を避け、低い値でフィルタリングして暗い色調を避けます。最終結果は、白黒のバイナリ画像で、すべての白いピクセルがこのしきい値に一致するピクセルを表します。明らかに画像にはまだがらくたがたくさんありますが、これにより、操作する必要がある次元の数が減ります。 ノイズを減らすために、メディアンフィルタリング(すべての近傍のピクセル値の中央値を取り、この値でピクセルを置き換える)を使用したノイズフィルタリング。 キャニーエッジ検出フィルターを使用して、前の2つの手順の後にすべてのアイテムの輪郭を取得します。 アルゴリズム:このタスクで選択したアルゴリズム自体は、特徴抽出に関するこの素晴らしい本から引用され、一般化ハフ変換(通常のハフ変換とはかなり異なります)と呼ばれています。それは基本的にいくつかのことを言います: 分析方程式(ここではその場合)を知らなくても、空間内のオブジェクトを記述できます。 スケーリング係数と回転係数のすべての組み合わせについて画像を基本的にテストするため、スケーリングや回転などの画像変形に耐性があります。 アルゴリズムが「学習」する基本モデル(テンプレート)を使用します。 輪郭画像に残っている各ピクセルは、モデルから学んだことに基づいて、オブジェクトの(重力に関して)中心となる別のピクセルに投票します。 最後に、投票のヒートマップが作成されます。たとえば、ここでは、缶の輪郭のすべてのピクセルがその重心に投票するので、同じピクセルに対応する多数の投票が中央にあり、ヒートマップに次のようなピークが表示されます。 それができたら、単純なしきい値ベースのヒューリスティックが中心ピクセルの位置を提供し、そこからスケールと回転を導き出し、その周りに小さな長方形をプロットできます(最終的なスケールと回転係数は明らかに、元のテンプレート)。理論的には少なくとも... 結果:現在、このアプローチは基本的なケースでは機能しましたが、一部の領域では非常に不十分でした。 それは非常に遅いです!私はこれを十分に強調していません。一部の缶が非常に小さかったため、回転と平行移動のスケーリング係数が非常に高かったため、30枚のテスト画像の処理にはほぼ1日が必要でした。 ボトルが画像内にあると完全に失われ、何らかの理由でほとんどの場合、缶の代わりにボトルが見つかりました(おそらく、ボトルが大きく、ピクセルが多く、投票数が多かったためです)。 投票は中央付近のランダムな場所のピクセルで行われ、非常にノイズの多いヒートマップで終わったため、あいまいな画像も良くありませんでした。 平行移動と回転の不変が達成されましたが、向きは達成されませんでした。つまり、カメラの対物レンズに直接面していない缶は認識されませんでした。 上記の4つの特定の問題を解決するために、OpenCV機能のみを使用して、特定のアルゴリズムを改善するのを手伝っていただけますか? 何かを学んでくれる人もいるといいのですが、結局、質問をする人だけが学ぶべきではないと思います。:)