web-dev-qa-db-ja.com

畳み込み対相関

誰かが相関と畳み込みの類似点と相違点を私に説明できますか?数式ではなく、その背後にある直感について説明してください(つまり、カーネル/インパルスを反転します)。各カテゴリの画像処理ドメインでのアプリケーション例も高く評価されます

21
Varo

あなたはおそらくdspスタック交換ではるかに良い答えを得るでしょう...しかし、初心者のために私は多くの類似した用語を見つけました、そしてそれらは定義を突き止めるのが難しいかもしれません。

  1. 相関
  2. 相互相関
  3. たたみ込み
  4. 相関係数
  5. スライディングドット積
  6. ピアソン相関

1、2、3、および5は非常によく似ています

4,6は似ています

これらのすべての用語には、頭を育てるドット積があることに注意してください。

相関とたたみ込みについて質問しました。これらは、出力がたたみ込みで反転されることを除いて、概念的には同じです。相関係数(ピアソンなど)と畳み込み/相関の違いについて質問されたのではないかと思います。

前提条件

私はあなたが内積を計算する方法を知っていると仮定しています。それぞれ3つの要素を持つ2つの等しいサイズのベクトルvとwが与えられると、代数ドット積はv [0] * w [0] + v [1] * w [1] + v [2] * w [2]になります。

ドット積が何を表すかなどに関して、ドット積の背後には多くの理論があります...

内積は、これらの2つのベクトル/点v、w間のマッピングを表す単一の数値(スカラー)であることに注意してください。ジオメトリでは、内積を使用する2つのベクトル間の角度の余弦が頻繁に計算されます。 2つのベクトル間の角度の余弦は-1から1の間であり、類似性の尺度と考えることができます。

相関係数(ピアソン)

等しい長さv、wの間の相関係数は、2つのゼロ平均信号のドット積(zからvを減算してzmvを取得し、wからwを平均してzmwを取得します-ここでzmはゼロ平均の省略形)をzmvの大きさで除算したものですとzmw。

-1と1の間の数を生成します。0に近いほど相関はほとんどなく、+ /-1に近いほど相関が高くなります。これらの2つのベクトル間の類似性を測定します。

より適切な定義については http://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient を参照してください。

たたみ込みと相関

V1とv2を相関/コンボリューションする場合、基本的には一連のドット積を計算し、それらを出力ベクトルに入れます。 v1が3つの要素で、v2が10の要素であるとします。計算するドット積は次のとおりです。

output[0] = v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2]
output[1] = v1[0]*v2[1]+v1[1]*v2[2]+v1[2]*v2[3]
output[2] = v1[0]*v2[2]+v1[1]*v2[3]+v1[2]*v2[4]
output[3] = v1[0]*v2[3]+v1[1]*v2[4]+v1[2]*v2[5]
output[4] = v1[0]*v2[4]+v1[1]*v2[5]+v1[2]*v2[6]
output[5] = v1[0]*v2[7]+v1[1]*v2[8]+v1[2]*v2[9]
output[6] = v1[0]*v2[8]+v1[1]*v2[9]+v1[2]*v2[10] #note this is 
#mathematically valid but might give you a run time error in a computer implementation 

真の畳み込みが必要な場合は、出力を反転できます。

output[5] = v1[0]*v2[0]+v1[1]*v2[1]+v1[2]*v2[2]
output[4] = v1[0]*v2[1]+v1[1]*v2[2]+v1[2]*v2[3]
output[3] = v1[0]*v2[2]+v1[1]*v2[3]+v1[2]*v2[4]
output[2] = v1[0]*v2[3]+v1[1]*v2[4]+v1[2]*v2[5]
output[1] = v1[0]*v2[4]+v1[1]*v2[5]+v1[2]*v2[6]
output[0] = v1[0]*v2[7]+v1[1]*v2[8]+v1[2]*v2[9]

出力の要素が10未満であることに注意してください。簡単にするために、v1とv2の両方が定義されている場所でのみ畳み込みを計算しています。

また、たたみ込みは単なるドット積の数であることにも注意してください。畳み込みを高速化できるようにするために、長年にわたってかなりの作業が行われてきました。スイープドット積は遅く、最初にベクトルをフーリエ基底空間に変換し、次に単一のベクトルの乗算を計算してから結果を反転させることで高速化できますが、ここでは説明しません...

これらのリソースとグーグルを確認することをお勧めします。 Pythonでのピアソン相関と有意性の計算

25
Paul

私が得た最良の答えはこのドキュメントからでした: http://www.cs.umd.edu/~djacobs/CMSC426/Convolution.pdf

ドキュメントからの抜粋をコピーします。

「2つの主な違いは、たたみ込みが結合的であることです。つまり、FとGがフィルターの場合、F *(GI)=(FG)* Iです。これが信じられない場合は、たとえばF = G =(-1 0 1)を使用した簡単な例を試してください。たたみ込みを結合的にすることは非常に便利です。たとえば、画像を平滑化したいとします。次に、ガウシアンフィルターで画像を畳み込み、微分フィルターで畳み込むことでこれを行うことができます。ただし、代わりにガウスで微分フィルターを畳み込んで、ガウス差分(DOG)と呼ばれるフィルターを作成することもできます。 、次にこれを画像と畳み込みます。これの良い点は、DOGフィルターを事前に計算できるため、1つのフィルターのみを画像と畳み込みすればよいということです。

一般に、人々は平滑化などの画像処理操作に畳み込みを使用し、相関を使用してテンプレートを画像に一致させます。次に、相関関係が関連付けられていなくてもかまいません。2つのテンプレートを1つの相関関係に結合することは実際には意味がないため、たたみ込みのために2つのフィルタを結合することがよくあります。」

9
user2569364

畳み込みは、相関の前にフィルターを反転させることを除いて、相関のようです。

6
Yousaf Ali