Zaku認識(1)

年末なので、夢を語って終わりにしましょう。

夏頃から構想している動体認識=Zaku認識の話です。何故「Zaku認識」なのかといえば、当然、緑の量産ザクとシャア・ザクを区別したいからですね(ガンダムRX-78とMk-IIの違いでもいいんだけど、こちらは細部の特徴比較なので少し趣が違う、両方やるけど)。

現在の構想/妄想を公開メモしておきます。少しでも訳が分かった方はコメントなりメールなりを下されば、その先の詳細をお話することはやぶさかではありませぬ(いや、マジで)。

さて、Zaku認識のほうは、動体認識と個体認識を同時にやります。当然、動いているロボットに載せることも考慮して、背景画像からの物体抽出も入ります。いわゆる、視覚と認識の両方を一体化させます。

■前処理

色成分を残さないと、量産ザクとシャア・ザクの区別がつかないので、単純なグレー化では駄目です。
HSV成分に分解するか、グレー色調との混合による色距離を計算します。このために、

・色相、あるいは、YCbCrのCbCrのみの二次元
・明度による一次元

の2種類を使うほうが妥当しょう。

■座標補正

いわゆる、カメラのブレを計算します。移動体にカメラを載せるために、

・上下左右の二次元
・回転
・拡大/縮小

を考慮します。
先行きは、デジタルカメラの手ぶれ補正のように、加速度センサのフィードバックを含めます(そうしないと計算量が膨大になるので、ある程度「予測」を立てるため)。
また、人が頭を左右に振ったときにも、視点を固定するような自動補正を組みいれるためにも、3次元加速度センサのフィードバックが必須です。

当面は、膨大な計算量/高速化をものともしないCPUを使って、フィードバックなしで計算します。
これは、実際に移動体に載せたときには加速度センサによる予測が成り立つのですが、ゲーム画面のように静止したカメラの場合はこの予測が不可能になるためです。つまり、画面からのフィードバックだけを頼りに、動体を追跡します。

座標補正については、前処理で行った画像を元に差分を取ります。
この差分がより少ないものが、正しい背景(静止物体)の認識ができているとみなします。

■動体認識

単純な動体については、超音波センサやレーザーによる反射を使ったほうが効果的です。しかし、ガンダム無双でザクの機体を数えたり、シャア・ザクに向かったりするためには、この方法は取れません。

なので、先の座標補正を行った画像について前後の複数のフレームで比較をします。
当初は、一枚の画像からと考えていたのですが、動体認識をいれたほうがより人間の眼と認識に近いので、この方法をとります。つまりは、残像を追跡します。

動体の追跡に関しては、重心あるいは中央値の移動による計算で十分かと考えています。高速移動物体を認識することも考慮すれば、おそらく、中央値で十分かなと。

懸念事項ではありますが、アニメの切り替えのように、前のフレームが全く違っている場合(画面切り替えが行われた場合)を考慮する必要があります。

■個体認識

その物体が何であるか、を認識するには「認識票(識別信号)」を見ればいいわけですが、敵のZakuでは無理ですよね。なので、機影を確認します。これがパターンマッチングです。ただし、RX-78とMk-IIの違いを認識させるためには、ぼけぼけの画面では無理です。いや、逆にぼけぼけの画面の場合では、両者は同じものとして認識されなければいけません。
また、遠くにあって色識別が難しい場合(空気遠近法など)は、量産ザクの緑とシャア・ザクの赤は区別がつきません。あるいは、赤という色が認識できれば「シャアではないか?」という想像が可能です。

これらを考慮するために、

・テンプレートマッチング法
・特徴量抽出

の2種類を同時にこなす必要があります。

~~

さて、これらが夢なのか妄想なのか、年末出血大サービスなのかは、皆様のご想像にお任せいたします。

ええと、これらのコードを何で書こうかと画策中なのですが、高速化を含めればC言語で書いた方がいいのだけど、プロトタイプはC#で書こうかなと思っています。Javaでもいいんですが、ロジックはokなのですが、画像出力の方法をいくつか調べないといけないので、面倒なんですよね私にとって。まぁ、画像認識は、入力と出力以外は純粋にロジックなので、何で書いてもok。
# OpenCV 準拠ってのも考えたのですが、ひとまず、C#でロジックを書いた後に、C言語で書きなおしたほうが早いかな、と。

そういう訳で、Zaku認識(ザク認識)の「その1」はおしまい。1ヶ月後ぐらいに「その2」を書きましょう。

カテゴリー: 開発 パーマリンク