私はこの論文の基本的なアーキテクチャを実装しています: https://arxiv.org/pdf/1705.08260.pdf in PyTorch.
オートエンコーダーと Spatial Transformer で構成されます。オートエンコーダの出力は、右画像とともにST またはいわばバイリニア サンプラーに入力され、このバイリニア補間の出力は、左画像とそれ自体の間の L1 損失の計算に使用されます。
しかし、問題があります。このコードが私が望むことをするとは思えません。PyTorch の grid_sample 関数の公式ドキュメントは、グリッドが -1 と 1 の範囲内になければならないという事実を参照していますが、グリッド自体は 1 より大きい最大値を持っています。このコードが正しい場合、グリッドが正規化されている行を書き直す必要があります。 ?
私が最初に考えたのは、次のように書き直すことでした。(grid / torch.max(grid) - 0.5) * 2
つまり、値が -1 から 1 の間にある場合、この範囲を超える値がないため、padding_mode 引数を削除する必要があります。
これが正しい場合はお知らせください。これが正しい道であることを確認できます。
def bilinear_sampler(images, disps):
N, C, H, W = images.size()
mesh_x, mesh_y = np.array(np.meshgrid(np.linspace(0, 1, W),
np.linspace(0, 1, H),
indexing='xy'))
mesh_x, mesh_y = torch.from_numpy(mesh_x).cuda(), torch.from_numpy(mesh_y).cuda()
mesh_x = mesh_x.repeat(N, 1, 1).type_as(images)
mesh_y = mesh_y.repeat(N, 1, 1).type_as(images)
grid = torch.stack((mesh_x + disps.squeeze(), mesh_y), 3)
output = F.grid_sample(images, grid * 2 - 1, mode='bilinear',
padding_mode='zeros', align_corners=False)
return output