キックバック&リラックス:SlowTVを見て世界を再構築する方法を学ぶ

参考コード:slowtv_mono Depth

この記事では、未校正のデータセットに対する自己教師あり深度推定方法を提案します。これは、ネットワーク予測を通じてカメラの内部パラメータを推定し、それによって自己教師ありプロセスを完了するものです。カメラのキャリブレーションを行わずに自己監視型深度推定を検証するために、いくつかのビデオをインターネットからダウンロードして SlowTV データセットを構築しました。また、任意の画像を使用した画像のデータ拡張など、いくつかのトリックも深度自己監視プロセスに追加されました。アスペクト比。

損失関数:
ここでの損失関数は、MonoDepth2 の損失関数に似ています。測光再構成誤差は依然として古い式です:
L ph ( I , I ' ) = λ 1 − L ssim ( I , I ' ) 2 + ( 1 − λ ) LI ( I , I ' ) L_{ph}(I,I^{'})=\lambda\frac{1-L_{ssim}(I,I^{'})}{2}+( 1-\ ラムダ)L_I(I,I^{'})Lph _( _=21Lはい、私は( _+( 1l ) L(' )
移動するターゲットの処理では、前方フレームと後方フレームの最小再構成誤差と自動マスク メカニズムを使用して軽減します (根本的に除去することはできません)。 L rec = ∑ p min ⁡
k L ph ( I k , I t + k ' ) L_{rec}=\sum_p\min_kL_{ph}(I_k,I^{'}_{t+k})L録音=pkLph _(t + k)
ここで、t + k t+kt+kは前後のフレームのインデックス値です。自動マスクは前の論文と一致しています (理論的には、再構成後の誤差はフレーム間誤差よりも小さいはずです):
M = [ min ⁡ k L ph ( I k , I t + k ' ) < min ⁡ k L ph ( I k , I t + k ) ] \mathcal{M}=[\min_kL_{ph}(I_k,I^{'}_{t+k})\lt \min_kL_{ph}(I_k,I_{t +k} )]M=[kLph _(t + k)<kLph _(t + k)]

カメラの内部パラメータ予測:
ネットワークによって収集されたビデオは、調整された内部パラメータ データを提供しないため (正確な内部パラメータを持つシーンには必要ありません)、ネットワークを使用して予測する必要があります。入力シーケンスに必要な予測は 1 つだけです。 (この部分の判定もコード内で行っています)、予測部分には全結合層予測を使用していますが、出力時の焦点距離と中心には異なる活性化関数を使用しており、ReLUと同様のSoftplus活性化関数を使用しています。曲線は焦点距離の予測に使用されます。

# src/networks/pose.py#L86
def _get_focal_dec(self, n_ch: int) -> nn.Sequential:
    """Return focal length estimation decoder. (b, c, h, w) -> (b, 2)"""
    return nn.Sequential(
        self.block(n_ch, n_ch, kernel_size=3, stride=1, padding=1),
        self.block(n_ch, n_ch, kernel_size=3, stride=1, padding=1),
        nn.Conv2d(n_ch, 2, kernel_size=1),  # (b, 2, h, w)
        nn.AdaptiveAvgPool2d((1, 1)),  # (b, 2, 1, 1)
        nn.Flatten(),  # (b, n)
        nn.Softplus(),
    )

中心にはシグモイド活性化関数を使用しますが、結局中心は 0.5 付近にあるため、勾配の飽和間隔の問題は発生しません。

# src/networks/pose.py#L97
def _get_offset_dec(self, n_ch: int) -> nn.Sequential:
    """Return principal point estimation decoder. (b, c, h, w) -> (b, 2)"""
    return nn.Sequential(
        self.block(n_ch, n_ch, kernel_size=3, stride=1, padding=1),
        self.block(n_ch, n_ch, kernel_size=3, stride=1, padding=1),
        nn.Conv2d(n_ch, 2, kernel_size=1),  # (b, 2, h, w)
        nn.AdaptiveAvgPool2d((1, 1)),  # (b, 2, 1, 1)
        nn.Flatten(),  # (b, n)
        nn.Sigmoid(),
    )

ランダム画像スケール:
画像のサイズが深度推定に影響することが MiDas アルゴリズムで検証されています。ネットワークをより堅牢にし、より強力なゼロサンプル汎化機能を持たせるために、ここでは画像が切り取られ、サイズが変更されます。トリミング時に画像の高さの[50%、100%] [50\%,100\%] をカバーします[ 50% 100% ]この範囲で、アスペクト比も 1:1、16:9 などのように変わります。

ネットワーク パフォーマンスに関する上記の変数のアブレーション実験:
ここに画像の説明を挿入します

自己教師あり深度推定のパフォーマンスに影響を与える要因:
以下の内容は、自己教師あり深度推定アルゴリズムにおけるバックボーン、損失関数などが自己教師あり深度に及ぼす影響を研究する、この記事と同じチームの研究によるものです。推定:

論文:Deconstructing Self-Supervised Monocular Reconstruction: The Design Decisions that Matter

バックボーンはネットワーク パフォーマンスに最も大きな影響を与えます。
ここに画像の説明を挿入します

深度推定値を平滑化すると、深度パフォーマンスの変動が小さくなります。
ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/m_buddy/article/details/132372909