2016-09-20 25 views
0

私はImagehashをPythonで使用して、約30,000画像の48桁の16進ハッシュを生成します。これは辞書のリスト他のいくつかの画像特性)。たとえば:固定長ヘックスのリスト内で最小のハミング距離を見つける最も速い方法

[{"name":"name1", "phash":"a12a5e81127d890a7c91897edc752b506657233f56c594b7e6575e24e457d465"}, 
{"name":"name2", "phash":"a1aa7e011367812a7c9181be9975a9e86657239f3ec09697e6565a24e50bf477"} 
... 
{"name":"name30000", "phash":"a1aa7e05136f810afc9181ba9951a9686617239f3ec4d497e6765a04e52bfc77"}] 

私はその後、phashedれるラズベリーパイからのビデオ入力を持っており、そのハッシュがパイカメラの性質を考えると、このデータベース(と比較され、ビデオストリームからテストハッシュは今までありませんデータベース内のハッシュと一致します)。今私はダムループをしています。これは、ループスルーしてあまりにも遅い〜30,000の計算済みハッシュのそれぞれのハミング距離を確認するのに約5秒かかります。私が使用しているImagehashライブラリは、dbHash1 - testHashを実行するだけで、ハミング距離を計算できることを意味しています。明らかにソートしてやることは、ソートがハミング距離と無関係であるので、これに近づく方法ではありません。だから、私はこれを行うためのより速い方法がなければならないと思いますか?私はメトリックスペースに関してthis questionを読んだことがありますが、誰かが知っている(比較的)シンプルなPython実装があるかどうかを確認したいと思いました。

+0

ああ、私はOPでこれを明らかにする。私が探しているテストハッシュは、データベースハッシュのいずれともまったくマッチしません。ハミング距離が最小のものを探しています。 – IronWaffleMan

+0

メトリックスペースの検索をサポートする多くのデータ構造があります。このSOの質問を参照してください。http://stackoverflow.com/questions/6389841/efficiently-find-binary-strings-with-low-hamming-distance-in-大規模なセット – AChampion

+0

私はそれを見たことがありますが、そのうちのどれを実装するのかわかりません。 – IronWaffleMan

答えて

0

ImageHashの背後にある男の回答がありました。Johannes Buchnerです。

Iは2DマトリックスとしてDBを格納することができる:

arr = [] 
for dbHash in db: 
    arr.append(dbHash.hash.flatten()) 
arr = numpy.array(arr) 

をその後Iが同時に全てとの比較を行うことができます。

binarydiff = arr != testhash.hash.reshape((1,-1)) 
hammingdiff = binarydiff.sum(axis=1) 
closestdbHash_i = numpy.argmin(hammingdiff) 
closestdbHash = db[closestdbHash_i] 
-1

Scipy's pairwise distance functionは、ハミング距離をサポートします。私はそれを試みるだろう。

+0

私は既にテストハッシュとデータベース内のすべてのハッシュからハミング距離を取得する方法を知っています。私が必要とするのは、30,000回のループ反復を伴わない迅速な方法です。 – IronWaffleMan

+0

Scipyの実装はC++で書かれており、かなり最適化されている可能性があります。直接のペアワイズ比較を実行することに依然依存していますが、それは単なるものとしてコード化するよりもはるかに高速でなければなりません。私はコメントとしてコメントを投稿したはずです。メトリックスペースについての主な質問には答えられないからです。 –

関連する問題