はじめまして。エンジニアの小金澤です。
つい最近、類似画像検索という言葉がふと耳に入ってきたので、調査してみました。
意外と参考となる記事が少なかったので(というか...小難しい記事ばかりでした)、纏めるのに少々苦労しましたが、最終的には技術的検証まで行いたいと思います。
概要
画像検索には、TBIRとCBIRがあるらしい。
そしてTBIRとCBIRの両方を用いて画像検索を行うものがあるらしい...
また、この2つ、TBIRとCBIR両方を用いて検索する方法が最も目的の画像を抽出することができる...らしい......
ということで本当に類似検索できるのか、まずは簡単そうな??CBIRについて調査・検証してみたいと思います。
また、軽くTBIRにも触れていきます。
1. 類似画像検索ついて
- TBIR (Text-Based Image Retrieval)
主にテキスト情報と画像を紐付けて画像を検索する手法のこと。つまり画像に対してテキスト情報を付け加えて情報を保持する必要がある。
- CBIR(Content Based Image Retrieval)
画像の形状特徴や色特徴を基に類似する画像を分類し検索を行う。
2. 検索アルゴリズム
- Earth Mover's Distance (EMD)
EMDとは、A画像とB画像が持つ2次元ユークリッド距離(画像なので2次元としました。)比較しその距離間を計算します。 もっと簡単にちょー分かりやすくいうと、画像の特徴をハッシュ化しお互いのハッシュ値を比較する。※大分語弊ありありですが...
また、特徴としては、画像を決められたY/X座標毎に分割し、分割した画像のヒストグラムを計算しハッシュ化します。
そして分割したハッシュの総和を比較するというわけです。 ※ 画像に紐付いたテキスト情報も含めて、計算することもできるらしい。TBIR/CBIR2つの情報を元に計算することも可能。
- Histogram Intersection
色の類似度を計算するアルゴリズム。
こちらは、EMDに比べもう少しわかりやすいものとなってます。 色の比較です。単純ですね。赤(R)、緑(G)、青(B)の各成分が画像中に何ピクセルあるかを計算し、比較するというものです。
- Average Hash(aHash)
Perceptual Hashを使い計算するアルゴリズム
Perceptual Hashの生成方法は以下のとおりです。
- 画像のリサイズする(8x8=64ビット/16×16=256ビット)
- 色を削減する(グレースケールに変換)
- ピクセル毎の色の平均値を算出
- ハッシュを構築(各ピクセル毎に平均値以下か以上かを設定しハッシュ化する)
以下、このアルゴリズムの作成者(Dr. Neal Krawetz)のブログです。 http://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html
本格的なPerceptive Hash(pHash)を使って計算する場合は、離散コサイン変換(DCT)をする必要があり、また、コストがとても高い(重い)ため、現在は、Average Hashが話題になっているようです。
3. 次回予告
次回は、このAverage Hashを使い実際に以下のGemと画像を使いRubyで検証していきたいと思います
- Gem
- 画像
最終目標
乞うご期待!!!