0

私はこの論文の基本的なアーキテクチャを実装しています: 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
4

0 に答える 0