サナギわさわさ.json

サナギさんとキルミーベイベーとプログラミングが好きです

Solrで類似画像検索(LIRESolr)を導入する

ヤクルトの投手陣がやけに調子良いので、皆さんもまさかの事態に備えて乾パンや懐中電灯を買い込んでおきましょう。

今日はSolrで類似画像検索をするためにLIRESolrを導入した際の備忘録を残しておきます。

LIREというのは、画像から色やエッジベースで特徴量を抽出してLucene上にインデックスで保存する事によって類似画像検索をするためのライブラリでして、LIRESolrはそれをSolr上で動かすためのプラグインです。

LIREのプロジェクトページ
LIRE - Open Source Visual Information Retrieval

LIRESolrのプロジェクトページ(今回書いた内容は基本的にここに全て書いてます)
dermotte / LireSolr — Bitbucket

事前準備

LireSolrの最新版(2015/03/31時点)はSolr4.10までしか対応していないので、今回はSolr4.10上にLireSolrの導入を行います。
以下、Solr4.10の環境構築はすでに終わっている前提で書きます。また、antを使うのでそちらのインストールも事前に済ませておいてください。(詳しくは過去記事に書いてます)

Tomcat7 + Solr4.10の環境構築 - サナギわさわさ.json

インストール
git clone https://bitbucket.org/dermotte/liresolr.git
cd liresolr
ant clean
ant dist
パス通す

solrconfig.xml

<lib dir="${solr.install.dir:../../../..}/contrib/liresolr/dist/" regex=".*\.jar" />
<lib dir="${solr.install.dir:../../../..}/contrib/liresolr/dist/lib/" regex=".*\.jar" />

を追加(自分の環境に合わせて適宜設定してください)

関数追加

solrconfig.xml

<requestHandler name="/lireq" class="net.semanticmetadata.lire.solr.LireRequestHandler">
    <lst name="defaults">
      <str name="echoParams">explicit</str>
      <str name="wt">json</str>
      <str name="indent">true</str>
    </lst>
</requestHandler>

<valueSourceParser name="lirefunc"
    class="net.semanticmetadata.lire.solr.LireValueSourceParser" />

を追加

データ登録

solrconfig.xmlを編集(必要に応じて変更)

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<!-- the sole file name -->
<field name="title" type="text_ja" indexed="true" stored="true" multiValued="true"/>
<field name="img_path" type="string" indexed="false" stored="true" multiValued="false"/>
<!-- Edge Histogram -->
<field name="eh_ha" type="text_ws" indexed="true" stored="false" required="false"/>
<field name="eh_hi" type="binaryDV"  indexed="false" stored="true" required="false"/>
<!-- ColorLayout -->
<field name="cl_ha" type="text_ws" indexed="true" stored="false" required="false"/>
<field name="cl_hi" type="binaryDV"  indexed="false" stored="true" required="false"/>
<!-- PHOG -->
<field name="ph_ha" type="text_ws" indexed="true" stored="false" required="false"/>
<field name="ph_hi" type="binaryDV"  indexed="false" stored="true" required="false"/>
<!-- JCD -->
<field name="jc_ha" type="text_ws" indexed="true" stored="false" required="false"/>
<field name="jc_hi" type="binaryDV"  indexed="false" stored="true" required="false"/>
<!-- OpponentHistogram -->
<!--field name="oh_ha" type="text_ws" indexed="true" stored="false" required="false"/-->
<!--field name="oh_hi" type="binaryDV"  indexed="false" stored="true" required="false"/-->


<fieldtype name="binaryDV" class="net.semanticmetadata.lire.solr.BinaryDocValuesField"/>

データ作成はlire-request-handler.jar を用いて行うこともできるのですが、自分の欲しいxml型を作るのが少し面倒だったので普通にJavaで書きました。 LireSolrのソース見れば整形方法だいたい分かると思いますので、そこを参考にしてください。

データ検索

作成データを登録したら、 [solrurl]/lireq?url=image_path&field=eh_ha の形式のURLを投げることで検索できます。
※fieldは検索基準で変更、eh_haはエッジ、cl_haはカラーレイアウトなどなど

基本的には以上です。どんな感じで検索できるかのデモサイトを今作ってるので、できたら公開したいと思います。