2016-05-05 17 views
0

私は類似した画像のためにmemoizationシステムを開発しています。私はこの質問を2つの副題で分けます。一つは次のステップですから、もっと適切だと思うなら2つの異なる質問を投稿することができます。類似の画像を持つC++の画像ハッシング機能

知って最初にすること:私はこの貧しい男と優しくしてください、画像処理について何も知らないしません:)

問題の説明

我々が取る機能ReturnType foo(Image)を持っていますそれは時間がかかりますが、何かが返されます(アプリケーションに依存します)。私が設計しているmemoizatorはunordered_map<ImageHash,ReturnType>(または同等の構造)なので、ユーザーが同じ画像を2回送信すると、既に計算されたReturnTypeの値が直接返されます。私は

必要なもの

あなたが想像できるように、私はいくつかのHashFunction S。T.が必要HashFunction(Image)=ImageHashImageHashは高い確率でユニークです)。

このImageHashは、実行、マシン、時間に依存しないことに注意してください。これは、unordered_mapがファイルにシリアル化されるため(異なる実行で使用できるため)、他のユーザーと共有されるためです。

パフォーマンスが本当に重要なので、高速のハッシュ関数が有効です。

私はこのトピックについてthis questionを見つけましたが、著者は画像に多くの制約をもたらしました(中毒では良い解決策はありません)。

注:画像には制約がありませんので、お好きなソリューション(提案する画像のセットを含めることができます)を提案できます。

注:はSHA-1可能な解決策ですか?私はそれが可能イメージのためにそれを使用する場合、私は知らない(と、それはC++の実装が存在する場合)

を次のステップは

が、私は以前のソリューションを拡張したいと思い、文字列のみのためにそれを使用しましたしたがって、類似の画像についても同じ結果が返されます。従って、正式には、Image image2と同様のImage image1が与えられた場合、(image1,result)または (image2,result)がすでに計算されている場合、image1のシステムはReturnType resultを返します。

私はphashについて聞いたことがありますが、それがこの目的に適しているかどうかはわかりません。

+0

md5は、この種のもののための一般的なハッシュアルゴリズムです。ハッシュコードを使用して同様の画像を照合する限り、それはうまくいくとは思わない - ハッシュコードは、それらを生成するために使用される正確なバイトシーケンスに非常に依存しており、私の知る限りでは不正確性をテストするためにそれらを使用する。 –

+0

@JeremyFriesnerだからsha-1もいいです:) – justHelloWorld

答えて

1

私は先に進む前にいくつかの画像を収集することをお勧めします。今、それを行う最良の方法は、深い学習を使用して類似関数を学習し、画像をいくつかのn次元の特徴空間にマッピングし、類似性を測定するために余弦距離を使用することである。ここにあなたを始めるためのコード例がいくつかあります(https://github.com/kevinlin311tw/caffe-cvprw15)。あなたがより効果的なテクニックを望んでいる場合、ウサギの穴に従うことを喜んで、トリプレットのランキングの損失を見てください。

Phashは機能しますが、類似スコアを作成する際のパフォーマンスは、深い学習機能を使用した場合よりもはるかに低いです。しかし、実際のハッシュ技術よりもはるかに優れています。これは、JPEG圧縮レベルを変更するだけでハッシュ値が変更されるためです。あなたがこれにあまりにも多くの時間を費やしたくなければ、使用するのに手間がかからないので、phashが最良の代替手段になるでしょう。

+0

あなたの答えに感謝します。画像からn次元ベクトルを作成するにはどうすればいいですか?私はこれがそのようなプロセスの基本だと思う:) – justHelloWorld

0

は、私はちょうどあなたがキーとしてハッシュの結果とunordered_map<ImageHash,ReturnType>を使用している場合は機能しません計算の結果をキャッシュSTLにunordered_map

を使用する場合には少し追記を持っています。 2つの画像が同じ値にハッシュした場合、2番目の画像の挿入は起こりません。http://www.cplusplus.com/reference/unordered_map/unordered_map/insert/

各要素から

は、そのキーが既にコンテナ内の他の要素のキーに相当しない場合にのみ挿入される(unordered_mapのキーはユニークです)。

ハッシュの衝突がunordered_mapによって正しく処理されるように、鍵はタイプImageである必要があります。あなたはSTL unordered_mapを使用して終了し、キーとして呼び出すunordered_mapコールハッシュ関数の代わりに使用したハッシュ関数の結果許可すれば

http://www.cplusplus.com/reference/unordered_map/unordered_map/

template < class Key,         // unordered_map::key_type 
      class T,          // unordered_map::mapped_type 
      class Hash = hash<Key>,      // unordered_map::hasher 
      class Pred = equal_to<Key>,     // unordered_map::key_equal 
      class Alloc = allocator< pair<const Key,T> > // unordered_map::allocator_type 
      > class unordered_map; 

からあなたはhash<key>引数を提供する必要があります。

+0

更新: 'ImageHash'は高い確率でユニークでなければなりません。 – justHelloWorld

+0

@justHelloWorld私は、あなたがunordered_mapにそのことをさせない理由は見当たりません。あなたが必要ならunordered_mapからハッシュ値を得ることさえできます。 –

関連する問題