実際、TinEye検索エンジンがどのように機能するかはわかりません。 使用されているアルゴリズムの詳細は公開されていません。 しかし、検索結果を見ると、何らかの形の知覚ハッシュアルゴリズムが機能していると結論付けることができます。
これは認識です!
知覚的ハッシュアルゴリズムは、同等のハッシュを生成するための関数のクラスを記述します。 画像の特性を使用して、個々の(一意ではない)印刷を生成し、これらの印刷を相互に比較できます。知覚ハッシュは、MD5やSHA1などの暗号化ハッシュ関数とは異なる概念です。 暗号化では、すべてのハッシュはランダムです。 ハッシュの生成に使用されるデータは乱数のソースとして機能するため、同じデータでも同じ結果が得られ、異なるデータでは異なる結果が得られます。 2つのSHA1ハッシュを比較すると、実際には2つの結論しか導き出せません。 ハッシュが異なる場合、データは異なります。 ハッシュが一致する場合、データはほとんど同じです(衝突の可能性があるため、同じハッシュはデータが一致することを保証しません)。 対照的に、知覚的ハッシュは互いに比較され、2つのデータセット間の相違の程度について結論を出すことができます。
私が見たすべての知覚的ハッシュ計算アルゴリズムは、同じ基本的な特性を持っています:写真のサイズを変更したり、アスペクト比を変更したり、色特性を少し変更したりすることができます(明るさ、コントラストなど)が、それらは同じハッシュを持っています。 TinEyeは同じ特性を示します(ただし、さらに多くの機能があります。これについては以下で説明します)。
よさそうだ
知覚ハッシュを取得する方法は? これにはいくつかの一般的なアルゴリズムがあり、それらはすべて非常に単純です(非常に単純な場合、最も有名なアルゴリズムがどのように効果を与えるのか、私はいつも疑問に思っていました!)。 最も単純なハッシュ関数の1つは、低周波数の平均値を表示します。画像では、高周波数は詳細を提供し、低周波数は構造を示します。 大きくて詳細な写真には、多くの高周波が含まれています。 非常に小さな画像には詳細がないため、完全に低周波数で構成されています。 平均的なハッシュ関数を示すために、次の妻のアリソン・ハニガンの写真を撮ります。
1. サイズを小さくします。 高周波を取り除く最も速い方法は、画像を縮小することです。 この場合、8x8に減らすため、ピクセルの合計数は64です。比率を心配することはできません。8x 8の正方形に駆動するだけです。 したがって、サイズと縦横比に関係なく、ハッシュは画像のすべてのバリアントに対応します。
=
2. 色を削除します。 小さな画像はグレースケールに変換されるため、ハッシュは3倍に削減されます。64ピクセル(赤、64緑、64青の64値)から合計64色値になります。
3. 平均を見つけます。 64色すべての平均を計算します。
4. ビットのチェーン。 これは最もおもしろいです。各色について、平均よりも多いか少ないかに応じて、1または0を取得します。
5. ハッシュを作成します。 64個の個々のビットを単一の64ビット値に変換します。 順序が一定に保たれていても、順序は関係ありません(左から右、上から下にビットを書き込みます)。
= = 8f373714acfcf4d0
結果のハッシュは、画像が拡大縮小、圧縮、または拡大されても変更されません。 明るさやコントラストを変更したり、色を操作したりしても、結果に大きな影響はありません。 そして最も重要なこと:そのようなアルゴリズムは非常に高速です!
2つの画像を比較する必要がある場合は、それぞれの画像のハッシュを作成し、異なるビットの数をカウントします(これがハミング距離です )。 距離がゼロの場合、同じ写真(または同じ画像のバリエーション)である可能性が高いことを意味します。 距離5は、写真が多少異なることを意味しますが、全体としてはまだかなり近いものです。 距離が10以上の場合、これらはおそらく完全に異なる画像です。
pHashを試す
ハッシュは平均的でシンプルで高速ですが、クラッシュします。 たとえば、ガンマ補正またはカラーヒストグラムの変更後、複製画像が見つからない場合があります。 これは、色が非線形スケールで変化するため、「平均」の位置がシフトされ、多くのビットが値を変更するためです。pHashハッシュ関数は、より堅牢なアルゴリズムを使用します(実際、このアルゴリズムの独自のバージョンを使用しますが、概念は同じです)。 pHashメソッドは、 離散コサイン変換 (DCT)を適用して高周波数を除去することにより、平均の概念を極限まで取り入れることです。
1. サイズを小さくします。 平均ハッシュと同様に、pHashは小さな画像サイズで機能します。 ただし、ここでの画像は8x8より大きく、ここでは32x32が適切なサイズです。 これは実際には、DCTを単純化するために行われ、高周波を除去するためではありません。
2. 色を削除します。 同様に、計算を簡単にするためにカラーチャネルが削除されています。
3. 離散コサイン変換を実行します。 DCTは、画像を一連の周波数とベクトルに分割します 。 JPEGアルゴリズムは8x8ブロックでDCTを実行しますが、このアルゴリズムではDCTは32x32で実行されます。
4. DCTを減らします。 これは魔法のステップです。 元のブロックは32x32でしたが、左上のブロック8x8のみを保存します。 画像からの最低周波数が含まれています。
5. 平均値を計算します。 平均ハッシュと同様に、平均DCT値はここで計算されます。8x8ブロックで計算され、最初の係数は計算から除外して、ハッシュの説明から空の情報、たとえば同じ色を削除する必要があります。
6. DCTをさらに削減します。 また、魔法のステップ。 64個のDCT値のそれぞれを、平均よりも大きいか小さいかに応じて、0または1に割り当てます。 このオプションは、ガンマ補正またはヒストグラムの変更に問題なくすでに耐えることができます。
7. ハッシュを作成します。 64ビットは64ビット値に変わりますが、ここでも順序は関係ありません。 指紋が視覚的にどのように見えるかを確認するには、1または0に応じて各ピクセルに+255および-255の値を割り当て、DCT 32x32(高周波数の場合はゼロ)を32x32画像に変換します。
= 8a0303769b3ec8cd
一見、この写真は無意味な球形のアウトラインのセットのように見えますが、よく見ると、暗い領域が写真の同じ領域に対応していることがわかります(写真の右側の背景の髪型とストリップ)。
平均ハッシュと同様に、同じハミング距離アルゴリズムを使用してpHash値を相互に比較できます(各ビットの値が比較され、差の数が計算されます)。
クラス最高?
私はデジタル写真の調査に深く関わっており、巨大な画像アーカイブを扱うため、同一の写真を検索するツールが必要です。 そこで、いくつかの知覚ハッシュアルゴリズムを使用する検索エンジンを作成しました。 私の豊富な、非科学的ではあるが経験が示すように、平均ハッシュ関数はpHashよりもはるかに高速であり、特定の何かを探している場合はうまく機能します。 たとえば、小さな写真アイコンがあり、コレクションのどこかにフルサイズのオリジナルが保存されていることが確実にわかっている場合、ハッシュは平均してすばやく見つけます。 ただし、たとえば、テキストを追加したり、新しい顔を貼り付けたりするなど、画像が操作された場合、それに対処する可能性は低くなりますが、pHashは、低速ではありますが、画像の小さな変更(領域の25%未満)に対してはるかに寛容です。また、TinEyeのようなサービスがある場合は、毎回pHashを実行することはありません。 ハッシュ値が事前に計算されたデータベースがあると思います。 画像を比較する主な機能は非常に高速です(ハミング距離の計算を大幅に最適化する方法がいくつかあります)。 そのため、ハッシュの計算は1回限りのタスクであり、数秒で(1台のコンピューターで)数百万の比較操作を実行することは非常に可能です。
品種
パフォーマンスを改善する知覚ハッシュアルゴリズムのフレーバーもあります。 たとえば、サイズを縮小する前に画像をトリミングできます。 この場合、画像の主要部分に関する情報の損失は特別な役割を果たしません。 さらに、画像は部分に分割できます。 たとえば、顔認識アルゴリズムを使用している場合、各顔のハッシュを計算できます(TinEyeアルゴリズムでも同様のことが行われると思われます)。他の種類では、色の全体的な分布(たとえば、髪の毛が青や緑よりも赤く、背景が暗いよりも明るい)や線の相対的な位置を分析できます。
写真を比較できる場合、完全に新しい視点があなたの前に開きます。 たとえば、検索エンジンGazoPaを使用すると、画面に絵を描くことができます 。 TinEyeと同様に、私は彼らのアルゴリズムのすべての詳細を知りませんが、ある種の知覚ハッシュのように見えます。 また、ハッシュ関数はすべてを低周波に低減するため、スティックの付いた3人の人物の私の曲がったパターンは、3人を描いた写真を含む他の画像と比較できます。