ディープラーニングにおけるアップサンプリング手法のまとめ

目次

1.補間

1.1 補間アルゴリズム(モードパラメータ)の概要

1.2 align_cornersパラメータの説明

2. プーリング防止

2.1 平均プーリングと反平均プーリング

2.2 最大プーリングと反最大プーリング

3. 転置コンボリューション(デコンボリューション)


        深層学習でのダウンサンプリングには、プーリングとステップ サイズ 2 のコンボリューションの 2 つの一般的に使用される方法があり、アップサンプリング プロセスでは、内挿、アンプーリング、デコンボリューションの 3 つの一般的に使用される方法があります。セマンティックセグメンテーション、ターゲット検出、3D再構成モデ​​ルのいずれにおいても、抽出された高レベルの特徴を拡大する必要があり、その際に特徴マップをアップサンプリングする必要があります。以下の記事ではディープラーニングにおけるアップサンプリング手法について具体的にまとめています。

1.補間

torch.nn.Upsample(size=None, scale_factor=None, mode='nearest', align_corners=None, recompute_scale_factor=None)
参数说明:
①size:可以用来指定输出空间的大小,默认是None;
②scale_factor:比例因子,比如scale_factor=2意味着将输入图像上采样2倍,默认是None;
③mode:用来指定上采样算法,有'nearest'、 'linear'、'bilinear'、'bicubic'、'trilinear',默认是'nearest'。上采样算法在本文中会有详细理论进行讲解;
④align_corners:如果True,输入和输出张量的角像素对齐,从而保留这些像素的值,默认是False。此处True和False的区别本文中会有详细的理论讲解;
⑤recompute_scale_factor:如果recompute_scale_factor是True,则必须传入scale_factor并且scale_factor用于计算输出大小。计算出的输出大小将用于推断插值的新比例。请注意,当scale_factor为浮点数时,由于舍入和精度问题,它可能与重新计算的scale_factor不同。如果recompute_scale_factor是False,那么size或scale_factor将直接用于插值。
torch.nn.functional.interpolate(input, size=None, scale_factor=None, mode='nearest', align_corners=None, recompute_scale_factor=None, antialias=False)
参数说明:
①input:输入张量;
②size:可以用来指定输出空间的大小,默认是None;
③scale_factor:比例因子,比如scale_factor=2意味着将输入图像上采样2倍,默认是None;
④mode:用来指定上采样算法,有'nearest'、 'linear'、'bilinear'、'bicubic'、'trilinear',默认是'nearest'。上采样算法在本文中会有详细理论进行讲解;
④align_corners:如果True,输入和输出张量的角像素对齐,从而保留这些像素的值,默认是False。此处True和False的区别本文中会有详细的理论讲解;
⑤recompute_scale_factor:如果recompute_scale_factor是True,则必须传入scale_factor并且scale_factor用于计算输出大小。计算出的输出大小将用于推断插值的新比例。请注意,当scale_factor为浮点数时,由于舍入和精度问题,它可能与重新计算的scale_factor不同。如果recompute_scale_factor是False,那么size或scale_factor将直接用于插值。

1.1 補間アルゴリズム(モードパラメータ)の概要

        補間アルゴリズムで一般的に使用される方法には、最近接補間、線形補間、双線形補間などが含まれます。ここでは、最も一般的に使用される最近接補間および双線形補間方法についてのみ説明します。

1.1.1 最近傍補間

       最近傍補間法は、入力画像座標系の点 u にマッピングされた出力ピクセルと 4 つの最近傍ピクセル (n1、n2、n3、n4) の間の距離を直接計算し、最も近いピクセルのピクセル値を割り当てます。あなたからあなたへ。最近傍補間法の計算速度は非常に速いですが、新しい画像は元の画像の勾配関係を部分的に破壊します。

 1.1.2 双一次補間法

        共一次補間は、一次補間とも呼ばれ、補間される値に最も近い 2*2=4 つの既知の値に基づいて補間される値を計算します。各既知の値の重みは、補間される値からの距離によって決まります。補間される値であり、重みに近いほど重みは大きくなります。バイリニア補間とは、下図に示すように、2方向に合計3回の単一線形補間を計算することです。図中の赤い点が元の画像の既知のピクセル値を持つピクセル点を表し、そのピクセル値が既知であると仮定します。座標は point、Q_{11}:(x_{1},y_{1})point Q_{12}:(x_{1},y_{2})、Point Q_{21}:(x_{2},y_{1})、pointQ_{22}:(x_{2},y_{2})です。これら 4 つの赤い点のピクセル値はそれぞれ次のように表されますf(Q_{ij})。ここで、i,j=1,2補間される緑の点の座標は ですP:(x,y)。ピクセル値を見つけるには、双線形補間法を使用する必要があります。補間される点 P の値。

計算プロセスは次のとおりです。

1) x 軸方向に 2 つの単一線形補間を実行して、それぞれ青い点R_{1}合計R_{2}のピクセル値の合計を取得しますf(R_{1})f(R_{2})

f(R_{1})=\frac{x_{2}-x}{x_{2}-x_{1}}f(Q_{11})+\frac{x-x_{1}}{x_{ 2}-x_{1}}f(Q_{21})

f(R_{2})=\frac{x_{2}-x}{x_{2}-x_{1}}f(Q_{12})+\frac{x-x_{1}}{x_{ 2}-x_{1}}f(Q_{22})

1) y 軸方向に単一の線形補間を実行して、点f(P)Pのピクセル値を取得します。

f(P)=\frac{y_{2}-y}{y_{2}-y_{1}}f(R_{1})+\frac{y-y_{1}}{y_{2}- y_{1}}f(R_{2})

1.2 align_cornersパラメータの説明

        次のコード実行結果に示すように、align_corners パラメーターは True と False に設定されており、アップサンプリングの結果は異なります。

import torch

input = torch.arange(1, 10, dtype=torch.float32).view(1, 1, 3, 3)
print(input)
m = torch.nn.Upsample(scale_factor=2, mode='bilinear')
output1 = m(input)
print(output1)
n = torch.nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True)
output2 = n(input)
print(output2)

アップサンプリング結果が異なる主な理由は、ピクセルの見方が異なることです。

①中心揃え: ピクセルを面積のある正方形と考え、正方形の中心点の位置がピクセルを表します。align_corners=False はピクセルをこのように扱います。ピクセルの座標は画像行列に対応する添え字ではありませんが、このときの座標系の各ピクセルの座標になるように添え字を追加する必要があります (左上のi,j0.5原点、x 軸は右が正、y 軸は下が正です)

②コーナー揃え: ピクセルを理想的な点として考え、この点の位置がこのピクセルを表します。align_corners=True はピクセルをこのように扱い、マトリックス内の各ピクセルの添字を直接座標系の座標点とみなし計算します i,j

        この 2 つのケースについて、アップサンプリング後の結果はどのように計算されるのでしょうか? 誰にでも理解できるようにどのように表現したらよいかわかりません。誰でも理解できると思います。理解に役立ついくつかの図を示します。

2. プーリング防止

        アンプーリングはプーリングの逆の操作であり、プーリング結果から元のデータをすべて復元することは不可能であるため、現在では画像のアップサンプリングを実現するためにこの方法が使用されることはほとんどありません。プーリングプロセスでは主要な情報のみが保持され、情報の一部が破棄されるためです。プール後の主要な情報からすべての情報を復元したい場合、欠落した情報が発生するため、この時点で情報の完全性を最大限に達成するには、ビットを埋めるしかありません。プーリングには最大プーリングと平均プーリングの2種類があり、アンチプーリングもそれに対応する必要があります。

2.1 平均プーリングと反平均プーリング

        まず元のサイズに戻してから、プーリング結果の各値を、対応する元のデータ領域の対応する位置に埋め込みます。平均プーリングと反平均プーリングのプロセスは次のとおりです。

2.2 最大プーリングと反最大プーリング

        プーリング処理中の最大活性値の位置の座標値を記録し、アンプーリング時にプーリング処理中の最大活性値の位置の座標値のみを活性化し、その他の値を0に設定する必要があります。もちろん、このプロセスは単なる概算です。プーリング処理において、最大値の位置を除いて、他の値は0ではないためです。
最大プーリングとアンチ最大プーリングのプロセスは次のとおりです。 

3. 転置コンボリューション(デコンボリューション)

        デコンボリューションを利用して画像アップサンプリングを実現する具体的な実装原理について、torch.nn.ConvTranspose2d()関数を例に詳しく説明しますが、この関数のパラメータの意味は基本的にtorchと同じです。 nn.Conv2d() 関数。

torch.nn.ConvTranspose2d(in_channels, out_channels, kernel_size, stride=1, padding=0, output_padding=0, groups=1, bias=True, dilation=1, padding_mode='zeros', device=None, dtype=None)
参数说明:
in_channels:输入的通道数
out_channels:输出的通道数
kernel_size:卷积核的大小
stride:卷积核滑动的步长,默认是1
padding:怎么填充输入图像,此参数的类型可以是int , tuple或str , optional 。默认padding=0,即不填充。
dilation:设置膨胀率,即核内元素间距,默认是1。即如果kernel_size=3,dilation=1,那么卷积核大小就是3×3;如果kernel_size=3,dilation=2,那么卷积核大小为5×5
groups:通过设置这个参数来决定分几组进行卷积,默认是1,即默认是普通卷积,此时卷积核通道数=输入通道数
bias:是否添加偏差,默认true
padding_mode:填充时,此参数决定用什么值来填充,默认是'zeros',即用0填充,可选参数有'zeros', 'reflect', 'replicate'或'circular'
 

        デコンボリューションは、転置畳み込みや分数ステップ畳み込みとも呼ばれます。実際、この関数の最も正確な名前は転置畳み込みです。その理由は、畳み込みと転置畳み込みの基礎となるコード実装に関連しています。

        これを説明する前に、コード実装プロセスにおける通常の畳み込みの特定の操作を見てみる必要があります。通常の畳み込みでは、多数の乗算と加算の演算を実装する必要がありますが、この乗算と加算の方法が行列乗算の得意分野です。コードが実装されるとき、畳み込み演算は通常、行列の乗算を利用して迅速に実装されますが、これはどのように行われるのでしょうか? 入力画像のサイズが 4 × 4、コンボリューション カーネルが 3 × 3、パディング = 0、ストライド = 1 であるとすると、計算を通じて、コンボリューション後の出力画像のサイズが 2 × 2 であることがわかります。次の図で:

コード実装における従来の畳み込みの具体的なプロセスは、まず入力画像を表す 4 × 4 行列を 16 × 1 列ベクトルに変換し、計算により出力画像が 2 × 2 行列であることが示されるため、これも次のように変換されます。 4 × 2 行列 1 列ベクトルの場合、行列の乗算からパラメーター行列は 4 × 16 でなければならないことがわかります。では、この 4 × 16 パラメーター行列はどのようにして得られるのでしょうか。上の図から明らかなように、4 は、コンボリューション カーネル ウィンドウが入力画像全体を横断するために 4 回スライドすることを意味します。この 16 は、最初に 3×3 の 9 つの重みを 1 行にまとめてから、次に従って入力画像上をスライドすることを意味します。ウィンドウに表示されます。位置に 7 つの 0 が追加されて 16 個のパラメータが形成されます。これらの 16 個のパラメータは、入力画像の 16 ピクセルに対応する重みパラメータです。つまり、次のようになります。

K_{4\times16}\times I_{16\times1 }=O_{4\times1}

4×1 ベクトル変形を出力して、出力イメージの 2×2 行列を表します。次の図は、従来の畳み込みの行列乗算の例です。

        次に、転置畳み込みがコードでどのように実装されるかを見てみましょう。転置畳み込みはアップサンプリング手法であり、入力画像のサイズは比較的小さく、転置畳み込み後にはより大きな画像が出力されます。次の図に示すように、入力イメージのサイズが 2 × 2、コンボリューション カーネルが 3 × 3、パディング = 0、ストライド = 1 であると仮定します。転置コンボリューションによって 4 × 4 の出力画像が得られます。

コード実装における転置畳み込みの具体的なプロセスは次のとおりです。まず、入力画像を表す 2 × 2 行列を 4 × 1 列ベクトルに変換します。転置畳み込み後の出力画像は 4 × 4 行列であるため、これも 4 × 4 行列に変換されます。 16×1 列ベクトルの場合、行列の乗算からパラメータ行列は 16×4 でなければならないことがわかります。では、この 16×4 パラメータ行列はどのようにして得られるのでしょうか? 上の図から明らかなように、16 は入力画像全体を横断するためにコンボリューション カーネル ウィンドウが 16 回スライドされたことを意味します。ここでのコンボリューション カーネルには 9 つの重みがありますが、画像に乗算できるのは最大でも 4 つだけです (つまり、コンボリューション カーネルが中央にある場合、これはパラメーター マトリックスの 4 の意味です。つまり、次のようになります。

K_{16\times4}\times I_{4\times1 }=O_{16\times1}

 16×1 ベクトル変形を出力して、出力イメージの 4×4 行列を表します。次の図は、転置畳み込みのための行列乗算の例です。        

        従来の畳み込みと転置畳み込みのコード実装プロセスを通じて、これら 2 つの畳み込み演算で使用される畳み込み行列が、まさに転置畳み込みの起源である形状の転置の関係であることを見つけるのはK_{4\×16}難しくありませんK_{16\× 4}ここで述べているのは形状であり、具体的な値は異なる必要があることに注意してください。 

おすすめ

転載: blog.csdn.net/Mike_honor/article/details/126538091