画像の類似検索

業務で類似検索関連の機能を作ることになって色々と調べたのでまとめてみる。

手法は大きく分けると2種類

類似検索において手法を大きく分けるとなると以下の2種類。
  1. 画像に付随するメタデータ(テキスト情報等)を用いた検索
  2. 画像の特徴量をベースに検索
1は特に説明は不要なので, 今回は2の特徴量ベースの手法に関して書いてみる。

そもそも類似とは

もちろん言葉の通りではあるが, アプリケーションの機能として実装する場合は
そういったものを機能といて「類似」と定義するのかは重要になってくる。
  • 特定のメタデータを持っているのか。
  • 色味が似ている。
  • 画像のパターン(構図等)が似ている。
  • etc...
上記のどういった「類似」かで使う手法は変わってくる。

特徴量

  • SIFT
  • SURF
  • ORB
  • AKAZE
  • RGB
  • Histogram
  • aHash
  • pHash
  • etc...

SIFT

照度, 回転, 拡大に頑強な特徴量。
Googleの論文 を参照。
画像から128次元のSIFT特徴量が複数取得できる。
主な所は画像内の物体認識やパノラマ画像の合成に用いられる。

SURF

SIFTの処理速度改善版。
処理速度がSIFTに比べて早い分, 認識精度はSIFTに劣る。

ORB

SIFT, SURFと同じく回転, 拡大に頑健な特徴量。
SURFの10倍、SIFTの100倍 高速とか言われてるので, リアルタイム処理に向いてる。
著作権やライセンスがうるさい画像処理系でも使いやすい。

AKAZE

下記の記事の中でベンチを撮られていますが, SIFT, SURFに近い速度で高性能な印象をうけます。

AKAZE特徴量の紹介と他特徴量との比較

RGB

各ピクセルのRGB値を特徴量に使う。

Histogram

画像のヒストグラムを特徴量として用いる。
使用するヒストグラムの種類は複数種類がありますが
カラーヒストグラムですと, 画像中に各色が何ピクセルあるか数えて作成した棒グラフのイメージです。
色での類似度(e.g. 赤い〇〇の類似検索)を見る等ができるかと思います。

Average Hash (aHash)

Average Hashは簡素化された類似検索に用いる特徴量です。
ハッシュと言っても, 一般的な値が近くても異なるハッシュになるのではなく
似たデータは近いハッシュに変換される。
処理は画像をグレースケール化し, 画像を縮小, 全画素の平均を元に各画素を走査し,
平均より上なら1, 下なら0といった具合でハッシュ化する。
拡大縮小には強い。

Perceptual Hash (pHash)

Perceptual HashはaHashにハッシュの性質は似ていますが
変換処理が違います。
離散コサイン変換を使用して, 低周波成分から64ビットのハッシュ値を算出する特徴量。

類似画像の検出手法

  • Bag of keypoints (Bag of features)
  • Earth Mover's Distance
  • ハミング距離
  • etc...

Bag of keypoints

BAg of wordsの特徴量版。一般的な物体認識に使われる。
複数の特徴量群をクラスタリングして
対応する物体のクラスタを調べる事で別の画像に含まれる物体がどこにあるかを検出する。
局所特徴量として, SIFT, SURF, ORB, AKAZE等を使うことができる。
特徴量のクラスタリングにはK-means等でクラスタリングをする。
e.g. 教師データとして人, 車等を学習して, 画像内のどこに何があるかを識別する。

Earth Mover's Distance

分布や特徴量の距離を尺度に検出処理をする。
基本的な概念は輸送問題の考え方。
各分布の特徴量や重みを元に距離を図って輸送に必要な仕事量が小さいほど距離が近いといった考え方です。
以下の記事が分かりやすい。

Visual Wordsを用いた類似画像検索

SVM

特徴ベクトルを元に学習モデルを構築する。
設定されたラベルに対して多値分類を行う。
類似というよりは分類なのであまり使ってる事例はないかもしれない。

Histogram Intersection

2つのカラーヒストグラムの類似度を求めます。
ヒストグラムが似ている程, 大きな値になります。

ハミング距離

等しい文字数をもつ2つの文字列の中で, 対応する文字位置で異なる文字の数を距離とする尺度。
11101, 10101の距離は1といった具合で使用する。
類似画像検出としては主にaHash, pHash等の特徴量で使われる事が多い。

組み合わせ

  • Bag of keypoints * (SIFT, SURF, ORB, AKAZE)
  • Earth Mover's Distance * (SIFT, SURF, ORB, AKAZE)
  • SVM * RGB
  • Histogram Intersection * Histogram
  • ハミング距離 * (aHash, pHash)
  • etc...
ホントは各組み合わせで再現率や適合率で評価できればと思ったけど
それは別途試した結果を試した結果をブログにまとめれればと思う。