1

多数の画像(数百万)と、比較する必要のあるそれらの画像(libpuzzleによって生成された)のコンテンツ署名で構成されるデータベースがあります。

さまざまな検索アルゴリズム(現在、レーベンシュタインの差が最も速く実行されている)やプレフィルターとしてのさまざまなデータポイント(比較をわずか数千のバッチに削減する)など、さまざまな代替案を実行して効率を高めています。画像)しかし、私が試したものはすべて、本番環境での使用を遅らせる方法です。私は1日に数千枚の画像を追加します。これらの画像には、完全なコレクションの他のすべての画像と比較して署名が必要です。

私が使用した2つの主なストレージ方法は、CouchDbとMySqlです。どちらも、数十ギガ以上のデータストレージが必要であり、わずか数百万のレコードの後、MySqlの実行が非常に遅くなります(結果のキャッシュとインデックスのキーサイズの変動があっても、インデックスこれと同様のアプローチを使用すると大きすぎますが、これは優れていますが、それでも低速です)。Couchでは、大きなインデックスを処理できないようです。また、ストレージの問題を解決するAmazon SimpleDBのようなサービスも検討しましたが、このような大きなインデックスのメモリ要件を考えると非常に高価であり、Couchよりもうまくいかない可能性があります。

テーブルの構造は単純です。

ImageId int(11),
Signature VARCHAR(1020) //implemented as text

望ましい結果は、ImageIdが指定されたImageIdのリストである必要があります。単純な自己結合(ON比較機能)は遅すぎます。

私の実装は、既存の画像を比較し、継続的に新しい画像を既存のベースと比較して、これら2つの目標を達成することです... 1)同一またはほぼ同一の画像(サイズ変更、トリミング、マイナーなカラーバリエーションを含む)を特定します。 2)類似した画像を特定して、類似した視覚的コンテンツの画像に関心がある可能性のある画像検索を支援します。libpuzzleライブラリは、両方に使用できるスコアを提供します(前者には> 95%、後者には> 80%を使用します)。

本質的に私の質問は、 a)
異なるデータストレージプラットフォーム
b)MySqlを使用する技術c)または 非常に大量のバイナリデータを線形に比較するために使用できる
他の(おそらくカスタム)アプローチのいずれかを知っている人はいますか?
効率的な方法?

4

1 に答える 1

1

あなたがリンクした「優れたアプローチ」は実際には答えですが、1つの大きな問題があります。それは、その種の検索にはひどいMySQLではなく、SolrまたはSphinxで正確に構築されているためです。それ。

Solrを知っているので、次の方法で実行できます。

一定の長さ(最大ngram長=最小ngram長)のngramフィルターを使用してトークン化されたテキストとして署名にインデックスを付けます-これにより、リンクされた回答から署名が「単語」(トークン)に分割されます。

<fieldType 
   name="signatureNgrams" 
   stored="false" 
   class="solr.StrField"> 
 <analyzer type="index"> 
   <tokenizer 
       class="solr.analysis.NGramTokenizerFactory" 
       minGramSize="4" 
       maxGramSize="4" 
       /> 
   <filter class="solr.LowerCaseFilterFactory"/> 
 </analyzer> 
</fieldType>

http://wiki.apache.org/solr/DisMaxQParserPlugin#mm_.28Minimum_.27Should.27_Match.29を使用して、最小の類似性(一致する必要のあるngramの数)を定義します。

于 2012-07-29T01:23:47.553 に答える