物体認識とは(2009/10/18)の続きです。いう局所特徴量を抽出するところを作ってみようと思います。SIFT特徴量の抽出まずは、局所特徴量の代表ともいえるSIFTを試してみます。Hess氏がC言語で実装したライブラリを試してみます。内部でOpenCVを使っているので事前にOpenCVのインストールが必要です。1.1でされているみたいですが、2.0でもちょっと手直しすると動きました。Detectorのzip版を落とします。(注)Hess氏のサイトが更新されたようで現在はGitHub上のOpenSIFTというプロジェクトで公開されています。これらを自分のプロジェクトに追加します。OpenCV2.0でコンパイルするといくつかエラーが出た*1ので直します。警告は出ますがとりあえずコンパイルできます。beaver.pngという画像で実行すると下のような画像が表示されます。矢印の始点はキーポイントの位置、矢印の長さはスケール、矢印の向きは勾配強度がもっとも強い向きを表しているようです。SIFTの表示方法はキーポイントの点だけ表示、矢印で表示、円で表示などいろいろあるみたいですね。スケールや勾配強度が何を意味しているかはもう少し調査が必要です。当面は、SIFTのキーポイントの位置とそれぞれの点が128次元の特徴ベクトルで表せることだけおさえとけばいいかな?それぞれのキーポイントの128次元ベクトルは、beaver.siftというファイルに保存されています。矢印1本につき128個の数値(128次元ベクトル)です。下のようなファイルです。0上の画像の場合、128次元ベクトル114本によって表されるってことですね。この128次元ベクトル114本を物体モデルデータベースに登録しておくことになります。このファイルをよく観察するとどうやらキーポイントはスケールの大きな順(矢印が長い順)に並んでいることがわかります。これまたまだよくわかってないのですが、スケールが大きいキーポイントほど重要と解釈してよいのでしょうか?もし詳しい方がいたらアドバイスください。キーポイントを点で描画ここでちょっと改造してみます。キーポイントを矢印ではなく点表示にし、SIFTファイルが1行で1個のキーポイント情報を表すようにします。0);とし、同じファイルの523行目あたり(数字20個おきに改行を入れる部分)をコメントアウトします。);こうすると下のようにキーポイントが点になります。beaver.siftも1つのキーポイントの情報が1行にまとまります。スクリプトで処理するときはこっちの方が楽だと思います。いくつかの画像でSIFTキーポイントを描画してみます。SIFTが画像のどういうところをキーポイントとしてるか大体想像つきますね。陰陽マークみたいにあまり模様がない画像ではキーポイントが少なくなりがちみたいです。SIFTの詳細SIFTのキーポイントは、画像の特徴をよく表している場所ってことはわかりました。いう根拠に基づいてその点が選ばれたのか?128次元ベクトルがどういう風に求められたのか?はアルゴリズムの詳細を詳しく調べる必要があります。(DoG)、局値検出、画像の微分、強度勾配など画像処理の理論がわかっていないと理解が難しい・・・私もまだおぼろげに理屈がわかってきた程度です。1つ思い違いをしてたのは、SIFTは色情報を使ってないってことかな。実際、グレースケール画像から抽出してます。いくつか参考にした文献を挙げておきます。これらを参考にそのうちC++版のSIFTを作ってみようと思います。SURFの抽出(2009/10/30)へつづきます。藤吉先生によるSIFTの解説資料、図が豊富でわかりやすい。手順を追って少しずつ実装しているのでわかりやすい。Hess氏のプログラムの実行方法です。こっちも試してみたい。Matlabによる実装。Wikipediaの記事。SIFTの提案者Lowe氏のデモ。最近傍探索の高速化(2009/12/12)*1:MinGWを使ってます。»プロフィールid:aidiary人工知能とその関連分野に興味があります。)はてなブログをはじめよう!aidiaryさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。