まんぼう日記

takataka's diary

CNNで抽出した特徴を使った画像検索

久しぶりに 研究 カテゴリーの記事 書きます.Convolution Neural Network (CNN) を画像検索に利用する話です.

 

画像検索(image retrieval または image search)とは,大量の画像を蓄えた「データベース (database)」の中から,検索対象(「クエリ (query)」)の画像に類似した画像を探し出す手続きのことです.ここで考えているのは画像の内容の類似性(人間の感覚的な似てる度合い)に基づく検索なので,より詳しく Content-Based Image Retrieval と言うこともあります.ちなみに,Content-Based じゃない画像検索ってのは,「猫」とか「白いもふもふ」みたいにキーワードをクエリにするとか,そういう類のやつね.

 

5年ほど前に Deep な CNN が画像認識で高い性能を示すことが知られるようになって以来,画像認識とその周辺は CNN 一色になったて言うても過言やない状況ですが,ほな画像検索にはどれくらい使えるんかな? ちうわけで,簡単な実験をやってみました. 

 

方法

手順をまとめると,こんなん:

  1. 1000クラスの画像分類を学習した CNN を使ってデータベースに蓄える画像たち(以下,DB画像)の特徴を抽出,データベースに蓄えておく
  2. クエリ画像も同じ CNN に入力し,特徴を抽出する
  3. クエリ画像の特徴と全てのDB画像の特徴との類似度を求める
  4. 類似度の高いDB画像を検索結果とする

1. は最初に一度だけやる作業ですが,2. から 4. はクエリ毎に実行することになります. 

CNNを用いた画像特徴の抽出

画像特徴を求めるのには,ILSVRC-2014 に参加した VGG team の 16-layer のネットワークを用いることにします.これは,1000種類の画像分類のタスクを学習した CNN です.詳しくはこちら: Caffe の学習済みネットワークを Theano に移して動かす (2) - まんぼう日記

 

この CNN の最後の ReLU (Rectified Linear Unit) 層の出力(ReLU が 4096 個あるので 4096 次元ベクトル)をユークリッドノルムが 1 になるように正規化したものを画像特徴とします.ただし,この設定では CNN への入力画像の大きさが 224 x 224 に限定されますので,DB画像もクエリ画像も,短辺が 256 になるように縮小(アスペクト比は変えない)して,その中央から切り出した 224 x 224 画像を入力するものとしました.さらに,ちょっとした工夫として,短辺が 256 になるように縮小した画像の中央および四隅から切り出した5通りの 224 x 224 画像を CNN に入力し,得られる5通りの特徴ベクトルの平均を正規化したものを画像特徴とする,という方法も試してみました.

 

画像間の類似度は,単純にユークリッド距離で測ります.上記の場合はベクトルは全て長さ 1 に正規化してあるので,二つの 4096 次元ベクトル間の内積を求めるだけで済みます.

 

データセットと評価基準

実験には,University of Kentucky Recognition Benchmark Images ( http://www.vis.uky.edu/~stewe/ukbench/ ,UKB とか ukbench と呼ばれることが多い)を用います.これは,2550種類の物体それぞれについて4枚ずつ撮った写真計10200枚から成る画像データセットです.

 

画像検索の仕組みの性能を評価する主な指標は,次の3つです.

  1.  検索の精度(検索結果上位に正しい画像を出力できたか)
  2.  検索に要する時間(1つのクエリの処理にどれだけ時間がかかるか)
  3.  データベースに必要なデータ量(DB画像1枚分の情報に何ビット必要か)

1. と 2. は問題ないと思いますが,3. についてはちょっと補足.画像検索では大量の画像の情報をデータベースに保持しておかねばなりませんが,画素値そのままやと容量食いすぎて,PC等の主記憶にはちょっとしか入りません.かといって補助記憶(HDDなど)の方に置いといたりしたら,アクセスに時間かかりすぎて 2. がめっちゃ大きくなってしまいます.そのため,主記憶には類似度計算に必要な特徴量のみをできるだけコンパクトな形で置いておくようにして,画像データそのものは補助記憶の方に置いとく,っちう工夫をしなければなりません.そのため,DB画像1枚分の特徴を表現するのに何ビット必要か,が重要な問題になるのです.

 

とか説明してはみたものの,今回の実験では 1. の精度しか測らへんのですけどね (^^).その求め方もいろいろありますが,UKBの場合は次の手順が標準ですので,この通りにやることにします.

  1.  10200枚全てをDB画像としてデータベースに格納しておく
  2.  これらの画像自身をクエリとして検索する
  3.  検索結果の4位までに正しい画像がいくつ入っていたかを数え,その平均を求める(以下,この値をスコアと呼ぶ)

同じ物体の画像が自分自身を含めて4枚あるので,スコアは 0 (クエリ自身すら5位以下になっちゃうおばかさん)から4(満点)までの値をとります.

 

実験

実験の結果はこんなんなりました.

手法変数の数スコア
CNN(中央のみ) 4096 3.52
CNN(5つの平均) 4096 3.64
SIFT + Fisher Vector 4096 3.48
SIFT + Fisher Vector 8192 3.50
Takahashi and Kurita 3104 3.52
Takahashi and Kurita 6208 3.66

上2つが今回の結果.それ以外については,Mixture of Subspaces Image Representation and Compact Coding for Large-Scale Image Retrieval - IEEE Xplore Documentpreprint) から拾った値です(宣伝...のようなもの...(^^;).下4つはいずれも SIFT 特徴ベースの手法で色情報使ってないとはいえ,そこらに転がってた CNN を何の工夫もなしに使ってみただけでこんないい結果が出てしまうとは,恐ろしい子....

 

ついでに内積の値のヒストグラムも作ってみたら,こんなんなりました.

f:id:takatakamanbou:20170103234518p:plain f:id:takatakamanbou:20170103234531p:plain

左が画像の真ん中から抽出した特徴だけ使った場合,右が5箇所の特徴の平均を使った場合.青が同じ物体同士の間,赤は異なる物体同士の間で測った内積の値です.何の最適化もしてへんのに結構よい特徴表現が得られてるみたいですね.

 

よだんだよん

あっさり追いつかれてくやしいので余談 (^^; 上記の論文では,精度だけでなく計算コストや記憶コストの面でも優れた手法を考えてます.画像1枚あたり 360 バイトでスコア 3.51,140 バイトで 3.41 を実現してます.