Initial commit

This commit is contained in:
Lihe Yang
2024-06-14 03:44:54 +08:00
committed by GitHub
parent a0c63fccc6
commit 2cbc36a8ce
73 changed files with 91693 additions and 2 deletions

51
DA-2K.md Normal file
View File

@@ -0,0 +1,51 @@
# DA-2K Evaluation Benchmark
## Introduction
![DA-2K](assets/DA-2K.png)
DA-2K is proposed in [Depth Anything V2](https://depth-anything-v2.github.io) to evaluate the relative depth estimation capability. It encompasses eight representative scenarios of `indoor`, `outdoor`, `non_real`, `transparent_reflective`, `adverse_style`, `aerial`, `underwater`, and `object`. It consists of 1K diverse high-quality images and 2K precise pair-wise relative depth annotations.
Please refer to our [paper](https://depth-anything-v2.github.io) for details in constructing this benchmark.
## Usage
Please first [download the benchmark]().
All annotations are stored in [annotations.json](./annotations.json). The annotation file is a JSON object where each key is the path to an image file, and the value is a list of annotations associated with that image. Each annotation describes two points and identifies which point is closer to the camera. The structure is detailed below:
```
{
"image_path": [
{
"point1": [h1, w1], # (vertical position, horizontal position)
"point2": [h2, w2], # (vertical position, horizontal position)
"closer_point": "point1" # we always set "point1" as the closer one
},
...
],
...
}
```
To visualize the annotations:
```bash
python visualize.py [--scene-type <type>]
```
**Options**
- `--scene-type <type>` (optional): Specify the scene type (`indoor`, `outdoor`, `non_real`, `transparent_reflective`, `adverse_style`, `aerial`, `underwater`, and `object`). Skip this argument or set <type> as `""` to include all scene types.
## Citation
If you find this benchmark useful, please consider citing:
```bibtex
@article{depth_anything_v2,
title={Depth Anything V2},
author={Yang, Lihe and Kang, Bingyi and Huang, Zilong and Zhao, Zhen and Xu, Xiaogang and Feng, Jiashi and Zhao, Hengshuang},
journal={arXiv preprint arXiv:},
year={2024}
}
```

127
README.md
View File

@@ -1,2 +1,125 @@
# Depth-Anything-V2
Depth Anything V2. A More Capable Foundation Model for Monocular Depth Estimation
<div align="center">
<h1>Depth Anything V2</h1>
[**Lihe Yang**](https://liheyoung.github.io/)<sup>1</sup> · [**Bingyi Kang**](https://bingykang.github.io/)<sup>2&dagger;</sup> · [**Zilong Huang**](http://speedinghzl.github.io/)<sup>2</sup>
<br>
[**Zhen Zhao**](http://zhaozhen.me/) · [**Xiaogang Xu**](https://xiaogang00.github.io/) · [**Jiashi Feng**](https://sites.google.com/site/jshfeng/)<sup>2</sup> · [**Hengshuang Zhao**](https://hszhao.github.io/)<sup>1*</sup>
<sup>1</sup>HKU&emsp;&emsp;&emsp;<sup>2</sup>TikTok
<br>
&dagger;project lead&emsp;*corresponding author
<a href=""><img src='https://img.shields.io/badge/arXiv-Depth Anything V2-red' alt='Paper PDF'></a>
<a href='https://depth-anything-v2.github.io'><img src='https://img.shields.io/badge/Project_Page-Depth Anything V2-green' alt='Project Page'></a>
<a href='https://huggingface.co/spaces/depth-anything/Depth-Anything-V2'><img src='https://img.shields.io/badge/%F0%9F%A4%97%20Hugging%20Face-Spaces-blue'></a>
<a href='https://huggingface.co/datasets/depth-anything/DA-2K'><img src='https://img.shields.io/badge/Benchmark-DA--2K-green' alt='Benchmark'></a>
</div>
This work presents Depth Anything V2. Compared with V1, this version produces significantly more fine-grained and robust depth predictions. Compared with SD-based models, it is much more efficient and lightweight.
![teaser](assets/teaser.png)
## News
- **2024-06-14:** Paper, project page, code, models, demo, and benchmark are all released.
## Pre-trained Models
We provide **four models** of varying scales for robust relative depth estimation:
| Model | Params | Checkpoint |
|:-|-:|:-:|
| Depth-Anything-V2-Small | 24.8M | [Download](https://huggingface.co/depth-anything/Depth-Anything-V2-Small/resolve/main/depth_anything_v2_vits.pth?download=true) |
| Depth-Anything-V2-Base | 97.5M | [Download](https://huggingface.co/depth-anything/Depth-Anything-V2-Base/resolve/main/depth_anything_v2_vitb.pth?download=true) |
| Depth-Anything-V2-Large | 335.3M | [Download](https://huggingface.co/depth-anything/Depth-Anything-V2-Large/resolve/main/depth_anything_v2_vitl.pth?download=true) |
| Depth-Anything-V2-Giant | 1.3B | [Download](https://huggingface.co/depth-anything/Depth-Anything-V2-Giant/resolve/main/depth_anything_v2_vitg.pth?download=true) |
### Code snippet to use our models
```python
import cv2
import torch
from depth_anything_v2.dpt import DepthAnythingV2
# take depth-anything-v2-giant as an example
model = DepthAnythingV2(encoder='vitg', features=384, out_channels=[1536, 1536, 1536, 1536])
model.load_state_dict(torch.load('checkpoints/depth_anything_v2_vitg.pth', map_location='cpu'))
model.eval()
raw_img = cv2.imread('your/image/path')
depth = model.infer_img(raw_img) # HxW raw depth map
```
## Usage
### Installation
```bash
git clone https://github.com/DepthAnything/Depth-Anything-V2
cd Depth-Anything-V2
pip install -r requirements.txt
```
### Running
```bash
python run.py --encoder <vits | vitb | vitl | vitg> --img-path <path> --outdir <outdir> [--input-size <size>] [--pred-only] [--grayscale]
```
Options:
- `--img-path`: You can either 1) point it to an image directory storing all interested images, 2) point it to a single image, or 3) point it to a text file storing all image paths.
- `--input-size` (optional): By default, we use input size `518` for model inference. **You can increase the size for even more fine-grained results.**
- `--pred-only` (optional): Only save the predicted depth map, without raw image.
- `--grayscale` (optional): Save the grayscale depth map, without applying color palette.
For example:
```bash
python run.py --encoder vitg --img-path assets/examples --outdir depth_vis
```
**If you want to use Depth Anything V2 on videos:**
```bash
python run_video.py --encoder vitg --video-path assets/examples_video --outdir video_depth_vis
```
*Please note that our larger model has better temporal consistency on videos.*
### Gradio demo
To use our gradio demo locally:
```bash
python app.py
```
You can also try our [online demo](https://huggingface.co/spaces/Depth-Anything/Depth-Anything-V2).
**Note:** Compared to V1, we have made a minor modification to the DINOv2-DPT architecture (originating from this [issue](https://github.com/LiheYoung/Depth-Anything/issues/81)). In V1, we *unintentionally* used features from the last four layers of DINOv2 for decoding. In V2, we use intermediate features instead. Although this modification did not improve details or accuracy, we decided to follow this common practice.
## Fine-tuned to Metric Depth Estimation
Please refer to [metric depth estimation](./metric_depth).
## DA-2K Evaluation Benchmark
Please refer to [DA-2K benchmark](./DA-2K.md).
## Citation
If you find this project useful, please consider citing:
```bibtex
@article{depth_anything_v2,
title={Depth Anything V2},
author={Yang, Lihe and Kang, Bingyi and Huang, Zilong and Zhao, Zhen and Xu, Xiaogang and Feng, Jiashi and Zhao, Hengshuang},
journal={arXiv preprint arXiv:},
year={2024}
}
```

88
app.py Normal file
View File

@@ -0,0 +1,88 @@
import glob
import gradio as gr
import matplotlib
import numpy as np
from PIL import Image
import torch
import tempfile
from gradio_imageslider import ImageSlider
from depth_anything_v2.dpt import DepthAnythingV2
css = """
#img-display-container {
max-height: 100vh;
}
#img-display-input {
max-height: 80vh;
}
#img-display-output {
max-height: 80vh;
}
#download {
height: 62px;
}
"""
DEVICE = 'cuda' if torch.cuda.is_available() else 'mps' if torch.backends.mps.is_available() else 'cpu'
model_configs = {
'vits': {'encoder': 'vits', 'features': 64, 'out_channels': [48, 96, 192, 384]},
'vitb': {'encoder': 'vitb', 'features': 128, 'out_channels': [96, 192, 384, 768]},
'vitl': {'encoder': 'vitl', 'features': 256, 'out_channels': [256, 512, 1024, 1024]},
'vitg': {'encoder': 'vitg', 'features': 384, 'out_channels': [1536, 1536, 1536, 1536]}
}
encoder = 'vitl'
model = DepthAnythingV2(**model_configs[encoder])
state_dict = torch.load(f'checkpoints/depth_anything_v2_{encoder}.pth', map_location="cpu")
model.load_state_dict(state_dict)
model = model.to(DEVICE).eval()
title = "# Depth Anything V2"
description = """Official demo for **Depth Anything V2**.
Please refer to our [paper](), [project page](https://depth-anything-v2.github.io), or [github](https://github.com/DepthAnything/Depth-Anything-V2) for more details."""
def predict_depth(image):
return model.infer_image(image)
with gr.Blocks(css=css) as demo:
gr.Markdown(title)
gr.Markdown(description)
gr.Markdown("### Depth Prediction demo")
with gr.Row():
input_image = gr.Image(label="Input Image", type='numpy', elem_id='img-display-input')
depth_image_slider = ImageSlider(label="Depth Map with Slider View", elem_id='img-display-output', position=0.5)
submit = gr.Button(value="Compute Depth")
gray_depth_file = gr.File(label="Grayscale depth map", elem_id="download",)
raw_file = gr.File(label="16-bit raw output (can be considered as disparity)", elem_id="download",)
cmap = matplotlib.colormaps.get_cmap('Spectral_r')
def on_submit(image):
original_image = image.copy()
h, w = image.shape[:2]
depth = predict_depth(image[:, :, ::-1])
raw_depth = Image.fromarray(depth.astype('uint16'))
tmp_raw_depth = tempfile.NamedTemporaryFile(suffix='.png', delete=False)
raw_depth.save(tmp_raw_depth.name)
depth = (depth - depth.min()) / (depth.max() - depth.min()) * 255.0
depth = depth.astype(np.uint8)
colored_depth = (cmap(depth)[:, :, :3] * 255).astype(np.uint8)
gray_depth = Image.fromarray(depth)
tmp_gray_depth = tempfile.NamedTemporaryFile(suffix='.png', delete=False)
gray_depth.save(tmp_gray_depth.name)
return [(original_image, colored_depth), tmp_gray_depth.name, tmp_raw_depth.name]
submit.click(on_submit, inputs=[input_image], outputs=[depth_image_slider, gray_depth_file, raw_file])
example_files = glob.glob('assets/examples/*')
examples = gr.Examples(examples=example_files, inputs=[input_image], outputs=[depth_image_slider, gray_depth_file, raw_file], fn=on_submit)
if __name__ == '__main__':
demo.queue().launch()

BIN
assets/DA-2K.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

BIN
assets/examples/demo01.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 477 KiB

BIN
assets/examples/demo02.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 499 KiB

BIN
assets/examples/demo03.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 454 KiB

BIN
assets/examples/demo04.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 293 KiB

BIN
assets/examples/demo05.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 KiB

BIN
assets/examples/demo06.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 764 KiB

BIN
assets/examples/demo07.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 391 KiB

BIN
assets/examples/demo08.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

BIN
assets/examples/demo09.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 401 KiB

BIN
assets/examples/demo10.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 475 KiB

BIN
assets/examples/demo11.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 238 KiB

BIN
assets/examples/demo12.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 KiB

BIN
assets/examples/demo13.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 411 KiB

BIN
assets/examples/demo14.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 628 KiB

BIN
assets/examples/demo15.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 751 KiB

BIN
assets/examples/demo16.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 369 KiB

BIN
assets/examples/demo17.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

BIN
assets/examples/demo18.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

BIN
assets/examples/demo19.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 981 KiB

BIN
assets/examples/demo20.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 KiB

Binary file not shown.

Binary file not shown.

BIN
assets/teaser.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 MiB

415
depth_anything_v2/dinov2.py Normal file
View File

@@ -0,0 +1,415 @@
# Copyright (c) Meta Platforms, Inc. and affiliates.
#
# This source code is licensed under the Apache License, Version 2.0
# found in the LICENSE file in the root directory of this source tree.
# References:
# https://github.com/facebookresearch/dino/blob/main/vision_transformer.py
# https://github.com/rwightman/pytorch-image-models/tree/master/timm/models/vision_transformer.py
from functools import partial
import math
import logging
from typing import Sequence, Tuple, Union, Callable
import torch
import torch.nn as nn
import torch.utils.checkpoint
from torch.nn.init import trunc_normal_
from .dinov2_layers import Mlp, PatchEmbed, SwiGLUFFNFused, MemEffAttention, NestedTensorBlock as Block
logger = logging.getLogger("dinov2")
def named_apply(fn: Callable, module: nn.Module, name="", depth_first=True, include_root=False) -> nn.Module:
if not depth_first and include_root:
fn(module=module, name=name)
for child_name, child_module in module.named_children():
child_name = ".".join((name, child_name)) if name else child_name
named_apply(fn=fn, module=child_module, name=child_name, depth_first=depth_first, include_root=True)
if depth_first and include_root:
fn(module=module, name=name)
return module
class BlockChunk(nn.ModuleList):
def forward(self, x):
for b in self:
x = b(x)
return x
class DinoVisionTransformer(nn.Module):
def __init__(
self,
img_size=224,
patch_size=16,
in_chans=3,
embed_dim=768,
depth=12,
num_heads=12,
mlp_ratio=4.0,
qkv_bias=True,
ffn_bias=True,
proj_bias=True,
drop_path_rate=0.0,
drop_path_uniform=False,
init_values=None, # for layerscale: None or 0 => no layerscale
embed_layer=PatchEmbed,
act_layer=nn.GELU,
block_fn=Block,
ffn_layer="mlp",
block_chunks=1,
num_register_tokens=0,
interpolate_antialias=False,
interpolate_offset=0.1,
):
"""
Args:
img_size (int, tuple): input image size
patch_size (int, tuple): patch size
in_chans (int): number of input channels
embed_dim (int): embedding dimension
depth (int): depth of transformer
num_heads (int): number of attention heads
mlp_ratio (int): ratio of mlp hidden dim to embedding dim
qkv_bias (bool): enable bias for qkv if True
proj_bias (bool): enable bias for proj in attn if True
ffn_bias (bool): enable bias for ffn if True
drop_path_rate (float): stochastic depth rate
drop_path_uniform (bool): apply uniform drop rate across blocks
weight_init (str): weight init scheme
init_values (float): layer-scale init values
embed_layer (nn.Module): patch embedding layer
act_layer (nn.Module): MLP activation layer
block_fn (nn.Module): transformer block class
ffn_layer (str): "mlp", "swiglu", "swiglufused" or "identity"
block_chunks: (int) split block sequence into block_chunks units for FSDP wrap
num_register_tokens: (int) number of extra cls tokens (so-called "registers")
interpolate_antialias: (str) flag to apply anti-aliasing when interpolating positional embeddings
interpolate_offset: (float) work-around offset to apply when interpolating positional embeddings
"""
super().__init__()
norm_layer = partial(nn.LayerNorm, eps=1e-6)
self.num_features = self.embed_dim = embed_dim # num_features for consistency with other models
self.num_tokens = 1
self.n_blocks = depth
self.num_heads = num_heads
self.patch_size = patch_size
self.num_register_tokens = num_register_tokens
self.interpolate_antialias = interpolate_antialias
self.interpolate_offset = interpolate_offset
self.patch_embed = embed_layer(img_size=img_size, patch_size=patch_size, in_chans=in_chans, embed_dim=embed_dim)
num_patches = self.patch_embed.num_patches
self.cls_token = nn.Parameter(torch.zeros(1, 1, embed_dim))
self.pos_embed = nn.Parameter(torch.zeros(1, num_patches + self.num_tokens, embed_dim))
assert num_register_tokens >= 0
self.register_tokens = (
nn.Parameter(torch.zeros(1, num_register_tokens, embed_dim)) if num_register_tokens else None
)
if drop_path_uniform is True:
dpr = [drop_path_rate] * depth
else:
dpr = [x.item() for x in torch.linspace(0, drop_path_rate, depth)] # stochastic depth decay rule
if ffn_layer == "mlp":
logger.info("using MLP layer as FFN")
ffn_layer = Mlp
elif ffn_layer == "swiglufused" or ffn_layer == "swiglu":
logger.info("using SwiGLU layer as FFN")
ffn_layer = SwiGLUFFNFused
elif ffn_layer == "identity":
logger.info("using Identity layer as FFN")
def f(*args, **kwargs):
return nn.Identity()
ffn_layer = f
else:
raise NotImplementedError
blocks_list = [
block_fn(
dim=embed_dim,
num_heads=num_heads,
mlp_ratio=mlp_ratio,
qkv_bias=qkv_bias,
proj_bias=proj_bias,
ffn_bias=ffn_bias,
drop_path=dpr[i],
norm_layer=norm_layer,
act_layer=act_layer,
ffn_layer=ffn_layer,
init_values=init_values,
)
for i in range(depth)
]
if block_chunks > 0:
self.chunked_blocks = True
chunked_blocks = []
chunksize = depth // block_chunks
for i in range(0, depth, chunksize):
# this is to keep the block index consistent if we chunk the block list
chunked_blocks.append([nn.Identity()] * i + blocks_list[i : i + chunksize])
self.blocks = nn.ModuleList([BlockChunk(p) for p in chunked_blocks])
else:
self.chunked_blocks = False
self.blocks = nn.ModuleList(blocks_list)
self.norm = norm_layer(embed_dim)
self.head = nn.Identity()
self.mask_token = nn.Parameter(torch.zeros(1, embed_dim))
self.init_weights()
def init_weights(self):
trunc_normal_(self.pos_embed, std=0.02)
nn.init.normal_(self.cls_token, std=1e-6)
if self.register_tokens is not None:
nn.init.normal_(self.register_tokens, std=1e-6)
named_apply(init_weights_vit_timm, self)
def interpolate_pos_encoding(self, x, w, h):
previous_dtype = x.dtype
npatch = x.shape[1] - 1
N = self.pos_embed.shape[1] - 1
if npatch == N and w == h:
return self.pos_embed
pos_embed = self.pos_embed.float()
class_pos_embed = pos_embed[:, 0]
patch_pos_embed = pos_embed[:, 1:]
dim = x.shape[-1]
w0 = w // self.patch_size
h0 = h // self.patch_size
# we add a small number to avoid floating point error in the interpolation
# see discussion at https://github.com/facebookresearch/dino/issues/8
# DINOv2 with register modify the interpolate_offset from 0.1 to 0.0
w0, h0 = w0 + self.interpolate_offset, h0 + self.interpolate_offset
# w0, h0 = w0 + 0.1, h0 + 0.1
sqrt_N = math.sqrt(N)
sx, sy = float(w0) / sqrt_N, float(h0) / sqrt_N
patch_pos_embed = nn.functional.interpolate(
patch_pos_embed.reshape(1, int(sqrt_N), int(sqrt_N), dim).permute(0, 3, 1, 2),
scale_factor=(sx, sy),
# (int(w0), int(h0)), # to solve the upsampling shape issue
mode="bicubic",
antialias=self.interpolate_antialias
)
assert int(w0) == patch_pos_embed.shape[-2]
assert int(h0) == patch_pos_embed.shape[-1]
patch_pos_embed = patch_pos_embed.permute(0, 2, 3, 1).view(1, -1, dim)
return torch.cat((class_pos_embed.unsqueeze(0), patch_pos_embed), dim=1).to(previous_dtype)
def prepare_tokens_with_masks(self, x, masks=None):
B, nc, w, h = x.shape
x = self.patch_embed(x)
if masks is not None:
x = torch.where(masks.unsqueeze(-1), self.mask_token.to(x.dtype).unsqueeze(0), x)
x = torch.cat((self.cls_token.expand(x.shape[0], -1, -1), x), dim=1)
x = x + self.interpolate_pos_encoding(x, w, h)
if self.register_tokens is not None:
x = torch.cat(
(
x[:, :1],
self.register_tokens.expand(x.shape[0], -1, -1),
x[:, 1:],
),
dim=1,
)
return x
def forward_features_list(self, x_list, masks_list):
x = [self.prepare_tokens_with_masks(x, masks) for x, masks in zip(x_list, masks_list)]
for blk in self.blocks:
x = blk(x)
all_x = x
output = []
for x, masks in zip(all_x, masks_list):
x_norm = self.norm(x)
output.append(
{
"x_norm_clstoken": x_norm[:, 0],
"x_norm_regtokens": x_norm[:, 1 : self.num_register_tokens + 1],
"x_norm_patchtokens": x_norm[:, self.num_register_tokens + 1 :],
"x_prenorm": x,
"masks": masks,
}
)
return output
def forward_features(self, x, masks=None):
if isinstance(x, list):
return self.forward_features_list(x, masks)
x = self.prepare_tokens_with_masks(x, masks)
for blk in self.blocks:
x = blk(x)
x_norm = self.norm(x)
return {
"x_norm_clstoken": x_norm[:, 0],
"x_norm_regtokens": x_norm[:, 1 : self.num_register_tokens + 1],
"x_norm_patchtokens": x_norm[:, self.num_register_tokens + 1 :],
"x_prenorm": x,
"masks": masks,
}
def _get_intermediate_layers_not_chunked(self, x, n=1):
x = self.prepare_tokens_with_masks(x)
# If n is an int, take the n last blocks. If it's a list, take them
output, total_block_len = [], len(self.blocks)
blocks_to_take = range(total_block_len - n, total_block_len) if isinstance(n, int) else n
for i, blk in enumerate(self.blocks):
x = blk(x)
if i in blocks_to_take:
output.append(x)
assert len(output) == len(blocks_to_take), f"only {len(output)} / {len(blocks_to_take)} blocks found"
return output
def _get_intermediate_layers_chunked(self, x, n=1):
x = self.prepare_tokens_with_masks(x)
output, i, total_block_len = [], 0, len(self.blocks[-1])
# If n is an int, take the n last blocks. If it's a list, take them
blocks_to_take = range(total_block_len - n, total_block_len) if isinstance(n, int) else n
for block_chunk in self.blocks:
for blk in block_chunk[i:]: # Passing the nn.Identity()
x = blk(x)
if i in blocks_to_take:
output.append(x)
i += 1
assert len(output) == len(blocks_to_take), f"only {len(output)} / {len(blocks_to_take)} blocks found"
return output
def get_intermediate_layers(
self,
x: torch.Tensor,
n: Union[int, Sequence] = 1, # Layers or n last layers to take
reshape: bool = False,
return_class_token: bool = False,
norm=True
) -> Tuple[Union[torch.Tensor, Tuple[torch.Tensor]]]:
if self.chunked_blocks:
outputs = self._get_intermediate_layers_chunked(x, n)
else:
outputs = self._get_intermediate_layers_not_chunked(x, n)
if norm:
outputs = [self.norm(out) for out in outputs]
class_tokens = [out[:, 0] for out in outputs]
outputs = [out[:, 1 + self.num_register_tokens:] for out in outputs]
if reshape:
B, _, w, h = x.shape
outputs = [
out.reshape(B, w // self.patch_size, h // self.patch_size, -1).permute(0, 3, 1, 2).contiguous()
for out in outputs
]
if return_class_token:
return tuple(zip(outputs, class_tokens))
return tuple(outputs)
def forward(self, *args, is_training=False, **kwargs):
ret = self.forward_features(*args, **kwargs)
if is_training:
return ret
else:
return self.head(ret["x_norm_clstoken"])
def init_weights_vit_timm(module: nn.Module, name: str = ""):
"""ViT weight initialization, original timm impl (for reproducibility)"""
if isinstance(module, nn.Linear):
trunc_normal_(module.weight, std=0.02)
if module.bias is not None:
nn.init.zeros_(module.bias)
def vit_small(patch_size=16, num_register_tokens=0, **kwargs):
model = DinoVisionTransformer(
patch_size=patch_size,
embed_dim=384,
depth=12,
num_heads=6,
mlp_ratio=4,
block_fn=partial(Block, attn_class=MemEffAttention),
num_register_tokens=num_register_tokens,
**kwargs,
)
return model
def vit_base(patch_size=16, num_register_tokens=0, **kwargs):
model = DinoVisionTransformer(
patch_size=patch_size,
embed_dim=768,
depth=12,
num_heads=12,
mlp_ratio=4,
block_fn=partial(Block, attn_class=MemEffAttention),
num_register_tokens=num_register_tokens,
**kwargs,
)
return model
def vit_large(patch_size=16, num_register_tokens=0, **kwargs):
model = DinoVisionTransformer(
patch_size=patch_size,
embed_dim=1024,
depth=24,
num_heads=16,
mlp_ratio=4,
block_fn=partial(Block, attn_class=MemEffAttention),
num_register_tokens=num_register_tokens,
**kwargs,
)
return model
def vit_giant2(patch_size=16, num_register_tokens=0, **kwargs):
"""
Close to ViT-giant, with embed-dim 1536 and 24 heads => embed-dim per head 64
"""
model = DinoVisionTransformer(
patch_size=patch_size,
embed_dim=1536,
depth=40,
num_heads=24,
mlp_ratio=4,
block_fn=partial(Block, attn_class=MemEffAttention),
num_register_tokens=num_register_tokens,
**kwargs,
)
return model
def DINOv2(model_name):
model_zoo = {
"vits": vit_small,
"vitb": vit_base,
"vitl": vit_large,
"vitg": vit_giant2
}
return model_zoo[model_name](
img_size=518,
patch_size=14,
init_values=1.0,
ffn_layer="mlp" if model_name != "vitg" else "swiglufused",
block_chunks=0,
num_register_tokens=0,
interpolate_antialias=False,
interpolate_offset=0.1
)

View File

@@ -0,0 +1,11 @@
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
from .mlp import Mlp
from .patch_embed import PatchEmbed
from .swiglu_ffn import SwiGLUFFN, SwiGLUFFNFused
from .block import NestedTensorBlock
from .attention import MemEffAttention

View File

@@ -0,0 +1,83 @@
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
# References:
# https://github.com/facebookresearch/dino/blob/master/vision_transformer.py
# https://github.com/rwightman/pytorch-image-models/tree/master/timm/models/vision_transformer.py
import logging
from torch import Tensor
from torch import nn
logger = logging.getLogger("dinov2")
try:
from xformers.ops import memory_efficient_attention, unbind, fmha
XFORMERS_AVAILABLE = True
except ImportError:
logger.warning("xFormers not available")
XFORMERS_AVAILABLE = False
class Attention(nn.Module):
def __init__(
self,
dim: int,
num_heads: int = 8,
qkv_bias: bool = False,
proj_bias: bool = True,
attn_drop: float = 0.0,
proj_drop: float = 0.0,
) -> None:
super().__init__()
self.num_heads = num_heads
head_dim = dim // num_heads
self.scale = head_dim**-0.5
self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias)
self.attn_drop = nn.Dropout(attn_drop)
self.proj = nn.Linear(dim, dim, bias=proj_bias)
self.proj_drop = nn.Dropout(proj_drop)
def forward(self, x: Tensor) -> Tensor:
B, N, C = x.shape
qkv = self.qkv(x).reshape(B, N, 3, self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4)
q, k, v = qkv[0] * self.scale, qkv[1], qkv[2]
attn = q @ k.transpose(-2, -1)
attn = attn.softmax(dim=-1)
attn = self.attn_drop(attn)
x = (attn @ v).transpose(1, 2).reshape(B, N, C)
x = self.proj(x)
x = self.proj_drop(x)
return x
class MemEffAttention(Attention):
def forward(self, x: Tensor, attn_bias=None) -> Tensor:
if not XFORMERS_AVAILABLE:
assert attn_bias is None, "xFormers is required for nested tensors usage"
return super().forward(x)
B, N, C = x.shape
qkv = self.qkv(x).reshape(B, N, 3, self.num_heads, C // self.num_heads)
q, k, v = unbind(qkv, 2)
x = memory_efficient_attention(q, k, v, attn_bias=attn_bias)
x = x.reshape([B, N, C])
x = self.proj(x)
x = self.proj_drop(x)
return x

View File

@@ -0,0 +1,252 @@
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
# References:
# https://github.com/facebookresearch/dino/blob/master/vision_transformer.py
# https://github.com/rwightman/pytorch-image-models/tree/master/timm/layers/patch_embed.py
import logging
from typing import Callable, List, Any, Tuple, Dict
import torch
from torch import nn, Tensor
from .attention import Attention, MemEffAttention
from .drop_path import DropPath
from .layer_scale import LayerScale
from .mlp import Mlp
logger = logging.getLogger("dinov2")
try:
from xformers.ops import fmha
from xformers.ops import scaled_index_add, index_select_cat
XFORMERS_AVAILABLE = True
except ImportError:
logger.warning("xFormers not available")
XFORMERS_AVAILABLE = False
class Block(nn.Module):
def __init__(
self,
dim: int,
num_heads: int,
mlp_ratio: float = 4.0,
qkv_bias: bool = False,
proj_bias: bool = True,
ffn_bias: bool = True,
drop: float = 0.0,
attn_drop: float = 0.0,
init_values=None,
drop_path: float = 0.0,
act_layer: Callable[..., nn.Module] = nn.GELU,
norm_layer: Callable[..., nn.Module] = nn.LayerNorm,
attn_class: Callable[..., nn.Module] = Attention,
ffn_layer: Callable[..., nn.Module] = Mlp,
) -> None:
super().__init__()
# print(f"biases: qkv: {qkv_bias}, proj: {proj_bias}, ffn: {ffn_bias}")
self.norm1 = norm_layer(dim)
self.attn = attn_class(
dim,
num_heads=num_heads,
qkv_bias=qkv_bias,
proj_bias=proj_bias,
attn_drop=attn_drop,
proj_drop=drop,
)
self.ls1 = LayerScale(dim, init_values=init_values) if init_values else nn.Identity()
self.drop_path1 = DropPath(drop_path) if drop_path > 0.0 else nn.Identity()
self.norm2 = norm_layer(dim)
mlp_hidden_dim = int(dim * mlp_ratio)
self.mlp = ffn_layer(
in_features=dim,
hidden_features=mlp_hidden_dim,
act_layer=act_layer,
drop=drop,
bias=ffn_bias,
)
self.ls2 = LayerScale(dim, init_values=init_values) if init_values else nn.Identity()
self.drop_path2 = DropPath(drop_path) if drop_path > 0.0 else nn.Identity()
self.sample_drop_ratio = drop_path
def forward(self, x: Tensor) -> Tensor:
def attn_residual_func(x: Tensor) -> Tensor:
return self.ls1(self.attn(self.norm1(x)))
def ffn_residual_func(x: Tensor) -> Tensor:
return self.ls2(self.mlp(self.norm2(x)))
if self.training and self.sample_drop_ratio > 0.1:
# the overhead is compensated only for a drop path rate larger than 0.1
x = drop_add_residual_stochastic_depth(
x,
residual_func=attn_residual_func,
sample_drop_ratio=self.sample_drop_ratio,
)
x = drop_add_residual_stochastic_depth(
x,
residual_func=ffn_residual_func,
sample_drop_ratio=self.sample_drop_ratio,
)
elif self.training and self.sample_drop_ratio > 0.0:
x = x + self.drop_path1(attn_residual_func(x))
x = x + self.drop_path1(ffn_residual_func(x)) # FIXME: drop_path2
else:
x = x + attn_residual_func(x)
x = x + ffn_residual_func(x)
return x
def drop_add_residual_stochastic_depth(
x: Tensor,
residual_func: Callable[[Tensor], Tensor],
sample_drop_ratio: float = 0.0,
) -> Tensor:
# 1) extract subset using permutation
b, n, d = x.shape
sample_subset_size = max(int(b * (1 - sample_drop_ratio)), 1)
brange = (torch.randperm(b, device=x.device))[:sample_subset_size]
x_subset = x[brange]
# 2) apply residual_func to get residual
residual = residual_func(x_subset)
x_flat = x.flatten(1)
residual = residual.flatten(1)
residual_scale_factor = b / sample_subset_size
# 3) add the residual
x_plus_residual = torch.index_add(x_flat, 0, brange, residual.to(dtype=x.dtype), alpha=residual_scale_factor)
return x_plus_residual.view_as(x)
def get_branges_scales(x, sample_drop_ratio=0.0):
b, n, d = x.shape
sample_subset_size = max(int(b * (1 - sample_drop_ratio)), 1)
brange = (torch.randperm(b, device=x.device))[:sample_subset_size]
residual_scale_factor = b / sample_subset_size
return brange, residual_scale_factor
def add_residual(x, brange, residual, residual_scale_factor, scaling_vector=None):
if scaling_vector is None:
x_flat = x.flatten(1)
residual = residual.flatten(1)
x_plus_residual = torch.index_add(x_flat, 0, brange, residual.to(dtype=x.dtype), alpha=residual_scale_factor)
else:
x_plus_residual = scaled_index_add(
x, brange, residual.to(dtype=x.dtype), scaling=scaling_vector, alpha=residual_scale_factor
)
return x_plus_residual
attn_bias_cache: Dict[Tuple, Any] = {}
def get_attn_bias_and_cat(x_list, branges=None):
"""
this will perform the index select, cat the tensors, and provide the attn_bias from cache
"""
batch_sizes = [b.shape[0] for b in branges] if branges is not None else [x.shape[0] for x in x_list]
all_shapes = tuple((b, x.shape[1]) for b, x in zip(batch_sizes, x_list))
if all_shapes not in attn_bias_cache.keys():
seqlens = []
for b, x in zip(batch_sizes, x_list):
for _ in range(b):
seqlens.append(x.shape[1])
attn_bias = fmha.BlockDiagonalMask.from_seqlens(seqlens)
attn_bias._batch_sizes = batch_sizes
attn_bias_cache[all_shapes] = attn_bias
if branges is not None:
cat_tensors = index_select_cat([x.flatten(1) for x in x_list], branges).view(1, -1, x_list[0].shape[-1])
else:
tensors_bs1 = tuple(x.reshape([1, -1, *x.shape[2:]]) for x in x_list)
cat_tensors = torch.cat(tensors_bs1, dim=1)
return attn_bias_cache[all_shapes], cat_tensors
def drop_add_residual_stochastic_depth_list(
x_list: List[Tensor],
residual_func: Callable[[Tensor, Any], Tensor],
sample_drop_ratio: float = 0.0,
scaling_vector=None,
) -> Tensor:
# 1) generate random set of indices for dropping samples in the batch
branges_scales = [get_branges_scales(x, sample_drop_ratio=sample_drop_ratio) for x in x_list]
branges = [s[0] for s in branges_scales]
residual_scale_factors = [s[1] for s in branges_scales]
# 2) get attention bias and index+concat the tensors
attn_bias, x_cat = get_attn_bias_and_cat(x_list, branges)
# 3) apply residual_func to get residual, and split the result
residual_list = attn_bias.split(residual_func(x_cat, attn_bias=attn_bias)) # type: ignore
outputs = []
for x, brange, residual, residual_scale_factor in zip(x_list, branges, residual_list, residual_scale_factors):
outputs.append(add_residual(x, brange, residual, residual_scale_factor, scaling_vector).view_as(x))
return outputs
class NestedTensorBlock(Block):
def forward_nested(self, x_list: List[Tensor]) -> List[Tensor]:
"""
x_list contains a list of tensors to nest together and run
"""
assert isinstance(self.attn, MemEffAttention)
if self.training and self.sample_drop_ratio > 0.0:
def attn_residual_func(x: Tensor, attn_bias=None) -> Tensor:
return self.attn(self.norm1(x), attn_bias=attn_bias)
def ffn_residual_func(x: Tensor, attn_bias=None) -> Tensor:
return self.mlp(self.norm2(x))
x_list = drop_add_residual_stochastic_depth_list(
x_list,
residual_func=attn_residual_func,
sample_drop_ratio=self.sample_drop_ratio,
scaling_vector=self.ls1.gamma if isinstance(self.ls1, LayerScale) else None,
)
x_list = drop_add_residual_stochastic_depth_list(
x_list,
residual_func=ffn_residual_func,
sample_drop_ratio=self.sample_drop_ratio,
scaling_vector=self.ls2.gamma if isinstance(self.ls1, LayerScale) else None,
)
return x_list
else:
def attn_residual_func(x: Tensor, attn_bias=None) -> Tensor:
return self.ls1(self.attn(self.norm1(x), attn_bias=attn_bias))
def ffn_residual_func(x: Tensor, attn_bias=None) -> Tensor:
return self.ls2(self.mlp(self.norm2(x)))
attn_bias, x = get_attn_bias_and_cat(x_list)
x = x + attn_residual_func(x, attn_bias=attn_bias)
x = x + ffn_residual_func(x)
return attn_bias.split(x)
def forward(self, x_or_x_list):
if isinstance(x_or_x_list, Tensor):
return super().forward(x_or_x_list)
elif isinstance(x_or_x_list, list):
assert XFORMERS_AVAILABLE, "Please install xFormers for nested tensors usage"
return self.forward_nested(x_or_x_list)
else:
raise AssertionError

View File

@@ -0,0 +1,35 @@
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
# References:
# https://github.com/facebookresearch/dino/blob/master/vision_transformer.py
# https://github.com/rwightman/pytorch-image-models/tree/master/timm/layers/drop.py
from torch import nn
def drop_path(x, drop_prob: float = 0.0, training: bool = False):
if drop_prob == 0.0 or not training:
return x
keep_prob = 1 - drop_prob
shape = (x.shape[0],) + (1,) * (x.ndim - 1) # work with diff dim tensors, not just 2D ConvNets
random_tensor = x.new_empty(shape).bernoulli_(keep_prob)
if keep_prob > 0.0:
random_tensor.div_(keep_prob)
output = x * random_tensor
return output
class DropPath(nn.Module):
"""Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks)."""
def __init__(self, drop_prob=None):
super(DropPath, self).__init__()
self.drop_prob = drop_prob
def forward(self, x):
return drop_path(x, self.drop_prob, self.training)

View File

@@ -0,0 +1,28 @@
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
# Modified from: https://github.com/huggingface/pytorch-image-models/blob/main/timm/models/vision_transformer.py#L103-L110
from typing import Union
import torch
from torch import Tensor
from torch import nn
class LayerScale(nn.Module):
def __init__(
self,
dim: int,
init_values: Union[float, Tensor] = 1e-5,
inplace: bool = False,
) -> None:
super().__init__()
self.inplace = inplace
self.gamma = nn.Parameter(init_values * torch.ones(dim))
def forward(self, x: Tensor) -> Tensor:
return x.mul_(self.gamma) if self.inplace else x * self.gamma

View File

@@ -0,0 +1,41 @@
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
# References:
# https://github.com/facebookresearch/dino/blob/master/vision_transformer.py
# https://github.com/rwightman/pytorch-image-models/tree/master/timm/layers/mlp.py
from typing import Callable, Optional
from torch import Tensor, nn
class Mlp(nn.Module):
def __init__(
self,
in_features: int,
hidden_features: Optional[int] = None,
out_features: Optional[int] = None,
act_layer: Callable[..., nn.Module] = nn.GELU,
drop: float = 0.0,
bias: bool = True,
) -> None:
super().__init__()
out_features = out_features or in_features
hidden_features = hidden_features or in_features
self.fc1 = nn.Linear(in_features, hidden_features, bias=bias)
self.act = act_layer()
self.fc2 = nn.Linear(hidden_features, out_features, bias=bias)
self.drop = nn.Dropout(drop)
def forward(self, x: Tensor) -> Tensor:
x = self.fc1(x)
x = self.act(x)
x = self.drop(x)
x = self.fc2(x)
x = self.drop(x)
return x

View File

@@ -0,0 +1,89 @@
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
# References:
# https://github.com/facebookresearch/dino/blob/master/vision_transformer.py
# https://github.com/rwightman/pytorch-image-models/tree/master/timm/layers/patch_embed.py
from typing import Callable, Optional, Tuple, Union
from torch import Tensor
import torch.nn as nn
def make_2tuple(x):
if isinstance(x, tuple):
assert len(x) == 2
return x
assert isinstance(x, int)
return (x, x)
class PatchEmbed(nn.Module):
"""
2D image to patch embedding: (B,C,H,W) -> (B,N,D)
Args:
img_size: Image size.
patch_size: Patch token size.
in_chans: Number of input image channels.
embed_dim: Number of linear projection output channels.
norm_layer: Normalization layer.
"""
def __init__(
self,
img_size: Union[int, Tuple[int, int]] = 224,
patch_size: Union[int, Tuple[int, int]] = 16,
in_chans: int = 3,
embed_dim: int = 768,
norm_layer: Optional[Callable] = None,
flatten_embedding: bool = True,
) -> None:
super().__init__()
image_HW = make_2tuple(img_size)
patch_HW = make_2tuple(patch_size)
patch_grid_size = (
image_HW[0] // patch_HW[0],
image_HW[1] // patch_HW[1],
)
self.img_size = image_HW
self.patch_size = patch_HW
self.patches_resolution = patch_grid_size
self.num_patches = patch_grid_size[0] * patch_grid_size[1]
self.in_chans = in_chans
self.embed_dim = embed_dim
self.flatten_embedding = flatten_embedding
self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_HW, stride=patch_HW)
self.norm = norm_layer(embed_dim) if norm_layer else nn.Identity()
def forward(self, x: Tensor) -> Tensor:
_, _, H, W = x.shape
patch_H, patch_W = self.patch_size
assert H % patch_H == 0, f"Input image height {H} is not a multiple of patch height {patch_H}"
assert W % patch_W == 0, f"Input image width {W} is not a multiple of patch width: {patch_W}"
x = self.proj(x) # B C H W
H, W = x.size(2), x.size(3)
x = x.flatten(2).transpose(1, 2) # B HW C
x = self.norm(x)
if not self.flatten_embedding:
x = x.reshape(-1, H, W, self.embed_dim) # B H W C
return x
def flops(self) -> float:
Ho, Wo = self.patches_resolution
flops = Ho * Wo * self.embed_dim * self.in_chans * (self.patch_size[0] * self.patch_size[1])
if self.norm is not None:
flops += Ho * Wo * self.embed_dim
return flops

View File

@@ -0,0 +1,63 @@
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
from typing import Callable, Optional
from torch import Tensor, nn
import torch.nn.functional as F
class SwiGLUFFN(nn.Module):
def __init__(
self,
in_features: int,
hidden_features: Optional[int] = None,
out_features: Optional[int] = None,
act_layer: Callable[..., nn.Module] = None,
drop: float = 0.0,
bias: bool = True,
) -> None:
super().__init__()
out_features = out_features or in_features
hidden_features = hidden_features or in_features
self.w12 = nn.Linear(in_features, 2 * hidden_features, bias=bias)
self.w3 = nn.Linear(hidden_features, out_features, bias=bias)
def forward(self, x: Tensor) -> Tensor:
x12 = self.w12(x)
x1, x2 = x12.chunk(2, dim=-1)
hidden = F.silu(x1) * x2
return self.w3(hidden)
try:
from xformers.ops import SwiGLU
XFORMERS_AVAILABLE = True
except ImportError:
SwiGLU = SwiGLUFFN
XFORMERS_AVAILABLE = False
class SwiGLUFFNFused(SwiGLU):
def __init__(
self,
in_features: int,
hidden_features: Optional[int] = None,
out_features: Optional[int] = None,
act_layer: Callable[..., nn.Module] = None,
drop: float = 0.0,
bias: bool = True,
) -> None:
out_features = out_features or in_features
hidden_features = hidden_features or in_features
hidden_features = (int(hidden_features * 2 / 3) + 7) // 8 * 8
super().__init__(
in_features=in_features,
hidden_features=hidden_features,
out_features=out_features,
bias=bias,
)

221
depth_anything_v2/dpt.py Normal file
View File

@@ -0,0 +1,221 @@
import cv2
import torch
import torch.nn as nn
import torch.nn.functional as F
from torchvision.transforms import Compose
from .dinov2 import DINOv2
from .util.blocks import FeatureFusionBlock, _make_scratch
from .util.transform import Resize, NormalizeImage, PrepareForNet
def _make_fusion_block(features, use_bn, size=None):
return FeatureFusionBlock(
features,
nn.ReLU(False),
deconv=False,
bn=use_bn,
expand=False,
align_corners=True,
size=size,
)
class ConvBlock(nn.Module):
def __init__(self, in_feature, out_feature):
super().__init__()
self.conv_block = nn.Sequential(
nn.Conv2d(in_feature, out_feature, kernel_size=3, stride=1, padding=1),
nn.BatchNorm2d(out_feature),
nn.ReLU(True)
)
def forward(self, x):
return self.conv_block(x)
class DPTHead(nn.Module):
def __init__(
self,
in_channels,
features=256,
use_bn=False,
out_channels=[256, 512, 1024, 1024],
use_clstoken=False
):
super(DPTHead, self).__init__()
self.use_clstoken = use_clstoken
self.projects = nn.ModuleList([
nn.Conv2d(
in_channels=in_channels,
out_channels=out_channel,
kernel_size=1,
stride=1,
padding=0,
) for out_channel in out_channels
])
self.resize_layers = nn.ModuleList([
nn.ConvTranspose2d(
in_channels=out_channels[0],
out_channels=out_channels[0],
kernel_size=4,
stride=4,
padding=0),
nn.ConvTranspose2d(
in_channels=out_channels[1],
out_channels=out_channels[1],
kernel_size=2,
stride=2,
padding=0),
nn.Identity(),
nn.Conv2d(
in_channels=out_channels[3],
out_channels=out_channels[3],
kernel_size=3,
stride=2,
padding=1)
])
if use_clstoken:
self.readout_projects = nn.ModuleList()
for _ in range(len(self.projects)):
self.readout_projects.append(
nn.Sequential(
nn.Linear(2 * in_channels, in_channels),
nn.GELU()))
self.scratch = _make_scratch(
out_channels,
features,
groups=1,
expand=False,
)
self.scratch.stem_transpose = None
self.scratch.refinenet1 = _make_fusion_block(features, use_bn)
self.scratch.refinenet2 = _make_fusion_block(features, use_bn)
self.scratch.refinenet3 = _make_fusion_block(features, use_bn)
self.scratch.refinenet4 = _make_fusion_block(features, use_bn)
head_features_1 = features
head_features_2 = 32
self.scratch.output_conv1 = nn.Conv2d(head_features_1, head_features_1 // 2, kernel_size=3, stride=1, padding=1)
self.scratch.output_conv2 = nn.Sequential(
nn.Conv2d(head_features_1 // 2, head_features_2, kernel_size=3, stride=1, padding=1),
nn.ReLU(True),
nn.Conv2d(head_features_2, 1, kernel_size=1, stride=1, padding=0),
nn.ReLU(True),
nn.Identity(),
)
def forward(self, out_features, patch_h, patch_w):
out = []
for i, x in enumerate(out_features):
if self.use_clstoken:
x, cls_token = x[0], x[1]
readout = cls_token.unsqueeze(1).expand_as(x)
x = self.readout_projects[i](torch.cat((x, readout), -1))
else:
x = x[0]
x = x.permute(0, 2, 1).reshape((x.shape[0], x.shape[-1], patch_h, patch_w))
x = self.projects[i](x)
x = self.resize_layers[i](x)
out.append(x)
layer_1, layer_2, layer_3, layer_4 = out
layer_1_rn = self.scratch.layer1_rn(layer_1)
layer_2_rn = self.scratch.layer2_rn(layer_2)
layer_3_rn = self.scratch.layer3_rn(layer_3)
layer_4_rn = self.scratch.layer4_rn(layer_4)
path_4 = self.scratch.refinenet4(layer_4_rn, size=layer_3_rn.shape[2:])
path_3 = self.scratch.refinenet3(path_4, layer_3_rn, size=layer_2_rn.shape[2:])
path_2 = self.scratch.refinenet2(path_3, layer_2_rn, size=layer_1_rn.shape[2:])
path_1 = self.scratch.refinenet1(path_2, layer_1_rn)
out = self.scratch.output_conv1(path_1)
out = F.interpolate(out, (int(patch_h * 14), int(patch_w * 14)), mode="bilinear", align_corners=True)
out = self.scratch.output_conv2(out)
return out
class DepthAnythingV2(nn.Module):
def __init__(
self,
encoder='vitl',
features=256,
out_channels=[256, 512, 1024, 1024],
use_bn=False,
use_clstoken=False
):
super(DepthAnythingV2, self).__init__()
self.intermediate_layer_idx = {
'vits': [2, 5, 8, 11],
'vitb': [2, 5, 8, 11],
'vitl': [4, 11, 17, 23],
'vitg': [9, 19, 29, 39]
}
self.encoder = encoder
self.pretrained = DINOv2(model_name=encoder)
self.depth_head = DPTHead(self.pretrained.embed_dim, features, use_bn, out_channels=out_channels, use_clstoken=use_clstoken)
def forward(self, x):
patch_h, patch_w = x.shape[-2] // 14, x.shape[-1] // 14
features = self.pretrained.get_intermediate_layers(x, self.intermediate_layer_idx[self.encoder], return_class_token=True)
depth = self.depth_head(features, patch_h, patch_w)
depth = F.relu(depth)
return depth.squeeze(1)
@torch.no_grad()
def infer_image(self, raw_image, input_size=518):
image, (h, w) = self.image2tensor(raw_image, input_size)
depth = self.forward(image)
depth = F.interpolate(depth[:, None], (h, w), mode="bilinear", align_corners=True)[0, 0]
return depth.cpu().numpy()
def image2tensor(self, raw_image, input_size=518):
transform = Compose([
Resize(
width=input_size,
height=input_size,
resize_target=False,
keep_aspect_ratio=True,
ensure_multiple_of=14,
resize_method='lower_bound',
image_interpolation_method=cv2.INTER_CUBIC,
),
NormalizeImage(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
PrepareForNet(),
])
h, w = raw_image.shape[:2]
image = cv2.cvtColor(raw_image, cv2.COLOR_BGR2RGB) / 255.0
image = transform({'image': image})['image']
image = torch.from_numpy(image).unsqueeze(0)
DEVICE = 'cuda' if torch.cuda.is_available() else 'mps' if torch.backends.mps.is_available() else 'cpu'
image = image.to(DEVICE)
return image, (h, w)

View File

@@ -0,0 +1,148 @@
import torch.nn as nn
def _make_scratch(in_shape, out_shape, groups=1, expand=False):
scratch = nn.Module()
out_shape1 = out_shape
out_shape2 = out_shape
out_shape3 = out_shape
if len(in_shape) >= 4:
out_shape4 = out_shape
if expand:
out_shape1 = out_shape
out_shape2 = out_shape * 2
out_shape3 = out_shape * 4
if len(in_shape) >= 4:
out_shape4 = out_shape * 8
scratch.layer1_rn = nn.Conv2d(in_shape[0], out_shape1, kernel_size=3, stride=1, padding=1, bias=False, groups=groups)
scratch.layer2_rn = nn.Conv2d(in_shape[1], out_shape2, kernel_size=3, stride=1, padding=1, bias=False, groups=groups)
scratch.layer3_rn = nn.Conv2d(in_shape[2], out_shape3, kernel_size=3, stride=1, padding=1, bias=False, groups=groups)
if len(in_shape) >= 4:
scratch.layer4_rn = nn.Conv2d(in_shape[3], out_shape4, kernel_size=3, stride=1, padding=1, bias=False, groups=groups)
return scratch
class ResidualConvUnit(nn.Module):
"""Residual convolution module.
"""
def __init__(self, features, activation, bn):
"""Init.
Args:
features (int): number of features
"""
super().__init__()
self.bn = bn
self.groups=1
self.conv1 = nn.Conv2d(features, features, kernel_size=3, stride=1, padding=1, bias=True, groups=self.groups)
self.conv2 = nn.Conv2d(features, features, kernel_size=3, stride=1, padding=1, bias=True, groups=self.groups)
if self.bn == True:
self.bn1 = nn.BatchNorm2d(features)
self.bn2 = nn.BatchNorm2d(features)
self.activation = activation
self.skip_add = nn.quantized.FloatFunctional()
def forward(self, x):
"""Forward pass.
Args:
x (tensor): input
Returns:
tensor: output
"""
out = self.activation(x)
out = self.conv1(out)
if self.bn == True:
out = self.bn1(out)
out = self.activation(out)
out = self.conv2(out)
if self.bn == True:
out = self.bn2(out)
if self.groups > 1:
out = self.conv_merge(out)
return self.skip_add.add(out, x)
class FeatureFusionBlock(nn.Module):
"""Feature fusion block.
"""
def __init__(
self,
features,
activation,
deconv=False,
bn=False,
expand=False,
align_corners=True,
size=None
):
"""Init.
Args:
features (int): number of features
"""
super(FeatureFusionBlock, self).__init__()
self.deconv = deconv
self.align_corners = align_corners
self.groups=1
self.expand = expand
out_features = features
if self.expand == True:
out_features = features // 2
self.out_conv = nn.Conv2d(features, out_features, kernel_size=1, stride=1, padding=0, bias=True, groups=1)
self.resConfUnit1 = ResidualConvUnit(features, activation, bn)
self.resConfUnit2 = ResidualConvUnit(features, activation, bn)
self.skip_add = nn.quantized.FloatFunctional()
self.size=size
def forward(self, *xs, size=None):
"""Forward pass.
Returns:
tensor: output
"""
output = xs[0]
if len(xs) == 2:
res = self.resConfUnit1(xs[1])
output = self.skip_add.add(output, res)
output = self.resConfUnit2(output)
if (size is None) and (self.size is None):
modifier = {"scale_factor": 2}
elif size is None:
modifier = {"size": self.size}
else:
modifier = {"size": size}
output = nn.functional.interpolate(output, **modifier, mode="bilinear", align_corners=self.align_corners)
output = self.out_conv(output)
return output

View File

@@ -0,0 +1,158 @@
import numpy as np
import cv2
class Resize(object):
"""Resize sample to given size (width, height).
"""
def __init__(
self,
width,
height,
resize_target=True,
keep_aspect_ratio=False,
ensure_multiple_of=1,
resize_method="lower_bound",
image_interpolation_method=cv2.INTER_AREA,
):
"""Init.
Args:
width (int): desired output width
height (int): desired output height
resize_target (bool, optional):
True: Resize the full sample (image, mask, target).
False: Resize image only.
Defaults to True.
keep_aspect_ratio (bool, optional):
True: Keep the aspect ratio of the input sample.
Output sample might not have the given width and height, and
resize behaviour depends on the parameter 'resize_method'.
Defaults to False.
ensure_multiple_of (int, optional):
Output width and height is constrained to be multiple of this parameter.
Defaults to 1.
resize_method (str, optional):
"lower_bound": Output will be at least as large as the given size.
"upper_bound": Output will be at max as large as the given size. (Output size might be smaller than given size.)
"minimal": Scale as least as possible. (Output size might be smaller than given size.)
Defaults to "lower_bound".
"""
self.__width = width
self.__height = height
self.__resize_target = resize_target
self.__keep_aspect_ratio = keep_aspect_ratio
self.__multiple_of = ensure_multiple_of
self.__resize_method = resize_method
self.__image_interpolation_method = image_interpolation_method
def constrain_to_multiple_of(self, x, min_val=0, max_val=None):
y = (np.round(x / self.__multiple_of) * self.__multiple_of).astype(int)
if max_val is not None and y > max_val:
y = (np.floor(x / self.__multiple_of) * self.__multiple_of).astype(int)
if y < min_val:
y = (np.ceil(x / self.__multiple_of) * self.__multiple_of).astype(int)
return y
def get_size(self, width, height):
# determine new height and width
scale_height = self.__height / height
scale_width = self.__width / width
if self.__keep_aspect_ratio:
if self.__resize_method == "lower_bound":
# scale such that output size is lower bound
if scale_width > scale_height:
# fit width
scale_height = scale_width
else:
# fit height
scale_width = scale_height
elif self.__resize_method == "upper_bound":
# scale such that output size is upper bound
if scale_width < scale_height:
# fit width
scale_height = scale_width
else:
# fit height
scale_width = scale_height
elif self.__resize_method == "minimal":
# scale as least as possbile
if abs(1 - scale_width) < abs(1 - scale_height):
# fit width
scale_height = scale_width
else:
# fit height
scale_width = scale_height
else:
raise ValueError(f"resize_method {self.__resize_method} not implemented")
if self.__resize_method == "lower_bound":
new_height = self.constrain_to_multiple_of(scale_height * height, min_val=self.__height)
new_width = self.constrain_to_multiple_of(scale_width * width, min_val=self.__width)
elif self.__resize_method == "upper_bound":
new_height = self.constrain_to_multiple_of(scale_height * height, max_val=self.__height)
new_width = self.constrain_to_multiple_of(scale_width * width, max_val=self.__width)
elif self.__resize_method == "minimal":
new_height = self.constrain_to_multiple_of(scale_height * height)
new_width = self.constrain_to_multiple_of(scale_width * width)
else:
raise ValueError(f"resize_method {self.__resize_method} not implemented")
return (new_width, new_height)
def __call__(self, sample):
width, height = self.get_size(sample["image"].shape[1], sample["image"].shape[0])
# resize sample
sample["image"] = cv2.resize(sample["image"], (width, height), interpolation=self.__image_interpolation_method)
if self.__resize_target:
if "depth" in sample:
sample["depth"] = cv2.resize(sample["depth"], (width, height), interpolation=cv2.INTER_NEAREST)
if "mask" in sample:
sample["mask"] = cv2.resize(sample["mask"].astype(np.float32), (width, height), interpolation=cv2.INTER_NEAREST)
return sample
class NormalizeImage(object):
"""Normlize image by given mean and std.
"""
def __init__(self, mean, std):
self.__mean = mean
self.__std = std
def __call__(self, sample):
sample["image"] = (sample["image"] - self.__mean) / self.__std
return sample
class PrepareForNet(object):
"""Prepare sample for usage as network input.
"""
def __init__(self):
pass
def __call__(self, sample):
image = np.transpose(sample["image"], (2, 0, 1))
sample["image"] = np.ascontiguousarray(image).astype(np.float32)
if "depth" in sample:
depth = sample["depth"].astype(np.float32)
sample["depth"] = np.ascontiguousarray(depth)
if "mask" in sample:
sample["mask"] = sample["mask"].astype(np.float32)
sample["mask"] = np.ascontiguousarray(sample["mask"])
return sample

55
metric_depth/README.md Normal file
View File

@@ -0,0 +1,55 @@
# Depth Anything V2 for Metric Depth Estimation
![teaser](./assets/compare_zoedepth.png)
We here provide a simple codebase to fine-tune our Depth Anything V2 pre-trained encoder for metric depth estimation. Built on our powerful encoder, we use a simple DPT head to regress the depth. We fine-tune our pre-trained encoder on synthetic Hypersim / Virtual KITTI datasets for indoor / outdoor metric depth estimation, respectively.
## Usage
### Inference
Please first download our pre-trained metric depth models and put them under the `checkpoints` directory:
- [Indoor model from Hypersim](https://huggingface.co/depth-anything/Depth-Anything-V2-Metric-Hypersim-Large/resolve/main/depth_anything_v2_metric_hypersim_vitl.pth.pth?download=true)
- [Outdoor model from Virtual KITTI 2](https://huggingface.co/depth-anything/Depth-Anything-V2-Metric-VKITTI-Large/resolve/main/depth_anything_v2_metric_vkitti_vitl.pth.pth?download=true)
```bash
# indoor scenes
python run.py \
--encoder vitl --load-from checkpoints/depth_anything_v2_metric_hypersim_vitl.pth \
--max-depth 20 --img-path <path> --outdir <outdir> [--input-size <size>] [--save-numpy]
# outdoor scenes
python run.py \
--encoder vitl --load-from checkpoints/depth_anything_v2_metric_vkitti_vitl.pth \
--max-depth 80 --img-path <path> --outdir <outdir> [--input-size <size>] [--save-numpy]
```
You can also project 2D images to point clouds:
```bash
python depth_to_pointcloud.py \
--encoder vitl --load-from checkpoints/depth_anything_v2_metric_hypersim_vitl.pth \
--max-depth 20 --img-path <path> --outdir <outdir>
```
### Reproduce training
Please first prepare the [Hypersim](https://github.com/apple/ml-hypersim) and [Virtual KITTI 2](https://europe.naverlabs.com/research/computer-vision/proxy-virtual-worlds-vkitti-2/) datasets. Then:
```bash
bash dist_train.sh
```
## Citation
If you find this project useful, please consider citing:
```bibtex
@article{depth_anything_v2,
title={Depth Anything V2},
author={Yang, Lihe and Kang, Bingyi and Huang, Zilong and Zhao, Zhen and Xu, Xiaogang and Feng, Jiashi and Zhao, Hengshuang},
journal={arXiv preprint arXiv:},
year={2024}
}
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 MiB

View File

@@ -0,0 +1,74 @@
import cv2
import h5py
import numpy as np
import torch
from torch.utils.data import Dataset
from torchvision.transforms import Compose
from dataset.transform import Resize, NormalizeImage, PrepareForNet, Crop
def hypersim_distance_to_depth(npyDistance):
intWidth, intHeight, fltFocal = 1024, 768, 886.81
npyImageplaneX = np.linspace((-0.5 * intWidth) + 0.5, (0.5 * intWidth) - 0.5, intWidth).reshape(
1, intWidth).repeat(intHeight, 0).astype(np.float32)[:, :, None]
npyImageplaneY = np.linspace((-0.5 * intHeight) + 0.5, (0.5 * intHeight) - 0.5,
intHeight).reshape(intHeight, 1).repeat(intWidth, 1).astype(np.float32)[:, :, None]
npyImageplaneZ = np.full([intHeight, intWidth, 1], fltFocal, np.float32)
npyImageplane = np.concatenate(
[npyImageplaneX, npyImageplaneY, npyImageplaneZ], 2)
npyDepth = npyDistance / np.linalg.norm(npyImageplane, 2, 2) * fltFocal
return npyDepth
class Hypersim(Dataset):
def __init__(self, filelist_path, mode, size=(518, 518)):
self.mode = mode
self.size = size
with open(filelist_path, 'r') as f:
self.filelist = f.read().splitlines()
net_w, net_h = size
self.transform = Compose([
Resize(
width=net_w,
height=net_h,
resize_target=True if mode == 'train' else False,
keep_aspect_ratio=True,
ensure_multiple_of=14,
resize_method='lower_bound',
image_interpolation_method=cv2.INTER_CUBIC,
),
NormalizeImage(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
PrepareForNet(),
] + ([Crop(size[0])] if self.mode == 'train' else []))
def __getitem__(self, item):
img_path = self.filelist[item].split(' ')[0]
depth_path = self.filelist[item].split(' ')[1]
image = cv2.imread(img_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) / 255.0
depth_fd = h5py.File(depth_path, "r")
distance_meters = np.array(depth_fd['dataset'])
depth = hypersim_distance_to_depth(distance_meters)
sample = self.transform({'image': image, 'depth': depth})
sample['image'] = torch.from_numpy(sample['image'])
sample['depth'] = torch.from_numpy(sample['depth'])
sample['valid_mask'] = (torch.isnan(sample['depth']) == 0)
sample['depth'][sample['valid_mask'] == 0] = 0
sample['image_path'] = self.filelist[item].split(' ')[0]
return sample
def __len__(self):
return len(self.filelist)

View File

@@ -0,0 +1,57 @@
import cv2
import torch
from torch.utils.data import Dataset
from torchvision.transforms import Compose
from dataset.transform import Resize, NormalizeImage, PrepareForNet
class KITTI(Dataset):
def __init__(self, filelist_path, mode, size=(518, 518)):
if mode != 'val':
raise NotImplementedError
self.mode = mode
self.size = size
with open(filelist_path, 'r') as f:
self.filelist = f.read().splitlines()
net_w, net_h = size
self.transform = Compose([
Resize(
width=net_w,
height=net_h,
resize_target=True if mode == 'train' else False,
keep_aspect_ratio=True,
ensure_multiple_of=14,
resize_method='lower_bound',
image_interpolation_method=cv2.INTER_CUBIC,
),
NormalizeImage(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
PrepareForNet(),
])
def __getitem__(self, item):
img_path = self.filelist[item].split(' ')[0]
depth_path = self.filelist[item].split(' ')[1]
image = cv2.imread(img_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) / 255.0
depth = cv2.imread(depth_path, cv2.IMREAD_UNCHANGED).astype('float32')
sample = self.transform({'image': image, 'depth': depth})
sample['image'] = torch.from_numpy(sample['image'])
sample['depth'] = torch.from_numpy(sample['depth'])
sample['depth'] = sample['depth'] / 256.0 # convert in meters
sample['valid_mask'] = sample['depth'] > 0
sample['image_path'] = self.filelist[item].split(' ')[0]
return sample
def __len__(self):
return len(self.filelist)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,652 @@
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000069.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0002_sync/proj_depth/groundtruth/image_02/0000000069.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000054.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0002_sync/proj_depth/groundtruth/image_02/0000000054.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000042.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0002_sync/proj_depth/groundtruth/image_02/0000000042.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000057.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0002_sync/proj_depth/groundtruth/image_02/0000000057.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000030.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0002_sync/proj_depth/groundtruth/image_02/0000000030.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000027.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0002_sync/proj_depth/groundtruth/image_02/0000000027.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000012.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0002_sync/proj_depth/groundtruth/image_02/0000000012.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000036.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0002_sync/proj_depth/groundtruth/image_02/0000000036.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000033.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0002_sync/proj_depth/groundtruth/image_02/0000000033.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000015.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0002_sync/proj_depth/groundtruth/image_02/0000000015.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000039.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0002_sync/proj_depth/groundtruth/image_02/0000000039.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000009.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0002_sync/proj_depth/groundtruth/image_02/0000000009.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000051.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0002_sync/proj_depth/groundtruth/image_02/0000000051.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000060.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0002_sync/proj_depth/groundtruth/image_02/0000000060.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000021.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0002_sync/proj_depth/groundtruth/image_02/0000000021.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000024.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0002_sync/proj_depth/groundtruth/image_02/0000000024.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000045.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0002_sync/proj_depth/groundtruth/image_02/0000000045.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000018.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0002_sync/proj_depth/groundtruth/image_02/0000000018.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000048.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0002_sync/proj_depth/groundtruth/image_02/0000000048.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000006.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0002_sync/proj_depth/groundtruth/image_02/0000000006.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0002_sync/image_02/data/0000000063.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0002_sync/proj_depth/groundtruth/image_02/0000000063.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000016.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000016.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000032.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000032.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000048.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000048.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000064.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000064.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000080.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000080.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000096.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000096.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000112.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000112.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000128.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000128.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000144.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000144.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000160.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000160.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000176.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000176.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000196.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000196.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000212.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000212.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000228.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000228.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000244.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000244.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000260.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000260.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000276.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000276.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000292.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000292.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000308.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000308.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000324.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000324.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000340.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000340.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000356.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000356.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000372.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000372.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0009_sync/image_02/data/0000000388.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0009_sync/proj_depth/groundtruth/image_02/0000000388.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000090.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0013_sync/proj_depth/groundtruth/image_02/0000000090.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000050.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0013_sync/proj_depth/groundtruth/image_02/0000000050.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000110.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0013_sync/proj_depth/groundtruth/image_02/0000000110.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000115.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0013_sync/proj_depth/groundtruth/image_02/0000000115.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000060.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0013_sync/proj_depth/groundtruth/image_02/0000000060.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000105.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0013_sync/proj_depth/groundtruth/image_02/0000000105.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000125.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0013_sync/proj_depth/groundtruth/image_02/0000000125.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000020.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0013_sync/proj_depth/groundtruth/image_02/0000000020.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000085.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0013_sync/proj_depth/groundtruth/image_02/0000000085.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000070.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0013_sync/proj_depth/groundtruth/image_02/0000000070.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000080.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0013_sync/proj_depth/groundtruth/image_02/0000000080.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000065.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0013_sync/proj_depth/groundtruth/image_02/0000000065.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000095.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0013_sync/proj_depth/groundtruth/image_02/0000000095.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000130.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0013_sync/proj_depth/groundtruth/image_02/0000000130.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000100.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0013_sync/proj_depth/groundtruth/image_02/0000000100.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000010.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0013_sync/proj_depth/groundtruth/image_02/0000000010.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000030.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0013_sync/proj_depth/groundtruth/image_02/0000000030.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000135.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0013_sync/proj_depth/groundtruth/image_02/0000000135.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000040.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0013_sync/proj_depth/groundtruth/image_02/0000000040.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000005.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0013_sync/proj_depth/groundtruth/image_02/0000000005.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000120.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0013_sync/proj_depth/groundtruth/image_02/0000000120.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000045.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0013_sync/proj_depth/groundtruth/image_02/0000000045.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0013_sync/image_02/data/0000000035.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0013_sync/proj_depth/groundtruth/image_02/0000000035.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000069.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0020_sync/proj_depth/groundtruth/image_02/0000000069.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000057.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0020_sync/proj_depth/groundtruth/image_02/0000000057.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000012.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0020_sync/proj_depth/groundtruth/image_02/0000000012.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000072.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0020_sync/proj_depth/groundtruth/image_02/0000000072.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000018.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0020_sync/proj_depth/groundtruth/image_02/0000000018.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000063.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0020_sync/proj_depth/groundtruth/image_02/0000000063.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000015.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0020_sync/proj_depth/groundtruth/image_02/0000000015.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000066.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0020_sync/proj_depth/groundtruth/image_02/0000000066.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000006.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0020_sync/proj_depth/groundtruth/image_02/0000000006.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000048.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0020_sync/proj_depth/groundtruth/image_02/0000000048.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000060.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0020_sync/proj_depth/groundtruth/image_02/0000000060.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000009.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0020_sync/proj_depth/groundtruth/image_02/0000000009.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000033.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0020_sync/proj_depth/groundtruth/image_02/0000000033.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000021.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0020_sync/proj_depth/groundtruth/image_02/0000000021.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000075.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0020_sync/proj_depth/groundtruth/image_02/0000000075.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000027.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0020_sync/proj_depth/groundtruth/image_02/0000000027.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000045.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0020_sync/proj_depth/groundtruth/image_02/0000000045.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000078.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0020_sync/proj_depth/groundtruth/image_02/0000000078.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000036.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0020_sync/proj_depth/groundtruth/image_02/0000000036.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000051.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0020_sync/proj_depth/groundtruth/image_02/0000000051.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000054.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0020_sync/proj_depth/groundtruth/image_02/0000000054.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0020_sync/image_02/data/0000000042.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0020_sync/proj_depth/groundtruth/image_02/0000000042.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000018.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000018.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000090.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000090.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000126.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000126.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000378.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000378.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000036.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000036.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000288.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000288.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000198.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000198.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000450.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000450.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000144.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000144.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000072.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000072.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000252.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000252.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000180.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000180.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000432.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000432.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000396.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000396.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000054.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000054.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000468.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000468.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000306.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000306.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000108.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000108.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000162.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000162.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000342.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000342.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000270.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000270.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000414.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000414.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000216.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000216.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000360.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000360.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0023_sync/image_02/data/0000000324.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0023_sync/proj_depth/groundtruth/image_02/0000000324.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000077.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000077.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000035.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000035.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000091.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000091.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000112.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000112.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000007.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000007.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000175.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000175.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000042.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000042.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000098.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000098.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000133.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000133.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000161.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000161.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000014.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000014.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000126.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000126.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000168.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000168.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000070.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000070.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000084.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000084.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000140.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000140.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000049.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000049.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000182.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000182.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000147.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000147.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000056.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000056.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000063.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000063.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000021.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000021.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000119.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000119.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0027_sync/image_02/data/0000000028.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0027_sync/proj_depth/groundtruth/image_02/0000000028.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000380.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000380.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000394.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000394.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000324.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000324.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000268.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000268.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000366.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000366.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000296.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000296.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000014.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000014.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000028.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000028.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000182.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000182.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000168.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000168.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000196.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000196.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000140.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000140.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000084.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000084.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000056.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000056.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000112.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000112.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000352.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000352.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000126.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000126.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000070.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000070.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000310.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000310.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000154.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000154.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000098.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000098.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000408.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000408.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000042.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000042.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0029_sync/image_02/data/0000000338.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0029_sync/proj_depth/groundtruth/image_02/0000000338.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000128.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0036_sync/proj_depth/groundtruth/image_02/0000000128.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000192.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0036_sync/proj_depth/groundtruth/image_02/0000000192.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000032.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0036_sync/proj_depth/groundtruth/image_02/0000000032.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000352.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0036_sync/proj_depth/groundtruth/image_02/0000000352.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000608.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0036_sync/proj_depth/groundtruth/image_02/0000000608.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000224.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0036_sync/proj_depth/groundtruth/image_02/0000000224.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000576.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0036_sync/proj_depth/groundtruth/image_02/0000000576.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000672.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0036_sync/proj_depth/groundtruth/image_02/0000000672.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000064.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0036_sync/proj_depth/groundtruth/image_02/0000000064.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000448.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0036_sync/proj_depth/groundtruth/image_02/0000000448.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000704.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0036_sync/proj_depth/groundtruth/image_02/0000000704.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000640.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0036_sync/proj_depth/groundtruth/image_02/0000000640.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000512.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0036_sync/proj_depth/groundtruth/image_02/0000000512.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000768.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0036_sync/proj_depth/groundtruth/image_02/0000000768.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000160.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0036_sync/proj_depth/groundtruth/image_02/0000000160.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000416.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0036_sync/proj_depth/groundtruth/image_02/0000000416.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000480.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0036_sync/proj_depth/groundtruth/image_02/0000000480.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000288.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0036_sync/proj_depth/groundtruth/image_02/0000000288.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000544.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0036_sync/proj_depth/groundtruth/image_02/0000000544.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000096.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0036_sync/proj_depth/groundtruth/image_02/0000000096.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000384.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0036_sync/proj_depth/groundtruth/image_02/0000000384.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000256.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0036_sync/proj_depth/groundtruth/image_02/0000000256.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0036_sync/image_02/data/0000000320.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_26_drive_0036_sync/proj_depth/groundtruth/image_02/0000000320.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000005.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0046_sync/proj_depth/groundtruth/image_02/0000000005.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000010.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0046_sync/proj_depth/groundtruth/image_02/0000000010.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000015.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0046_sync/proj_depth/groundtruth/image_02/0000000015.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000020.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0046_sync/proj_depth/groundtruth/image_02/0000000020.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000025.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0046_sync/proj_depth/groundtruth/image_02/0000000025.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000030.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0046_sync/proj_depth/groundtruth/image_02/0000000030.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000035.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0046_sync/proj_depth/groundtruth/image_02/0000000035.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000040.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0046_sync/proj_depth/groundtruth/image_02/0000000040.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000045.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0046_sync/proj_depth/groundtruth/image_02/0000000045.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000050.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0046_sync/proj_depth/groundtruth/image_02/0000000050.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000055.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0046_sync/proj_depth/groundtruth/image_02/0000000055.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000060.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0046_sync/proj_depth/groundtruth/image_02/0000000060.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000065.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0046_sync/proj_depth/groundtruth/image_02/0000000065.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000070.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0046_sync/proj_depth/groundtruth/image_02/0000000070.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000075.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0046_sync/proj_depth/groundtruth/image_02/0000000075.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000080.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0046_sync/proj_depth/groundtruth/image_02/0000000080.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000085.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0046_sync/proj_depth/groundtruth/image_02/0000000085.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000090.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0046_sync/proj_depth/groundtruth/image_02/0000000090.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000095.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0046_sync/proj_depth/groundtruth/image_02/0000000095.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000100.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0046_sync/proj_depth/groundtruth/image_02/0000000100.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000105.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0046_sync/proj_depth/groundtruth/image_02/0000000105.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000110.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0046_sync/proj_depth/groundtruth/image_02/0000000110.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0046_sync/image_02/data/0000000115.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0046_sync/proj_depth/groundtruth/image_02/0000000115.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000005.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0048_sync/proj_depth/groundtruth/image_02/0000000005.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000006.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0048_sync/proj_depth/groundtruth/image_02/0000000006.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000007.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0048_sync/proj_depth/groundtruth/image_02/0000000007.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000008.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0048_sync/proj_depth/groundtruth/image_02/0000000008.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000009.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0048_sync/proj_depth/groundtruth/image_02/0000000009.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000010.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0048_sync/proj_depth/groundtruth/image_02/0000000010.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000011.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0048_sync/proj_depth/groundtruth/image_02/0000000011.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000012.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0048_sync/proj_depth/groundtruth/image_02/0000000012.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000013.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0048_sync/proj_depth/groundtruth/image_02/0000000013.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000014.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0048_sync/proj_depth/groundtruth/image_02/0000000014.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000015.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0048_sync/proj_depth/groundtruth/image_02/0000000015.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0048_sync/image_02/data/0000000016.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0048_sync/proj_depth/groundtruth/image_02/0000000016.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000046.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0052_sync/proj_depth/groundtruth/image_02/0000000046.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000014.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0052_sync/proj_depth/groundtruth/image_02/0000000014.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000036.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0052_sync/proj_depth/groundtruth/image_02/0000000036.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000028.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0052_sync/proj_depth/groundtruth/image_02/0000000028.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000026.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0052_sync/proj_depth/groundtruth/image_02/0000000026.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000050.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0052_sync/proj_depth/groundtruth/image_02/0000000050.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000040.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0052_sync/proj_depth/groundtruth/image_02/0000000040.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000008.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0052_sync/proj_depth/groundtruth/image_02/0000000008.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000016.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0052_sync/proj_depth/groundtruth/image_02/0000000016.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000044.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0052_sync/proj_depth/groundtruth/image_02/0000000044.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000018.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0052_sync/proj_depth/groundtruth/image_02/0000000018.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000032.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0052_sync/proj_depth/groundtruth/image_02/0000000032.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000042.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0052_sync/proj_depth/groundtruth/image_02/0000000042.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000010.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0052_sync/proj_depth/groundtruth/image_02/0000000010.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000020.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0052_sync/proj_depth/groundtruth/image_02/0000000020.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000048.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0052_sync/proj_depth/groundtruth/image_02/0000000048.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000052.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0052_sync/proj_depth/groundtruth/image_02/0000000052.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000006.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0052_sync/proj_depth/groundtruth/image_02/0000000006.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000030.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0052_sync/proj_depth/groundtruth/image_02/0000000030.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000012.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0052_sync/proj_depth/groundtruth/image_02/0000000012.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000038.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0052_sync/proj_depth/groundtruth/image_02/0000000038.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0052_sync/image_02/data/0000000022.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0052_sync/proj_depth/groundtruth/image_02/0000000022.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000011.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000011.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000033.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000033.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000242.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000242.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000253.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000253.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000286.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000286.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000154.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000154.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000099.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000099.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000220.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000220.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000022.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000022.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000077.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000077.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000187.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000187.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000143.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000143.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000066.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000066.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000176.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000176.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000110.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000110.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000275.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000275.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000264.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000264.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000198.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000198.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000055.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000055.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000088.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000088.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000121.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000121.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000209.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000209.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000165.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000165.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000231.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000231.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0056_sync/image_02/data/0000000044.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0056_sync/proj_depth/groundtruth/image_02/0000000044.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000056.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0059_sync/proj_depth/groundtruth/image_02/0000000056.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000344.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0059_sync/proj_depth/groundtruth/image_02/0000000344.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000358.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0059_sync/proj_depth/groundtruth/image_02/0000000358.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000316.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0059_sync/proj_depth/groundtruth/image_02/0000000316.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000238.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0059_sync/proj_depth/groundtruth/image_02/0000000238.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000098.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0059_sync/proj_depth/groundtruth/image_02/0000000098.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000112.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0059_sync/proj_depth/groundtruth/image_02/0000000112.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000028.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0059_sync/proj_depth/groundtruth/image_02/0000000028.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000014.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0059_sync/proj_depth/groundtruth/image_02/0000000014.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000330.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0059_sync/proj_depth/groundtruth/image_02/0000000330.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000154.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0059_sync/proj_depth/groundtruth/image_02/0000000154.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000042.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0059_sync/proj_depth/groundtruth/image_02/0000000042.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000302.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0059_sync/proj_depth/groundtruth/image_02/0000000302.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000182.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0059_sync/proj_depth/groundtruth/image_02/0000000182.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000288.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0059_sync/proj_depth/groundtruth/image_02/0000000288.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000140.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0059_sync/proj_depth/groundtruth/image_02/0000000140.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000274.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0059_sync/proj_depth/groundtruth/image_02/0000000274.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000224.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0059_sync/proj_depth/groundtruth/image_02/0000000224.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000196.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0059_sync/proj_depth/groundtruth/image_02/0000000196.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000126.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0059_sync/proj_depth/groundtruth/image_02/0000000126.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000084.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0059_sync/proj_depth/groundtruth/image_02/0000000084.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000210.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0059_sync/proj_depth/groundtruth/image_02/0000000210.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0059_sync/image_02/data/0000000070.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0059_sync/proj_depth/groundtruth/image_02/0000000070.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000528.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000528.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000308.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000308.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000044.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000044.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000352.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000352.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000066.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000066.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000506.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000506.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000176.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000176.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000022.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000022.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000242.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000242.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000462.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000462.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000418.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000418.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000110.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000110.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000440.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000440.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000396.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000396.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000154.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000154.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000374.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000374.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000088.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000088.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000286.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000286.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000550.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000550.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000264.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000264.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000220.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000220.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000330.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000330.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000484.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000484.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0064_sync/image_02/data/0000000198.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0064_sync/proj_depth/groundtruth/image_02/0000000198.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000283.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000283.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000361.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000361.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000270.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000270.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000127.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000127.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000205.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000205.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000218.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000218.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000153.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000153.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000335.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000335.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000192.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000192.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000348.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000348.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000101.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000101.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000049.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000049.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000179.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000179.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000140.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000140.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000374.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000374.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000322.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000322.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000309.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000309.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000244.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000244.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000062.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000062.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000257.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000257.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000088.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000088.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000114.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000114.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000075.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000075.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000296.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000296.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0084_sync/image_02/data/0000000231.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0084_sync/proj_depth/groundtruth/image_02/0000000231.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000007.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000007.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000196.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000196.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000439.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000439.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000169.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000169.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000115.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000115.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000034.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000034.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000304.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000304.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000331.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000331.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000277.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000277.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000520.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000520.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000682.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000682.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000628.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000628.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000088.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000088.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000601.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000601.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000574.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000574.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000223.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000223.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000655.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000655.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000358.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000358.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000412.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000412.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000142.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000142.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000385.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000385.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000061.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000061.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000493.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000493.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000466.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000466.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0086_sync/image_02/data/0000000250.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0086_sync/proj_depth/groundtruth/image_02/0000000250.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000016.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000016.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000032.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000032.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000048.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000048.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000064.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000064.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000080.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000080.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000096.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000096.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000112.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000112.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000128.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000128.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000144.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000144.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000160.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000160.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000176.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000176.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000192.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000192.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000208.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000208.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000224.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000224.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000240.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000240.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000256.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000256.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000305.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000305.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000321.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000321.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000337.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000337.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000353.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000353.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000369.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000369.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000385.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000385.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000401.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000401.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0093_sync/image_02/data/0000000417.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0093_sync/proj_depth/groundtruth/image_02/0000000417.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000019.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000019.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000038.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000038.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000057.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000057.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000076.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000076.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000095.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000095.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000114.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000114.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000133.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000133.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000152.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000152.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000171.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000171.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000190.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000190.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000209.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000209.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000228.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000228.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000247.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000247.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000266.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000266.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000285.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000285.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000304.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000304.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000323.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000323.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000342.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000342.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000361.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000361.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000380.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000380.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000399.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000399.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000418.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000418.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000437.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000437.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0096_sync/image_02/data/0000000456.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0096_sync/proj_depth/groundtruth/image_02/0000000456.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000692.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000692.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000930.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000930.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000760.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000760.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000896.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000896.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000284.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000284.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000148.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000148.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000522.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000522.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000794.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000794.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000624.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000624.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000726.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000726.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000216.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000216.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000318.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000318.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000488.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000488.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000590.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000590.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000454.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000454.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000862.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000862.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000386.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000386.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000352.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000352.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000420.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000420.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000658.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000658.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000828.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000828.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000556.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000556.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000114.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000114.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000182.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000182.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0101_sync/image_02/data/0000000080.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0101_sync/proj_depth/groundtruth/image_02/0000000080.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000015.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000015.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000035.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000035.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000043.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000043.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000051.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000051.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000059.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000059.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000067.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000067.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000075.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000075.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000083.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000083.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000091.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000091.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000099.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000099.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000107.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000107.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000115.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000115.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000123.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000123.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000131.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000131.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000139.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000139.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000147.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000147.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000155.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000155.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000163.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000163.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000171.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000171.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000179.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000179.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000187.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000187.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000195.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000195.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000203.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000203.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000211.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000211.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0106_sync/image_02/data/0000000219.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0106_sync/proj_depth/groundtruth/image_02/0000000219.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000312.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000312.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000494.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000494.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000104.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000104.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000130.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000130.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000156.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000156.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000182.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000182.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000598.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000598.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000416.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000416.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000364.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000364.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000026.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000026.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000078.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000078.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000572.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000572.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000468.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000468.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000260.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000260.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000624.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000624.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000234.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000234.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000442.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000442.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000390.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000390.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000546.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000546.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000286.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000286.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000338.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000338.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000208.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000208.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000650.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000650.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_26/2011_09_26_drive_0117_sync/image_02/data/0000000052.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_26_drive_0117_sync/proj_depth/groundtruth/image_02/0000000052.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000024.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_28_drive_0002_sync/proj_depth/groundtruth/image_02/0000000024.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000021.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_28_drive_0002_sync/proj_depth/groundtruth/image_02/0000000021.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000036.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_28_drive_0002_sync/proj_depth/groundtruth/image_02/0000000036.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000051.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_28_drive_0002_sync/proj_depth/groundtruth/image_02/0000000051.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000018.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_28_drive_0002_sync/proj_depth/groundtruth/image_02/0000000018.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000033.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_28_drive_0002_sync/proj_depth/groundtruth/image_02/0000000033.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000090.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_28_drive_0002_sync/proj_depth/groundtruth/image_02/0000000090.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000045.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_28_drive_0002_sync/proj_depth/groundtruth/image_02/0000000045.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000054.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_28_drive_0002_sync/proj_depth/groundtruth/image_02/0000000054.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000012.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_28_drive_0002_sync/proj_depth/groundtruth/image_02/0000000012.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000039.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_28_drive_0002_sync/proj_depth/groundtruth/image_02/0000000039.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000009.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_28_drive_0002_sync/proj_depth/groundtruth/image_02/0000000009.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000030.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_28_drive_0002_sync/proj_depth/groundtruth/image_02/0000000030.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000078.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_28_drive_0002_sync/proj_depth/groundtruth/image_02/0000000078.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000060.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_28_drive_0002_sync/proj_depth/groundtruth/image_02/0000000060.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000048.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_28_drive_0002_sync/proj_depth/groundtruth/image_02/0000000048.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000084.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_28_drive_0002_sync/proj_depth/groundtruth/image_02/0000000084.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000081.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_28_drive_0002_sync/proj_depth/groundtruth/image_02/0000000081.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000006.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_28_drive_0002_sync/proj_depth/groundtruth/image_02/0000000006.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000057.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_28_drive_0002_sync/proj_depth/groundtruth/image_02/0000000057.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000072.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_28_drive_0002_sync/proj_depth/groundtruth/image_02/0000000072.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000087.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_28_drive_0002_sync/proj_depth/groundtruth/image_02/0000000087.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_28/2011_09_28_drive_0002_sync/image_02/data/0000000063.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_28_drive_0002_sync/proj_depth/groundtruth/image_02/0000000063.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000252.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_29_drive_0071_sync/proj_depth/groundtruth/image_02/0000000252.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000540.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_29_drive_0071_sync/proj_depth/groundtruth/image_02/0000000540.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000036.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_29_drive_0071_sync/proj_depth/groundtruth/image_02/0000000036.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000360.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_29_drive_0071_sync/proj_depth/groundtruth/image_02/0000000360.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000807.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_29_drive_0071_sync/proj_depth/groundtruth/image_02/0000000807.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000879.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_29_drive_0071_sync/proj_depth/groundtruth/image_02/0000000879.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000288.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_29_drive_0071_sync/proj_depth/groundtruth/image_02/0000000288.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000771.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_29_drive_0071_sync/proj_depth/groundtruth/image_02/0000000771.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000216.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_29_drive_0071_sync/proj_depth/groundtruth/image_02/0000000216.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000951.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_29_drive_0071_sync/proj_depth/groundtruth/image_02/0000000951.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000324.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_29_drive_0071_sync/proj_depth/groundtruth/image_02/0000000324.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000432.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_29_drive_0071_sync/proj_depth/groundtruth/image_02/0000000432.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000504.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_29_drive_0071_sync/proj_depth/groundtruth/image_02/0000000504.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000576.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_29_drive_0071_sync/proj_depth/groundtruth/image_02/0000000576.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000108.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_29_drive_0071_sync/proj_depth/groundtruth/image_02/0000000108.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000180.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_29_drive_0071_sync/proj_depth/groundtruth/image_02/0000000180.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000072.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_29_drive_0071_sync/proj_depth/groundtruth/image_02/0000000072.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000612.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_29_drive_0071_sync/proj_depth/groundtruth/image_02/0000000612.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000915.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_29_drive_0071_sync/proj_depth/groundtruth/image_02/0000000915.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000735.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_29_drive_0071_sync/proj_depth/groundtruth/image_02/0000000735.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000144.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_29_drive_0071_sync/proj_depth/groundtruth/image_02/0000000144.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000396.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_29_drive_0071_sync/proj_depth/groundtruth/image_02/0000000396.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_29/2011_09_29_drive_0071_sync/image_02/data/0000000468.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_29_drive_0071_sync/proj_depth/groundtruth/image_02/0000000468.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000132.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_30_drive_0016_sync/proj_depth/groundtruth/image_02/0000000132.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000011.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_30_drive_0016_sync/proj_depth/groundtruth/image_02/0000000011.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000154.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_30_drive_0016_sync/proj_depth/groundtruth/image_02/0000000154.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000022.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_30_drive_0016_sync/proj_depth/groundtruth/image_02/0000000022.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000242.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_30_drive_0016_sync/proj_depth/groundtruth/image_02/0000000242.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000198.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_30_drive_0016_sync/proj_depth/groundtruth/image_02/0000000198.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000176.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_30_drive_0016_sync/proj_depth/groundtruth/image_02/0000000176.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000231.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_30_drive_0016_sync/proj_depth/groundtruth/image_02/0000000231.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000220.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_30_drive_0016_sync/proj_depth/groundtruth/image_02/0000000220.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000088.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_30_drive_0016_sync/proj_depth/groundtruth/image_02/0000000088.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000143.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_30_drive_0016_sync/proj_depth/groundtruth/image_02/0000000143.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000055.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_30_drive_0016_sync/proj_depth/groundtruth/image_02/0000000055.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000033.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_30_drive_0016_sync/proj_depth/groundtruth/image_02/0000000033.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000187.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_30_drive_0016_sync/proj_depth/groundtruth/image_02/0000000187.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000110.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_30_drive_0016_sync/proj_depth/groundtruth/image_02/0000000110.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000044.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_30_drive_0016_sync/proj_depth/groundtruth/image_02/0000000044.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000077.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_30_drive_0016_sync/proj_depth/groundtruth/image_02/0000000077.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000066.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_30_drive_0016_sync/proj_depth/groundtruth/image_02/0000000066.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000165.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_30_drive_0016_sync/proj_depth/groundtruth/image_02/0000000165.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000264.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_30_drive_0016_sync/proj_depth/groundtruth/image_02/0000000264.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000253.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_30_drive_0016_sync/proj_depth/groundtruth/image_02/0000000253.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000209.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_30_drive_0016_sync/proj_depth/groundtruth/image_02/0000000209.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0016_sync/image_02/data/0000000121.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_09_30_drive_0016_sync/proj_depth/groundtruth/image_02/0000000121.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000000107.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000000107.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000002247.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000002247.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000001391.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000001391.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000000535.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000000535.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000001819.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000001819.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000001177.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000001177.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000000428.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000000428.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000001926.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000001926.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000000749.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000000749.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000001284.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000001284.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000002140.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000002140.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000001605.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000001605.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000001498.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000001498.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000000642.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000000642.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000002740.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000002740.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000002419.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000002419.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000000856.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000000856.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000002526.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000002526.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000001712.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000001712.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000001070.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000001070.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000002033.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000002033.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000000214.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000000214.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000000963.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000000963.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0018_sync/image_02/data/0000002633.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0018_sync/proj_depth/groundtruth/image_02/0000002633.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000533.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000000533.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000001040.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000001040.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000082.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000000082.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000205.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000000205.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000835.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000000835.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000451.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000000451.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000164.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000000164.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000794.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000000794.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000328.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000000328.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000615.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000000615.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000917.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000000917.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000369.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000000369.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000287.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000000287.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000123.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000000123.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000876.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000000876.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000410.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000000410.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000492.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000000492.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000958.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000000958.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000656.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000000656.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000753.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000000753.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000574.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000000574.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000001081.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000001081.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000041.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000000041.png
/mnt/bn/liheyang/Kitti/raw_data/2011_09_30/2011_09_30_drive_0027_sync/image_02/data/0000000246.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_09_30_drive_0027_sync/proj_depth/groundtruth/image_02/0000000246.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000002906.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000002906.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000002544.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000002544.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000000362.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000000362.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000004535.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000004535.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000000734.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000000734.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000001096.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000001096.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000004173.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000004173.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000000543.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000000543.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000001277.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000001277.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000004354.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000004354.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000001458.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000001458.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000001820.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000001820.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000003449.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000003449.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000003268.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000003268.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000000915.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000000915.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000002363.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000002363.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000002725.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000002725.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000000181.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000000181.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000001639.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000001639.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000003992.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000003992.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000003087.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000003087.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000002001.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000002001.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000003811.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000003811.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0027_sync/image_02/data/0000003630.png /mnt/bn/liheyang/Kitti/data_depth_annotated/train/2011_10_03_drive_0027_sync/proj_depth/groundtruth/image_02/0000003630.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000096.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000096.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000800.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000800.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000320.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000320.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000576.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000576.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000480.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000480.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000640.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000640.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000032.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000032.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000384.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000384.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000160.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000160.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000704.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000704.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000736.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000736.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000672.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000672.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000064.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000064.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000288.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000288.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000352.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000352.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000512.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000512.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000544.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000544.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000608.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000608.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000128.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000128.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000224.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000224.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000416.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000416.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000192.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000192.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000448.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000448.png
/mnt/bn/liheyang/Kitti/raw_data/2011_10_03/2011_10_03_drive_0047_sync/image_02/data/0000000768.png /mnt/bn/liheyang/Kitti/data_depth_annotated/val/2011_10_03_drive_0047_sync/proj_depth/groundtruth/image_02/0000000768.png

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,277 @@
import cv2
import math
import numpy as np
import torch
import torch.nn.functional as F
def apply_min_size(sample, size, image_interpolation_method=cv2.INTER_AREA):
"""Rezise the sample to ensure the given size. Keeps aspect ratio.
Args:
sample (dict): sample
size (tuple): image size
Returns:
tuple: new size
"""
shape = list(sample["disparity"].shape)
if shape[0] >= size[0] and shape[1] >= size[1]:
return sample
scale = [0, 0]
scale[0] = size[0] / shape[0]
scale[1] = size[1] / shape[1]
scale = max(scale)
shape[0] = math.ceil(scale * shape[0])
shape[1] = math.ceil(scale * shape[1])
# resize
sample["image"] = cv2.resize(
sample["image"], tuple(shape[::-1]), interpolation=image_interpolation_method
)
sample["disparity"] = cv2.resize(
sample["disparity"], tuple(shape[::-1]), interpolation=cv2.INTER_NEAREST
)
sample["mask"] = cv2.resize(
sample["mask"].astype(np.float32),
tuple(shape[::-1]),
interpolation=cv2.INTER_NEAREST,
)
sample["mask"] = sample["mask"].astype(bool)
return tuple(shape)
class Resize(object):
"""Resize sample to given size (width, height).
"""
def __init__(
self,
width,
height,
resize_target=True,
keep_aspect_ratio=False,
ensure_multiple_of=1,
resize_method="lower_bound",
image_interpolation_method=cv2.INTER_AREA,
):
"""Init.
Args:
width (int): desired output width
height (int): desired output height
resize_target (bool, optional):
True: Resize the full sample (image, mask, target).
False: Resize image only.
Defaults to True.
keep_aspect_ratio (bool, optional):
True: Keep the aspect ratio of the input sample.
Output sample might not have the given width and height, and
resize behaviour depends on the parameter 'resize_method'.
Defaults to False.
ensure_multiple_of (int, optional):
Output width and height is constrained to be multiple of this parameter.
Defaults to 1.
resize_method (str, optional):
"lower_bound": Output will be at least as large as the given size.
"upper_bound": Output will be at max as large as the given size. (Output size might be smaller than given size.)
"minimal": Scale as least as possible. (Output size might be smaller than given size.)
Defaults to "lower_bound".
"""
self.__width = width
self.__height = height
self.__resize_target = resize_target
self.__keep_aspect_ratio = keep_aspect_ratio
self.__multiple_of = ensure_multiple_of
self.__resize_method = resize_method
self.__image_interpolation_method = image_interpolation_method
def constrain_to_multiple_of(self, x, min_val=0, max_val=None):
y = (np.round(x / self.__multiple_of) * self.__multiple_of).astype(int)
if max_val is not None and y > max_val:
y = (np.floor(x / self.__multiple_of) * self.__multiple_of).astype(int)
if y < min_val:
y = (np.ceil(x / self.__multiple_of) * self.__multiple_of).astype(int)
return y
def get_size(self, width, height):
# determine new height and width
scale_height = self.__height / height
scale_width = self.__width / width
if self.__keep_aspect_ratio:
if self.__resize_method == "lower_bound":
# scale such that output size is lower bound
if scale_width > scale_height:
# fit width
scale_height = scale_width
else:
# fit height
scale_width = scale_height
elif self.__resize_method == "upper_bound":
# scale such that output size is upper bound
if scale_width < scale_height:
# fit width
scale_height = scale_width
else:
# fit height
scale_width = scale_height
elif self.__resize_method == "minimal":
# scale as least as possbile
if abs(1 - scale_width) < abs(1 - scale_height):
# fit width
scale_height = scale_width
else:
# fit height
scale_width = scale_height
else:
raise ValueError(
f"resize_method {self.__resize_method} not implemented"
)
if self.__resize_method == "lower_bound":
new_height = self.constrain_to_multiple_of(
scale_height * height, min_val=self.__height
)
new_width = self.constrain_to_multiple_of(
scale_width * width, min_val=self.__width
)
elif self.__resize_method == "upper_bound":
new_height = self.constrain_to_multiple_of(
scale_height * height, max_val=self.__height
)
new_width = self.constrain_to_multiple_of(
scale_width * width, max_val=self.__width
)
elif self.__resize_method == "minimal":
new_height = self.constrain_to_multiple_of(scale_height * height)
new_width = self.constrain_to_multiple_of(scale_width * width)
else:
raise ValueError(f"resize_method {self.__resize_method} not implemented")
return (new_width, new_height)
def __call__(self, sample):
width, height = self.get_size(
sample["image"].shape[1], sample["image"].shape[0]
)
# resize sample
sample["image"] = cv2.resize(
sample["image"],
(width, height),
interpolation=self.__image_interpolation_method,
)
if self.__resize_target:
if "disparity" in sample:
sample["disparity"] = cv2.resize(
sample["disparity"],
(width, height),
interpolation=cv2.INTER_NEAREST,
)
if "depth" in sample:
sample["depth"] = cv2.resize(
sample["depth"], (width, height), interpolation=cv2.INTER_NEAREST
)
if "semseg_mask" in sample:
# sample["semseg_mask"] = cv2.resize(
# sample["semseg_mask"], (width, height), interpolation=cv2.INTER_NEAREST
# )
sample["semseg_mask"] = F.interpolate(torch.from_numpy(sample["semseg_mask"]).float()[None, None, ...], (height, width), mode='nearest').numpy()[0, 0]
if "mask" in sample:
sample["mask"] = cv2.resize(
sample["mask"].astype(np.float32),
(width, height),
interpolation=cv2.INTER_NEAREST,
)
# sample["mask"] = sample["mask"].astype(bool)
# print(sample['image'].shape, sample['depth'].shape)
return sample
class NormalizeImage(object):
"""Normlize image by given mean and std.
"""
def __init__(self, mean, std):
self.__mean = mean
self.__std = std
def __call__(self, sample):
sample["image"] = (sample["image"] - self.__mean) / self.__std
return sample
class PrepareForNet(object):
"""Prepare sample for usage as network input.
"""
def __init__(self):
pass
def __call__(self, sample):
image = np.transpose(sample["image"], (2, 0, 1))
sample["image"] = np.ascontiguousarray(image).astype(np.float32)
if "mask" in sample:
sample["mask"] = sample["mask"].astype(np.float32)
sample["mask"] = np.ascontiguousarray(sample["mask"])
if "depth" in sample:
depth = sample["depth"].astype(np.float32)
sample["depth"] = np.ascontiguousarray(depth)
if "semseg_mask" in sample:
sample["semseg_mask"] = sample["semseg_mask"].astype(np.float32)
sample["semseg_mask"] = np.ascontiguousarray(sample["semseg_mask"])
return sample
class Crop(object):
"""Crop sample for batch-wise training. Image is of shape CxHxW
"""
def __init__(self, size):
if isinstance(size, int):
self.size = (size, size)
else:
self.size = size
def __call__(self, sample):
h, w = sample['image'].shape[-2:]
assert h >= self.size[0] and w >= self.size[1], 'Wrong size'
h_start = np.random.randint(0, h - self.size[0] + 1)
w_start = np.random.randint(0, w - self.size[1] + 1)
h_end = h_start + self.size[0]
w_end = w_start + self.size[1]
sample['image'] = sample['image'][:, h_start: h_end, w_start: w_end]
if "depth" in sample:
sample["depth"] = sample["depth"][h_start: h_end, w_start: w_end]
if "mask" in sample:
sample["mask"] = sample["mask"][h_start: h_end, w_start: w_end]
if "semseg_mask" in sample:
sample["semseg_mask"] = sample["semseg_mask"][h_start: h_end, w_start: w_end]
return sample

View File

@@ -0,0 +1,54 @@
import cv2
import torch
from torch.utils.data import Dataset
from torchvision.transforms import Compose
from dataset.transform import Resize, NormalizeImage, PrepareForNet, Crop
class VKITTI2(Dataset):
def __init__(self, filelist_path, mode, size=(518, 518)):
self.mode = mode
self.size = size
with open(filelist_path, 'r') as f:
self.filelist = f.read().splitlines()
net_w, net_h = size
self.transform = Compose([
Resize(
width=net_w,
height=net_h,
resize_target=True if mode == 'train' else False,
keep_aspect_ratio=True,
ensure_multiple_of=14,
resize_method='lower_bound',
image_interpolation_method=cv2.INTER_CUBIC,
),
NormalizeImage(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
PrepareForNet(),
] + ([Crop(size[0])] if self.mode == 'train' else []))
def __getitem__(self, item):
img_path = self.filelist[item].split(' ')[0]
depth_path = self.filelist[item].split(' ')[1]
image = cv2.imread(img_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) / 255.0
depth = cv2.imread(depth_path, cv2.IMREAD_ANYCOLOR | cv2.IMREAD_ANYDEPTH) / 100.0 # cm to m
sample = self.transform({'image': image, 'depth': depth})
sample['image'] = torch.from_numpy(sample['image'])
sample['depth'] = torch.from_numpy(sample['depth'])
sample['valid_mask'] = (sample['depth'] <= 80)
sample['image_path'] = self.filelist[item].split(' ')[0]
return sample
def __len__(self):
return len(self.filelist)

View File

@@ -0,0 +1,415 @@
# Copyright (c) Meta Platforms, Inc. and affiliates.
#
# This source code is licensed under the Apache License, Version 2.0
# found in the LICENSE file in the root directory of this source tree.
# References:
# https://github.com/facebookresearch/dino/blob/main/vision_transformer.py
# https://github.com/rwightman/pytorch-image-models/tree/master/timm/models/vision_transformer.py
from functools import partial
import math
import logging
from typing import Sequence, Tuple, Union, Callable
import torch
import torch.nn as nn
import torch.utils.checkpoint
from torch.nn.init import trunc_normal_
from .dinov2_layers import Mlp, PatchEmbed, SwiGLUFFNFused, MemEffAttention, NestedTensorBlock as Block
logger = logging.getLogger("dinov2")
def named_apply(fn: Callable, module: nn.Module, name="", depth_first=True, include_root=False) -> nn.Module:
if not depth_first and include_root:
fn(module=module, name=name)
for child_name, child_module in module.named_children():
child_name = ".".join((name, child_name)) if name else child_name
named_apply(fn=fn, module=child_module, name=child_name, depth_first=depth_first, include_root=True)
if depth_first and include_root:
fn(module=module, name=name)
return module
class BlockChunk(nn.ModuleList):
def forward(self, x):
for b in self:
x = b(x)
return x
class DinoVisionTransformer(nn.Module):
def __init__(
self,
img_size=224,
patch_size=16,
in_chans=3,
embed_dim=768,
depth=12,
num_heads=12,
mlp_ratio=4.0,
qkv_bias=True,
ffn_bias=True,
proj_bias=True,
drop_path_rate=0.0,
drop_path_uniform=False,
init_values=None, # for layerscale: None or 0 => no layerscale
embed_layer=PatchEmbed,
act_layer=nn.GELU,
block_fn=Block,
ffn_layer="mlp",
block_chunks=1,
num_register_tokens=0,
interpolate_antialias=False,
interpolate_offset=0.1,
):
"""
Args:
img_size (int, tuple): input image size
patch_size (int, tuple): patch size
in_chans (int): number of input channels
embed_dim (int): embedding dimension
depth (int): depth of transformer
num_heads (int): number of attention heads
mlp_ratio (int): ratio of mlp hidden dim to embedding dim
qkv_bias (bool): enable bias for qkv if True
proj_bias (bool): enable bias for proj in attn if True
ffn_bias (bool): enable bias for ffn if True
drop_path_rate (float): stochastic depth rate
drop_path_uniform (bool): apply uniform drop rate across blocks
weight_init (str): weight init scheme
init_values (float): layer-scale init values
embed_layer (nn.Module): patch embedding layer
act_layer (nn.Module): MLP activation layer
block_fn (nn.Module): transformer block class
ffn_layer (str): "mlp", "swiglu", "swiglufused" or "identity"
block_chunks: (int) split block sequence into block_chunks units for FSDP wrap
num_register_tokens: (int) number of extra cls tokens (so-called "registers")
interpolate_antialias: (str) flag to apply anti-aliasing when interpolating positional embeddings
interpolate_offset: (float) work-around offset to apply when interpolating positional embeddings
"""
super().__init__()
norm_layer = partial(nn.LayerNorm, eps=1e-6)
self.num_features = self.embed_dim = embed_dim # num_features for consistency with other models
self.num_tokens = 1
self.n_blocks = depth
self.num_heads = num_heads
self.patch_size = patch_size
self.num_register_tokens = num_register_tokens
self.interpolate_antialias = interpolate_antialias
self.interpolate_offset = interpolate_offset
self.patch_embed = embed_layer(img_size=img_size, patch_size=patch_size, in_chans=in_chans, embed_dim=embed_dim)
num_patches = self.patch_embed.num_patches
self.cls_token = nn.Parameter(torch.zeros(1, 1, embed_dim))
self.pos_embed = nn.Parameter(torch.zeros(1, num_patches + self.num_tokens, embed_dim))
assert num_register_tokens >= 0
self.register_tokens = (
nn.Parameter(torch.zeros(1, num_register_tokens, embed_dim)) if num_register_tokens else None
)
if drop_path_uniform is True:
dpr = [drop_path_rate] * depth
else:
dpr = [x.item() for x in torch.linspace(0, drop_path_rate, depth)] # stochastic depth decay rule
if ffn_layer == "mlp":
logger.info("using MLP layer as FFN")
ffn_layer = Mlp
elif ffn_layer == "swiglufused" or ffn_layer == "swiglu":
logger.info("using SwiGLU layer as FFN")
ffn_layer = SwiGLUFFNFused
elif ffn_layer == "identity":
logger.info("using Identity layer as FFN")
def f(*args, **kwargs):
return nn.Identity()
ffn_layer = f
else:
raise NotImplementedError
blocks_list = [
block_fn(
dim=embed_dim,
num_heads=num_heads,
mlp_ratio=mlp_ratio,
qkv_bias=qkv_bias,
proj_bias=proj_bias,
ffn_bias=ffn_bias,
drop_path=dpr[i],
norm_layer=norm_layer,
act_layer=act_layer,
ffn_layer=ffn_layer,
init_values=init_values,
)
for i in range(depth)
]
if block_chunks > 0:
self.chunked_blocks = True
chunked_blocks = []
chunksize = depth // block_chunks
for i in range(0, depth, chunksize):
# this is to keep the block index consistent if we chunk the block list
chunked_blocks.append([nn.Identity()] * i + blocks_list[i : i + chunksize])
self.blocks = nn.ModuleList([BlockChunk(p) for p in chunked_blocks])
else:
self.chunked_blocks = False
self.blocks = nn.ModuleList(blocks_list)
self.norm = norm_layer(embed_dim)
self.head = nn.Identity()
self.mask_token = nn.Parameter(torch.zeros(1, embed_dim))
self.init_weights()
def init_weights(self):
trunc_normal_(self.pos_embed, std=0.02)
nn.init.normal_(self.cls_token, std=1e-6)
if self.register_tokens is not None:
nn.init.normal_(self.register_tokens, std=1e-6)
named_apply(init_weights_vit_timm, self)
def interpolate_pos_encoding(self, x, w, h):
previous_dtype = x.dtype
npatch = x.shape[1] - 1
N = self.pos_embed.shape[1] - 1
if npatch == N and w == h:
return self.pos_embed
pos_embed = self.pos_embed.float()
class_pos_embed = pos_embed[:, 0]
patch_pos_embed = pos_embed[:, 1:]
dim = x.shape[-1]
w0 = w // self.patch_size
h0 = h // self.patch_size
# we add a small number to avoid floating point error in the interpolation
# see discussion at https://github.com/facebookresearch/dino/issues/8
# DINOv2 with register modify the interpolate_offset from 0.1 to 0.0
w0, h0 = w0 + self.interpolate_offset, h0 + self.interpolate_offset
# w0, h0 = w0 + 0.1, h0 + 0.1
sqrt_N = math.sqrt(N)
sx, sy = float(w0) / sqrt_N, float(h0) / sqrt_N
patch_pos_embed = nn.functional.interpolate(
patch_pos_embed.reshape(1, int(sqrt_N), int(sqrt_N), dim).permute(0, 3, 1, 2),
scale_factor=(sx, sy),
# (int(w0), int(h0)), # to solve the upsampling shape issue
mode="bicubic",
antialias=self.interpolate_antialias
)
assert int(w0) == patch_pos_embed.shape[-2]
assert int(h0) == patch_pos_embed.shape[-1]
patch_pos_embed = patch_pos_embed.permute(0, 2, 3, 1).view(1, -1, dim)
return torch.cat((class_pos_embed.unsqueeze(0), patch_pos_embed), dim=1).to(previous_dtype)
def prepare_tokens_with_masks(self, x, masks=None):
B, nc, w, h = x.shape
x = self.patch_embed(x)
if masks is not None:
x = torch.where(masks.unsqueeze(-1), self.mask_token.to(x.dtype).unsqueeze(0), x)
x = torch.cat((self.cls_token.expand(x.shape[0], -1, -1), x), dim=1)
x = x + self.interpolate_pos_encoding(x, w, h)
if self.register_tokens is not None:
x = torch.cat(
(
x[:, :1],
self.register_tokens.expand(x.shape[0], -1, -1),
x[:, 1:],
),
dim=1,
)
return x
def forward_features_list(self, x_list, masks_list):
x = [self.prepare_tokens_with_masks(x, masks) for x, masks in zip(x_list, masks_list)]
for blk in self.blocks:
x = blk(x)
all_x = x
output = []
for x, masks in zip(all_x, masks_list):
x_norm = self.norm(x)
output.append(
{
"x_norm_clstoken": x_norm[:, 0],
"x_norm_regtokens": x_norm[:, 1 : self.num_register_tokens + 1],
"x_norm_patchtokens": x_norm[:, self.num_register_tokens + 1 :],
"x_prenorm": x,
"masks": masks,
}
)
return output
def forward_features(self, x, masks=None):
if isinstance(x, list):
return self.forward_features_list(x, masks)
x = self.prepare_tokens_with_masks(x, masks)
for blk in self.blocks:
x = blk(x)
x_norm = self.norm(x)
return {
"x_norm_clstoken": x_norm[:, 0],
"x_norm_regtokens": x_norm[:, 1 : self.num_register_tokens + 1],
"x_norm_patchtokens": x_norm[:, self.num_register_tokens + 1 :],
"x_prenorm": x,
"masks": masks,
}
def _get_intermediate_layers_not_chunked(self, x, n=1):
x = self.prepare_tokens_with_masks(x)
# If n is an int, take the n last blocks. If it's a list, take them
output, total_block_len = [], len(self.blocks)
blocks_to_take = range(total_block_len - n, total_block_len) if isinstance(n, int) else n
for i, blk in enumerate(self.blocks):
x = blk(x)
if i in blocks_to_take:
output.append(x)
assert len(output) == len(blocks_to_take), f"only {len(output)} / {len(blocks_to_take)} blocks found"
return output
def _get_intermediate_layers_chunked(self, x, n=1):
x = self.prepare_tokens_with_masks(x)
output, i, total_block_len = [], 0, len(self.blocks[-1])
# If n is an int, take the n last blocks. If it's a list, take them
blocks_to_take = range(total_block_len - n, total_block_len) if isinstance(n, int) else n
for block_chunk in self.blocks:
for blk in block_chunk[i:]: # Passing the nn.Identity()
x = blk(x)
if i in blocks_to_take:
output.append(x)
i += 1
assert len(output) == len(blocks_to_take), f"only {len(output)} / {len(blocks_to_take)} blocks found"
return output
def get_intermediate_layers(
self,
x: torch.Tensor,
n: Union[int, Sequence] = 1, # Layers or n last layers to take
reshape: bool = False,
return_class_token: bool = False,
norm=True
) -> Tuple[Union[torch.Tensor, Tuple[torch.Tensor]]]:
if self.chunked_blocks:
outputs = self._get_intermediate_layers_chunked(x, n)
else:
outputs = self._get_intermediate_layers_not_chunked(x, n)
if norm:
outputs = [self.norm(out) for out in outputs]
class_tokens = [out[:, 0] for out in outputs]
outputs = [out[:, 1 + self.num_register_tokens:] for out in outputs]
if reshape:
B, _, w, h = x.shape
outputs = [
out.reshape(B, w // self.patch_size, h // self.patch_size, -1).permute(0, 3, 1, 2).contiguous()
for out in outputs
]
if return_class_token:
return tuple(zip(outputs, class_tokens))
return tuple(outputs)
def forward(self, *args, is_training=False, **kwargs):
ret = self.forward_features(*args, **kwargs)
if is_training:
return ret
else:
return self.head(ret["x_norm_clstoken"])
def init_weights_vit_timm(module: nn.Module, name: str = ""):
"""ViT weight initialization, original timm impl (for reproducibility)"""
if isinstance(module, nn.Linear):
trunc_normal_(module.weight, std=0.02)
if module.bias is not None:
nn.init.zeros_(module.bias)
def vit_small(patch_size=16, num_register_tokens=0, **kwargs):
model = DinoVisionTransformer(
patch_size=patch_size,
embed_dim=384,
depth=12,
num_heads=6,
mlp_ratio=4,
block_fn=partial(Block, attn_class=MemEffAttention),
num_register_tokens=num_register_tokens,
**kwargs,
)
return model
def vit_base(patch_size=16, num_register_tokens=0, **kwargs):
model = DinoVisionTransformer(
patch_size=patch_size,
embed_dim=768,
depth=12,
num_heads=12,
mlp_ratio=4,
block_fn=partial(Block, attn_class=MemEffAttention),
num_register_tokens=num_register_tokens,
**kwargs,
)
return model
def vit_large(patch_size=16, num_register_tokens=0, **kwargs):
model = DinoVisionTransformer(
patch_size=patch_size,
embed_dim=1024,
depth=24,
num_heads=16,
mlp_ratio=4,
block_fn=partial(Block, attn_class=MemEffAttention),
num_register_tokens=num_register_tokens,
**kwargs,
)
return model
def vit_giant2(patch_size=16, num_register_tokens=0, **kwargs):
"""
Close to ViT-giant, with embed-dim 1536 and 24 heads => embed-dim per head 64
"""
model = DinoVisionTransformer(
patch_size=patch_size,
embed_dim=1536,
depth=40,
num_heads=24,
mlp_ratio=4,
block_fn=partial(Block, attn_class=MemEffAttention),
num_register_tokens=num_register_tokens,
**kwargs,
)
return model
def DINOv2(model_name):
model_zoo = {
"vits": vit_small,
"vitb": vit_base,
"vitl": vit_large,
"vitg": vit_giant2
}
return model_zoo[model_name](
img_size=518,
patch_size=14,
init_values=1.0,
ffn_layer="mlp" if model_name != "vitg" else "swiglufused",
block_chunks=0,
num_register_tokens=0,
interpolate_antialias=False,
interpolate_offset=0.1
)

View File

@@ -0,0 +1,11 @@
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
from .mlp import Mlp
from .patch_embed import PatchEmbed
from .swiglu_ffn import SwiGLUFFN, SwiGLUFFNFused
from .block import NestedTensorBlock
from .attention import MemEffAttention

View File

@@ -0,0 +1,83 @@
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
# References:
# https://github.com/facebookresearch/dino/blob/master/vision_transformer.py
# https://github.com/rwightman/pytorch-image-models/tree/master/timm/models/vision_transformer.py
import logging
from torch import Tensor
from torch import nn
logger = logging.getLogger("dinov2")
try:
from xformers.ops import memory_efficient_attention, unbind, fmha
XFORMERS_AVAILABLE = True
except ImportError:
logger.warning("xFormers not available")
XFORMERS_AVAILABLE = False
class Attention(nn.Module):
def __init__(
self,
dim: int,
num_heads: int = 8,
qkv_bias: bool = False,
proj_bias: bool = True,
attn_drop: float = 0.0,
proj_drop: float = 0.0,
) -> None:
super().__init__()
self.num_heads = num_heads
head_dim = dim // num_heads
self.scale = head_dim**-0.5
self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias)
self.attn_drop = nn.Dropout(attn_drop)
self.proj = nn.Linear(dim, dim, bias=proj_bias)
self.proj_drop = nn.Dropout(proj_drop)
def forward(self, x: Tensor) -> Tensor:
B, N, C = x.shape
qkv = self.qkv(x).reshape(B, N, 3, self.num_heads, C // self.num_heads).permute(2, 0, 3, 1, 4)
q, k, v = qkv[0] * self.scale, qkv[1], qkv[2]
attn = q @ k.transpose(-2, -1)
attn = attn.softmax(dim=-1)
attn = self.attn_drop(attn)
x = (attn @ v).transpose(1, 2).reshape(B, N, C)
x = self.proj(x)
x = self.proj_drop(x)
return x
class MemEffAttention(Attention):
def forward(self, x: Tensor, attn_bias=None) -> Tensor:
if not XFORMERS_AVAILABLE:
assert attn_bias is None, "xFormers is required for nested tensors usage"
return super().forward(x)
B, N, C = x.shape
qkv = self.qkv(x).reshape(B, N, 3, self.num_heads, C // self.num_heads)
q, k, v = unbind(qkv, 2)
x = memory_efficient_attention(q, k, v, attn_bias=attn_bias)
x = x.reshape([B, N, C])
x = self.proj(x)
x = self.proj_drop(x)
return x

View File

@@ -0,0 +1,252 @@
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
# References:
# https://github.com/facebookresearch/dino/blob/master/vision_transformer.py
# https://github.com/rwightman/pytorch-image-models/tree/master/timm/layers/patch_embed.py
import logging
from typing import Callable, List, Any, Tuple, Dict
import torch
from torch import nn, Tensor
from .attention import Attention, MemEffAttention
from .drop_path import DropPath
from .layer_scale import LayerScale
from .mlp import Mlp
logger = logging.getLogger("dinov2")
try:
from xformers.ops import fmha
from xformers.ops import scaled_index_add, index_select_cat
XFORMERS_AVAILABLE = True
except ImportError:
logger.warning("xFormers not available")
XFORMERS_AVAILABLE = False
class Block(nn.Module):
def __init__(
self,
dim: int,
num_heads: int,
mlp_ratio: float = 4.0,
qkv_bias: bool = False,
proj_bias: bool = True,
ffn_bias: bool = True,
drop: float = 0.0,
attn_drop: float = 0.0,
init_values=None,
drop_path: float = 0.0,
act_layer: Callable[..., nn.Module] = nn.GELU,
norm_layer: Callable[..., nn.Module] = nn.LayerNorm,
attn_class: Callable[..., nn.Module] = Attention,
ffn_layer: Callable[..., nn.Module] = Mlp,
) -> None:
super().__init__()
# print(f"biases: qkv: {qkv_bias}, proj: {proj_bias}, ffn: {ffn_bias}")
self.norm1 = norm_layer(dim)
self.attn = attn_class(
dim,
num_heads=num_heads,
qkv_bias=qkv_bias,
proj_bias=proj_bias,
attn_drop=attn_drop,
proj_drop=drop,
)
self.ls1 = LayerScale(dim, init_values=init_values) if init_values else nn.Identity()
self.drop_path1 = DropPath(drop_path) if drop_path > 0.0 else nn.Identity()
self.norm2 = norm_layer(dim)
mlp_hidden_dim = int(dim * mlp_ratio)
self.mlp = ffn_layer(
in_features=dim,
hidden_features=mlp_hidden_dim,
act_layer=act_layer,
drop=drop,
bias=ffn_bias,
)
self.ls2 = LayerScale(dim, init_values=init_values) if init_values else nn.Identity()
self.drop_path2 = DropPath(drop_path) if drop_path > 0.0 else nn.Identity()
self.sample_drop_ratio = drop_path
def forward(self, x: Tensor) -> Tensor:
def attn_residual_func(x: Tensor) -> Tensor:
return self.ls1(self.attn(self.norm1(x)))
def ffn_residual_func(x: Tensor) -> Tensor:
return self.ls2(self.mlp(self.norm2(x)))
if self.training and self.sample_drop_ratio > 0.1:
# the overhead is compensated only for a drop path rate larger than 0.1
x = drop_add_residual_stochastic_depth(
x,
residual_func=attn_residual_func,
sample_drop_ratio=self.sample_drop_ratio,
)
x = drop_add_residual_stochastic_depth(
x,
residual_func=ffn_residual_func,
sample_drop_ratio=self.sample_drop_ratio,
)
elif self.training and self.sample_drop_ratio > 0.0:
x = x + self.drop_path1(attn_residual_func(x))
x = x + self.drop_path1(ffn_residual_func(x)) # FIXME: drop_path2
else:
x = x + attn_residual_func(x)
x = x + ffn_residual_func(x)
return x
def drop_add_residual_stochastic_depth(
x: Tensor,
residual_func: Callable[[Tensor], Tensor],
sample_drop_ratio: float = 0.0,
) -> Tensor:
# 1) extract subset using permutation
b, n, d = x.shape
sample_subset_size = max(int(b * (1 - sample_drop_ratio)), 1)
brange = (torch.randperm(b, device=x.device))[:sample_subset_size]
x_subset = x[brange]
# 2) apply residual_func to get residual
residual = residual_func(x_subset)
x_flat = x.flatten(1)
residual = residual.flatten(1)
residual_scale_factor = b / sample_subset_size
# 3) add the residual
x_plus_residual = torch.index_add(x_flat, 0, brange, residual.to(dtype=x.dtype), alpha=residual_scale_factor)
return x_plus_residual.view_as(x)
def get_branges_scales(x, sample_drop_ratio=0.0):
b, n, d = x.shape
sample_subset_size = max(int(b * (1 - sample_drop_ratio)), 1)
brange = (torch.randperm(b, device=x.device))[:sample_subset_size]
residual_scale_factor = b / sample_subset_size
return brange, residual_scale_factor
def add_residual(x, brange, residual, residual_scale_factor, scaling_vector=None):
if scaling_vector is None:
x_flat = x.flatten(1)
residual = residual.flatten(1)
x_plus_residual = torch.index_add(x_flat, 0, brange, residual.to(dtype=x.dtype), alpha=residual_scale_factor)
else:
x_plus_residual = scaled_index_add(
x, brange, residual.to(dtype=x.dtype), scaling=scaling_vector, alpha=residual_scale_factor
)
return x_plus_residual
attn_bias_cache: Dict[Tuple, Any] = {}
def get_attn_bias_and_cat(x_list, branges=None):
"""
this will perform the index select, cat the tensors, and provide the attn_bias from cache
"""
batch_sizes = [b.shape[0] for b in branges] if branges is not None else [x.shape[0] for x in x_list]
all_shapes = tuple((b, x.shape[1]) for b, x in zip(batch_sizes, x_list))
if all_shapes not in attn_bias_cache.keys():
seqlens = []
for b, x in zip(batch_sizes, x_list):
for _ in range(b):
seqlens.append(x.shape[1])
attn_bias = fmha.BlockDiagonalMask.from_seqlens(seqlens)
attn_bias._batch_sizes = batch_sizes
attn_bias_cache[all_shapes] = attn_bias
if branges is not None:
cat_tensors = index_select_cat([x.flatten(1) for x in x_list], branges).view(1, -1, x_list[0].shape[-1])
else:
tensors_bs1 = tuple(x.reshape([1, -1, *x.shape[2:]]) for x in x_list)
cat_tensors = torch.cat(tensors_bs1, dim=1)
return attn_bias_cache[all_shapes], cat_tensors
def drop_add_residual_stochastic_depth_list(
x_list: List[Tensor],
residual_func: Callable[[Tensor, Any], Tensor],
sample_drop_ratio: float = 0.0,
scaling_vector=None,
) -> Tensor:
# 1) generate random set of indices for dropping samples in the batch
branges_scales = [get_branges_scales(x, sample_drop_ratio=sample_drop_ratio) for x in x_list]
branges = [s[0] for s in branges_scales]
residual_scale_factors = [s[1] for s in branges_scales]
# 2) get attention bias and index+concat the tensors
attn_bias, x_cat = get_attn_bias_and_cat(x_list, branges)
# 3) apply residual_func to get residual, and split the result
residual_list = attn_bias.split(residual_func(x_cat, attn_bias=attn_bias)) # type: ignore
outputs = []
for x, brange, residual, residual_scale_factor in zip(x_list, branges, residual_list, residual_scale_factors):
outputs.append(add_residual(x, brange, residual, residual_scale_factor, scaling_vector).view_as(x))
return outputs
class NestedTensorBlock(Block):
def forward_nested(self, x_list: List[Tensor]) -> List[Tensor]:
"""
x_list contains a list of tensors to nest together and run
"""
assert isinstance(self.attn, MemEffAttention)
if self.training and self.sample_drop_ratio > 0.0:
def attn_residual_func(x: Tensor, attn_bias=None) -> Tensor:
return self.attn(self.norm1(x), attn_bias=attn_bias)
def ffn_residual_func(x: Tensor, attn_bias=None) -> Tensor:
return self.mlp(self.norm2(x))
x_list = drop_add_residual_stochastic_depth_list(
x_list,
residual_func=attn_residual_func,
sample_drop_ratio=self.sample_drop_ratio,
scaling_vector=self.ls1.gamma if isinstance(self.ls1, LayerScale) else None,
)
x_list = drop_add_residual_stochastic_depth_list(
x_list,
residual_func=ffn_residual_func,
sample_drop_ratio=self.sample_drop_ratio,
scaling_vector=self.ls2.gamma if isinstance(self.ls1, LayerScale) else None,
)
return x_list
else:
def attn_residual_func(x: Tensor, attn_bias=None) -> Tensor:
return self.ls1(self.attn(self.norm1(x), attn_bias=attn_bias))
def ffn_residual_func(x: Tensor, attn_bias=None) -> Tensor:
return self.ls2(self.mlp(self.norm2(x)))
attn_bias, x = get_attn_bias_and_cat(x_list)
x = x + attn_residual_func(x, attn_bias=attn_bias)
x = x + ffn_residual_func(x)
return attn_bias.split(x)
def forward(self, x_or_x_list):
if isinstance(x_or_x_list, Tensor):
return super().forward(x_or_x_list)
elif isinstance(x_or_x_list, list):
assert XFORMERS_AVAILABLE, "Please install xFormers for nested tensors usage"
return self.forward_nested(x_or_x_list)
else:
raise AssertionError

View File

@@ -0,0 +1,35 @@
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
# References:
# https://github.com/facebookresearch/dino/blob/master/vision_transformer.py
# https://github.com/rwightman/pytorch-image-models/tree/master/timm/layers/drop.py
from torch import nn
def drop_path(x, drop_prob: float = 0.0, training: bool = False):
if drop_prob == 0.0 or not training:
return x
keep_prob = 1 - drop_prob
shape = (x.shape[0],) + (1,) * (x.ndim - 1) # work with diff dim tensors, not just 2D ConvNets
random_tensor = x.new_empty(shape).bernoulli_(keep_prob)
if keep_prob > 0.0:
random_tensor.div_(keep_prob)
output = x * random_tensor
return output
class DropPath(nn.Module):
"""Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks)."""
def __init__(self, drop_prob=None):
super(DropPath, self).__init__()
self.drop_prob = drop_prob
def forward(self, x):
return drop_path(x, self.drop_prob, self.training)

View File

@@ -0,0 +1,28 @@
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
# Modified from: https://github.com/huggingface/pytorch-image-models/blob/main/timm/models/vision_transformer.py#L103-L110
from typing import Union
import torch
from torch import Tensor
from torch import nn
class LayerScale(nn.Module):
def __init__(
self,
dim: int,
init_values: Union[float, Tensor] = 1e-5,
inplace: bool = False,
) -> None:
super().__init__()
self.inplace = inplace
self.gamma = nn.Parameter(init_values * torch.ones(dim))
def forward(self, x: Tensor) -> Tensor:
return x.mul_(self.gamma) if self.inplace else x * self.gamma

View File

@@ -0,0 +1,41 @@
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
# References:
# https://github.com/facebookresearch/dino/blob/master/vision_transformer.py
# https://github.com/rwightman/pytorch-image-models/tree/master/timm/layers/mlp.py
from typing import Callable, Optional
from torch import Tensor, nn
class Mlp(nn.Module):
def __init__(
self,
in_features: int,
hidden_features: Optional[int] = None,
out_features: Optional[int] = None,
act_layer: Callable[..., nn.Module] = nn.GELU,
drop: float = 0.0,
bias: bool = True,
) -> None:
super().__init__()
out_features = out_features or in_features
hidden_features = hidden_features or in_features
self.fc1 = nn.Linear(in_features, hidden_features, bias=bias)
self.act = act_layer()
self.fc2 = nn.Linear(hidden_features, out_features, bias=bias)
self.drop = nn.Dropout(drop)
def forward(self, x: Tensor) -> Tensor:
x = self.fc1(x)
x = self.act(x)
x = self.drop(x)
x = self.fc2(x)
x = self.drop(x)
return x

View File

@@ -0,0 +1,89 @@
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
# References:
# https://github.com/facebookresearch/dino/blob/master/vision_transformer.py
# https://github.com/rwightman/pytorch-image-models/tree/master/timm/layers/patch_embed.py
from typing import Callable, Optional, Tuple, Union
from torch import Tensor
import torch.nn as nn
def make_2tuple(x):
if isinstance(x, tuple):
assert len(x) == 2
return x
assert isinstance(x, int)
return (x, x)
class PatchEmbed(nn.Module):
"""
2D image to patch embedding: (B,C,H,W) -> (B,N,D)
Args:
img_size: Image size.
patch_size: Patch token size.
in_chans: Number of input image channels.
embed_dim: Number of linear projection output channels.
norm_layer: Normalization layer.
"""
def __init__(
self,
img_size: Union[int, Tuple[int, int]] = 224,
patch_size: Union[int, Tuple[int, int]] = 16,
in_chans: int = 3,
embed_dim: int = 768,
norm_layer: Optional[Callable] = None,
flatten_embedding: bool = True,
) -> None:
super().__init__()
image_HW = make_2tuple(img_size)
patch_HW = make_2tuple(patch_size)
patch_grid_size = (
image_HW[0] // patch_HW[0],
image_HW[1] // patch_HW[1],
)
self.img_size = image_HW
self.patch_size = patch_HW
self.patches_resolution = patch_grid_size
self.num_patches = patch_grid_size[0] * patch_grid_size[1]
self.in_chans = in_chans
self.embed_dim = embed_dim
self.flatten_embedding = flatten_embedding
self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_HW, stride=patch_HW)
self.norm = norm_layer(embed_dim) if norm_layer else nn.Identity()
def forward(self, x: Tensor) -> Tensor:
_, _, H, W = x.shape
patch_H, patch_W = self.patch_size
assert H % patch_H == 0, f"Input image height {H} is not a multiple of patch height {patch_H}"
assert W % patch_W == 0, f"Input image width {W} is not a multiple of patch width: {patch_W}"
x = self.proj(x) # B C H W
H, W = x.size(2), x.size(3)
x = x.flatten(2).transpose(1, 2) # B HW C
x = self.norm(x)
if not self.flatten_embedding:
x = x.reshape(-1, H, W, self.embed_dim) # B H W C
return x
def flops(self) -> float:
Ho, Wo = self.patches_resolution
flops = Ho * Wo * self.embed_dim * self.in_chans * (self.patch_size[0] * self.patch_size[1])
if self.norm is not None:
flops += Ho * Wo * self.embed_dim
return flops

View File

@@ -0,0 +1,63 @@
# Copyright (c) Meta Platforms, Inc. and affiliates.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
from typing import Callable, Optional
from torch import Tensor, nn
import torch.nn.functional as F
class SwiGLUFFN(nn.Module):
def __init__(
self,
in_features: int,
hidden_features: Optional[int] = None,
out_features: Optional[int] = None,
act_layer: Callable[..., nn.Module] = None,
drop: float = 0.0,
bias: bool = True,
) -> None:
super().__init__()
out_features = out_features or in_features
hidden_features = hidden_features or in_features
self.w12 = nn.Linear(in_features, 2 * hidden_features, bias=bias)
self.w3 = nn.Linear(hidden_features, out_features, bias=bias)
def forward(self, x: Tensor) -> Tensor:
x12 = self.w12(x)
x1, x2 = x12.chunk(2, dim=-1)
hidden = F.silu(x1) * x2
return self.w3(hidden)
try:
from xformers.ops import SwiGLU
XFORMERS_AVAILABLE = True
except ImportError:
SwiGLU = SwiGLUFFN
XFORMERS_AVAILABLE = False
class SwiGLUFFNFused(SwiGLU):
def __init__(
self,
in_features: int,
hidden_features: Optional[int] = None,
out_features: Optional[int] = None,
act_layer: Callable[..., nn.Module] = None,
drop: float = 0.0,
bias: bool = True,
) -> None:
out_features = out_features or in_features
hidden_features = hidden_features or in_features
hidden_features = (int(hidden_features * 2 / 3) + 7) // 8 * 8
super().__init__(
in_features=in_features,
hidden_features=hidden_features,
out_features=out_features,
bias=bias,
)

View File

@@ -0,0 +1,222 @@
import cv2
import torch
import torch.nn as nn
import torch.nn.functional as F
from torchvision.transforms import Compose
from .dinov2 import DINOv2
from .util.blocks import FeatureFusionBlock, _make_scratch
from .util.transform import Resize, NormalizeImage, PrepareForNet
def _make_fusion_block(features, use_bn, size=None):
return FeatureFusionBlock(
features,
nn.ReLU(False),
deconv=False,
bn=use_bn,
expand=False,
align_corners=True,
size=size,
)
class ConvBlock(nn.Module):
def __init__(self, in_feature, out_feature):
super().__init__()
self.conv_block = nn.Sequential(
nn.Conv2d(in_feature, out_feature, kernel_size=3, stride=1, padding=1),
nn.BatchNorm2d(out_feature),
nn.ReLU(True)
)
def forward(self, x):
return self.conv_block(x)
class DPTHead(nn.Module):
def __init__(
self,
in_channels,
features=256,
use_bn=False,
out_channels=[256, 512, 1024, 1024],
use_clstoken=False
):
super(DPTHead, self).__init__()
self.use_clstoken = use_clstoken
self.projects = nn.ModuleList([
nn.Conv2d(
in_channels=in_channels,
out_channels=out_channel,
kernel_size=1,
stride=1,
padding=0,
) for out_channel in out_channels
])
self.resize_layers = nn.ModuleList([
nn.ConvTranspose2d(
in_channels=out_channels[0],
out_channels=out_channels[0],
kernel_size=4,
stride=4,
padding=0),
nn.ConvTranspose2d(
in_channels=out_channels[1],
out_channels=out_channels[1],
kernel_size=2,
stride=2,
padding=0),
nn.Identity(),
nn.Conv2d(
in_channels=out_channels[3],
out_channels=out_channels[3],
kernel_size=3,
stride=2,
padding=1)
])
if use_clstoken:
self.readout_projects = nn.ModuleList()
for _ in range(len(self.projects)):
self.readout_projects.append(
nn.Sequential(
nn.Linear(2 * in_channels, in_channels),
nn.GELU()))
self.scratch = _make_scratch(
out_channels,
features,
groups=1,
expand=False,
)
self.scratch.stem_transpose = None
self.scratch.refinenet1 = _make_fusion_block(features, use_bn)
self.scratch.refinenet2 = _make_fusion_block(features, use_bn)
self.scratch.refinenet3 = _make_fusion_block(features, use_bn)
self.scratch.refinenet4 = _make_fusion_block(features, use_bn)
head_features_1 = features
head_features_2 = 32
self.scratch.output_conv1 = nn.Conv2d(head_features_1, head_features_1 // 2, kernel_size=3, stride=1, padding=1)
self.scratch.output_conv2 = nn.Sequential(
nn.Conv2d(head_features_1 // 2, head_features_2, kernel_size=3, stride=1, padding=1),
nn.ReLU(True),
nn.Conv2d(head_features_2, 1, kernel_size=1, stride=1, padding=0),
nn.Sigmoid()
)
def forward(self, out_features, patch_h, patch_w):
out = []
for i, x in enumerate(out_features):
if self.use_clstoken:
x, cls_token = x[0], x[1]
readout = cls_token.unsqueeze(1).expand_as(x)
x = self.readout_projects[i](torch.cat((x, readout), -1))
else:
x = x[0]
x = x.permute(0, 2, 1).reshape((x.shape[0], x.shape[-1], patch_h, patch_w))
x = self.projects[i](x)
x = self.resize_layers[i](x)
out.append(x)
layer_1, layer_2, layer_3, layer_4 = out
layer_1_rn = self.scratch.layer1_rn(layer_1)
layer_2_rn = self.scratch.layer2_rn(layer_2)
layer_3_rn = self.scratch.layer3_rn(layer_3)
layer_4_rn = self.scratch.layer4_rn(layer_4)
path_4 = self.scratch.refinenet4(layer_4_rn, size=layer_3_rn.shape[2:])
path_3 = self.scratch.refinenet3(path_4, layer_3_rn, size=layer_2_rn.shape[2:])
path_2 = self.scratch.refinenet2(path_3, layer_2_rn, size=layer_1_rn.shape[2:])
path_1 = self.scratch.refinenet1(path_2, layer_1_rn)
out = self.scratch.output_conv1(path_1)
out = F.interpolate(out, (int(patch_h * 14), int(patch_w * 14)), mode="bilinear", align_corners=True)
out = self.scratch.output_conv2(out)
return out
class DepthAnythingV2(nn.Module):
def __init__(
self,
encoder='vitl',
features=256,
out_channels=[256, 512, 1024, 1024],
use_bn=False,
use_clstoken=False,
max_depth=20.0
):
super(DepthAnythingV2, self).__init__()
self.intermediate_layer_idx = {
'vits': [2, 5, 8, 11],
'vitb': [2, 5, 8, 11],
'vitl': [4, 11, 17, 23],
'vitg': [9, 19, 29, 39]
}
self.max_depth = max_depth
self.encoder = encoder
self.pretrained = DINOv2(model_name=encoder)
self.depth_head = DPTHead(self.pretrained.embed_dim, features, use_bn, out_channels=out_channels, use_clstoken=use_clstoken)
def forward(self, x):
patch_h, patch_w = x.shape[-2] // 14, x.shape[-1] // 14
features = self.pretrained.get_intermediate_layers(x, self.intermediate_layer_idx[self.encoder], return_class_token=True)
depth = self.depth_head(features, patch_h, patch_w) * self.max_depth
return depth.squeeze(1)
@torch.no_grad()
def infer_image(self, raw_image, input_size=518):
image, (h, w) = self.image2tensor(raw_image, input_size)
depth = self.forward(image)
depth = F.interpolate(depth[:, None], (h, w), mode="bilinear", align_corners=True)[0, 0]
return depth.cpu().numpy()
def image2tensor(self, raw_image, input_size=518):
transform = Compose([
Resize(
width=input_size,
height=input_size,
resize_target=False,
keep_aspect_ratio=True,
ensure_multiple_of=14,
resize_method='lower_bound',
image_interpolation_method=cv2.INTER_CUBIC,
),
NormalizeImage(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
PrepareForNet(),
])
h, w = raw_image.shape[:2]
image = cv2.cvtColor(raw_image, cv2.COLOR_BGR2RGB) / 255.0
image = transform({'image': image})['image']
image = torch.from_numpy(image).unsqueeze(0)
DEVICE = 'cuda' if torch.cuda.is_available() else 'mps' if torch.backends.mps.is_available() else 'cpu'
image = image.to(DEVICE)
return image, (h, w)

View File

@@ -0,0 +1,148 @@
import torch.nn as nn
def _make_scratch(in_shape, out_shape, groups=1, expand=False):
scratch = nn.Module()
out_shape1 = out_shape
out_shape2 = out_shape
out_shape3 = out_shape
if len(in_shape) >= 4:
out_shape4 = out_shape
if expand:
out_shape1 = out_shape
out_shape2 = out_shape * 2
out_shape3 = out_shape * 4
if len(in_shape) >= 4:
out_shape4 = out_shape * 8
scratch.layer1_rn = nn.Conv2d(in_shape[0], out_shape1, kernel_size=3, stride=1, padding=1, bias=False, groups=groups)
scratch.layer2_rn = nn.Conv2d(in_shape[1], out_shape2, kernel_size=3, stride=1, padding=1, bias=False, groups=groups)
scratch.layer3_rn = nn.Conv2d(in_shape[2], out_shape3, kernel_size=3, stride=1, padding=1, bias=False, groups=groups)
if len(in_shape) >= 4:
scratch.layer4_rn = nn.Conv2d(in_shape[3], out_shape4, kernel_size=3, stride=1, padding=1, bias=False, groups=groups)
return scratch
class ResidualConvUnit(nn.Module):
"""Residual convolution module.
"""
def __init__(self, features, activation, bn):
"""Init.
Args:
features (int): number of features
"""
super().__init__()
self.bn = bn
self.groups=1
self.conv1 = nn.Conv2d(features, features, kernel_size=3, stride=1, padding=1, bias=True, groups=self.groups)
self.conv2 = nn.Conv2d(features, features, kernel_size=3, stride=1, padding=1, bias=True, groups=self.groups)
if self.bn == True:
self.bn1 = nn.BatchNorm2d(features)
self.bn2 = nn.BatchNorm2d(features)
self.activation = activation
self.skip_add = nn.quantized.FloatFunctional()
def forward(self, x):
"""Forward pass.
Args:
x (tensor): input
Returns:
tensor: output
"""
out = self.activation(x)
out = self.conv1(out)
if self.bn == True:
out = self.bn1(out)
out = self.activation(out)
out = self.conv2(out)
if self.bn == True:
out = self.bn2(out)
if self.groups > 1:
out = self.conv_merge(out)
return self.skip_add.add(out, x)
class FeatureFusionBlock(nn.Module):
"""Feature fusion block.
"""
def __init__(
self,
features,
activation,
deconv=False,
bn=False,
expand=False,
align_corners=True,
size=None
):
"""Init.
Args:
features (int): number of features
"""
super(FeatureFusionBlock, self).__init__()
self.deconv = deconv
self.align_corners = align_corners
self.groups=1
self.expand = expand
out_features = features
if self.expand == True:
out_features = features // 2
self.out_conv = nn.Conv2d(features, out_features, kernel_size=1, stride=1, padding=0, bias=True, groups=1)
self.resConfUnit1 = ResidualConvUnit(features, activation, bn)
self.resConfUnit2 = ResidualConvUnit(features, activation, bn)
self.skip_add = nn.quantized.FloatFunctional()
self.size=size
def forward(self, *xs, size=None):
"""Forward pass.
Returns:
tensor: output
"""
output = xs[0]
if len(xs) == 2:
res = self.resConfUnit1(xs[1])
output = self.skip_add.add(output, res)
output = self.resConfUnit2(output)
if (size is None) and (self.size is None):
modifier = {"scale_factor": 2}
elif size is None:
modifier = {"size": self.size}
else:
modifier = {"size": size}
output = nn.functional.interpolate(output, **modifier, mode="bilinear", align_corners=self.align_corners)
output = self.out_conv(output)
return output

View File

@@ -0,0 +1,158 @@
import numpy as np
import cv2
class Resize(object):
"""Resize sample to given size (width, height).
"""
def __init__(
self,
width,
height,
resize_target=True,
keep_aspect_ratio=False,
ensure_multiple_of=1,
resize_method="lower_bound",
image_interpolation_method=cv2.INTER_AREA,
):
"""Init.
Args:
width (int): desired output width
height (int): desired output height
resize_target (bool, optional):
True: Resize the full sample (image, mask, target).
False: Resize image only.
Defaults to True.
keep_aspect_ratio (bool, optional):
True: Keep the aspect ratio of the input sample.
Output sample might not have the given width and height, and
resize behaviour depends on the parameter 'resize_method'.
Defaults to False.
ensure_multiple_of (int, optional):
Output width and height is constrained to be multiple of this parameter.
Defaults to 1.
resize_method (str, optional):
"lower_bound": Output will be at least as large as the given size.
"upper_bound": Output will be at max as large as the given size. (Output size might be smaller than given size.)
"minimal": Scale as least as possible. (Output size might be smaller than given size.)
Defaults to "lower_bound".
"""
self.__width = width
self.__height = height
self.__resize_target = resize_target
self.__keep_aspect_ratio = keep_aspect_ratio
self.__multiple_of = ensure_multiple_of
self.__resize_method = resize_method
self.__image_interpolation_method = image_interpolation_method
def constrain_to_multiple_of(self, x, min_val=0, max_val=None):
y = (np.round(x / self.__multiple_of) * self.__multiple_of).astype(int)
if max_val is not None and y > max_val:
y = (np.floor(x / self.__multiple_of) * self.__multiple_of).astype(int)
if y < min_val:
y = (np.ceil(x / self.__multiple_of) * self.__multiple_of).astype(int)
return y
def get_size(self, width, height):
# determine new height and width
scale_height = self.__height / height
scale_width = self.__width / width
if self.__keep_aspect_ratio:
if self.__resize_method == "lower_bound":
# scale such that output size is lower bound
if scale_width > scale_height:
# fit width
scale_height = scale_width
else:
# fit height
scale_width = scale_height
elif self.__resize_method == "upper_bound":
# scale such that output size is upper bound
if scale_width < scale_height:
# fit width
scale_height = scale_width
else:
# fit height
scale_width = scale_height
elif self.__resize_method == "minimal":
# scale as least as possbile
if abs(1 - scale_width) < abs(1 - scale_height):
# fit width
scale_height = scale_width
else:
# fit height
scale_width = scale_height
else:
raise ValueError(f"resize_method {self.__resize_method} not implemented")
if self.__resize_method == "lower_bound":
new_height = self.constrain_to_multiple_of(scale_height * height, min_val=self.__height)
new_width = self.constrain_to_multiple_of(scale_width * width, min_val=self.__width)
elif self.__resize_method == "upper_bound":
new_height = self.constrain_to_multiple_of(scale_height * height, max_val=self.__height)
new_width = self.constrain_to_multiple_of(scale_width * width, max_val=self.__width)
elif self.__resize_method == "minimal":
new_height = self.constrain_to_multiple_of(scale_height * height)
new_width = self.constrain_to_multiple_of(scale_width * width)
else:
raise ValueError(f"resize_method {self.__resize_method} not implemented")
return (new_width, new_height)
def __call__(self, sample):
width, height = self.get_size(sample["image"].shape[1], sample["image"].shape[0])
# resize sample
sample["image"] = cv2.resize(sample["image"], (width, height), interpolation=self.__image_interpolation_method)
if self.__resize_target:
if "depth" in sample:
sample["depth"] = cv2.resize(sample["depth"], (width, height), interpolation=cv2.INTER_NEAREST)
if "mask" in sample:
sample["mask"] = cv2.resize(sample["mask"].astype(np.float32), (width, height), interpolation=cv2.INTER_NEAREST)
return sample
class NormalizeImage(object):
"""Normlize image by given mean and std.
"""
def __init__(self, mean, std):
self.__mean = mean
self.__std = std
def __call__(self, sample):
sample["image"] = (sample["image"] - self.__mean) / self.__std
return sample
class PrepareForNet(object):
"""Prepare sample for usage as network input.
"""
def __init__(self):
pass
def __call__(self, sample):
image = np.transpose(sample["image"], (2, 0, 1))
sample["image"] = np.ascontiguousarray(image).astype(np.float32)
if "depth" in sample:
depth = sample["depth"].astype(np.float32)
sample["depth"] = np.ascontiguousarray(depth)
if "mask" in sample:
sample["mask"] = sample["mask"].astype(np.float32)
sample["mask"] = np.ascontiguousarray(sample["mask"])
return sample

View File

@@ -0,0 +1,83 @@
# Born out of Depth Anything V1 Issue 36
# Make sure you have the necessary libraries
# Code by @1ssb
import argparse
import cv2
import glob
import numpy as np
import open3d as o3d
import os
from PIL import Image
import torch
from depth_anything_v2.dpt import DepthAnythingV2
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--encoder', default='vitl', type=str, choices=['vits', 'vitb', 'vitl', 'vitg'])
parser.add_argument('--load-from', default='', type=str)
parser.add_argument('--max-depth', default=20, type=float)
parser.add_argument('--img-path', type=str)
parser.add_argument('--outdir', type=str, default='./vis_pointcloud')
args = parser.parse_args()
# Global settings
FL = 715.0873
FY = 784 * 0.6
FX = 784 * 0.6
NYU_DATA = False
FINAL_HEIGHT = 518
FINAL_WIDTH = 518
DEVICE = 'cuda' if torch.cuda.is_available() else 'mps' if torch.backends.mps.is_available() else 'cpu'
model_configs = {
'vits': {'encoder': 'vits', 'features': 64, 'out_channels': [48, 96, 192, 384]},
'vitb': {'encoder': 'vitb', 'features': 128, 'out_channels': [96, 192, 384, 768]},
'vitl': {'encoder': 'vitl', 'features': 256, 'out_channels': [256, 512, 1024, 1024]},
'vitg': {'encoder': 'vitg', 'features': 384, 'out_channels': [1536, 1536, 1536, 1536]}
}
depth_anything = DepthAnythingV2(**{**model_configs[args.encoder], 'max_depth': args.max_depth})
depth_anything.load_state_dict(torch.load(args.load_from, map_location='cpu'))
depth_anything = depth_anything.to(DEVICE).eval()
if os.path.isfile(args.img_path):
if args.img_path.endswith('txt'):
with open(args.img_path, 'r') as f:
filenames = f.read().splitlines()
else:
filenames = [args.img_path]
else:
filenames = glob.glob(os.path.join(args.img_path, '**/*'), recursive=True)
os.makedirs(args.outdir, exist_ok=True)
for k, filename in enumerate(filenames):
print(f'Progress {k+1}/{len(filenames)}: {filename}')
color_image = Image.open(filename).convert('RGB')
image = cv2.imread(filename)
pred = depth_anything.infer_image(image, FINAL_HEIGHT)
# Resize color image and depth to final size
resized_color_image = color_image.resize((FINAL_WIDTH, FINAL_HEIGHT), Image.LANCZOS)
resized_pred = Image.fromarray(pred).resize((FINAL_WIDTH, FINAL_HEIGHT), Image.NEAREST)
focal_length_x, focal_length_y = (FX, FY) if not NYU_DATA else (FL, FL)
x, y = np.meshgrid(np.arange(FINAL_WIDTH), np.arange(FINAL_HEIGHT))
x = (x - FINAL_WIDTH / 2) / focal_length_x
y = (y - FINAL_HEIGHT / 2) / focal_length_y
z = np.array(resized_pred)
points = np.stack((np.multiply(x, z), np.multiply(y, z), z), axis=-1).reshape(-1, 3)
colors = np.array(resized_color_image).reshape(-1, 3) / 255.0
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)
pcd.colors = o3d.utility.Vector3dVector(colors)
o3d.io.write_point_cloud(os.path.join(args.outdir, os.path.splitext(os.path.basename(filename))[0] + ".ply"), pcd)

View File

@@ -0,0 +1,26 @@
#!/bin/bash
now=$(date +"%Y%m%d_%H%M%S")
epoch=120
bs=4
gpus=8
lr=0.000005
encoder=vitl
dataset=hypersim # vkitti
img_size=518
min_depth=0.001
max_depth=20 # 80 for virtual kitti
pretrained_from=../checkpoints/depth_anything_v2_${encoder}.pth
save_path=exp/hypersim # exp/vkitti
mkdir -p $save_path
python3 -m torch.distributed.launch \
--nproc_per_node=$gpus \
--nnodes 1 \
--node_rank=0 \
--master_addr=localhost \
--master_port=20596 \
train.py --epoch $epoch --encoder $encoder --bs $bs --lr $lr --save-path $save_path --dataset $dataset \
--img-size $img_size --min-depth $min_depth --max-depth $max_depth --pretrained-from $pretrained_from \
--port 20596 2>&1 | tee -a $save_path/$now.log

View File

@@ -0,0 +1,5 @@
matplotlib
opencv-python
open3d
torch
torchvision

81
metric_depth/run.py Normal file
View File

@@ -0,0 +1,81 @@
import argparse
import cv2
import glob
import matplotlib
import numpy as np
import os
import torch
from depth_anything_v2.dpt import DepthAnythingV2
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Depth Anything V2 Metric Depth Estimation')
parser.add_argument('--img-path', type=str)
parser.add_argument('--input-size', type=int, default=518)
parser.add_argument('--outdir', type=str, default='./vis_depth')
parser.add_argument('--encoder', type=str, default='vitl', choices=['vits', 'vitb', 'vitl', 'vitg'])
parser.add_argument('--load-from', type=str, default='checkpoints/depth_anything_v2_metric_hypersim_vitl.pth')
parser.add_argument('--max-depth', type=float, default=20)
parser.add_argument('--save-numpy', dest='save_numpy', action='store_true', help='save the model raw output')
parser.add_argument('--pred-only', dest='pred_only', action='store_true', help='only display the prediction')
parser.add_argument('--grayscale', dest='grayscale', action='store_true', help='do not apply colorful palette')
args = parser.parse_args()
DEVICE = 'cuda' if torch.cuda.is_available() else 'mps' if torch.backends.mps.is_available() else 'cpu'
model_configs = {
'vits': {'encoder': 'vits', 'features': 64, 'out_channels': [48, 96, 192, 384]},
'vitb': {'encoder': 'vitb', 'features': 128, 'out_channels': [96, 192, 384, 768]},
'vitl': {'encoder': 'vitl', 'features': 256, 'out_channels': [256, 512, 1024, 1024]},
'vitg': {'encoder': 'vitg', 'features': 384, 'out_channels': [1536, 1536, 1536, 1536]}
}
depth_anything = DepthAnythingV2(**{**model_configs[args.encoder], 'max_depth': args.max_depth})
depth_anything.load_state_dict(torch.load(args.load_from, map_location='cpu'))
depth_anything = depth_anything.to(DEVICE).eval()
if os.path.isfile(args.img_path):
if args.img_path.endswith('txt'):
with open(args.img_path, 'r') as f:
filenames = f.read().splitlines()
else:
filenames = [args.img_path]
else:
filenames = glob.glob(os.path.join(args.img_path, '**/*'), recursive=True)
os.makedirs(args.outdir, exist_ok=True)
cmap = matplotlib.colormaps.get_cmap('Spectral')
for k, filename in enumerate(filenames):
print(f'Progress {k+1}/{len(filenames)}: {filename}')
raw_image = cv2.imread(filename)
depth = depth_anything.infer_image(raw_image, args.input_size)
if args.save_numpy:
output_path = os.path.join(args.outdir, os.path.splitext(os.path.basename(filename))[0] + '_raw_depth_meter.npy')
np.save(output_path, depth)
depth = (depth - depth.min()) / (depth.max() - depth.min()) * 255.0
depth = depth.astype(np.uint8)
if args.grayscale:
depth = np.repeat(depth[..., np.newaxis], 3, axis=-1)
else:
depth = (cmap(depth)[:, :, :3] * 255)[:, :, ::-1].astype(np.uint8)
output_path = os.path.join(args.outdir, os.path.splitext(os.path.basename(filename))[0] + '.png')
if args.pred_only:
cv2.imwrite(output_path, depth)
else:
split_region = np.ones((raw_image.shape[0], 50, 3), dtype=np.uint8) * 255
combined_result = cv2.hconcat([raw_image, split_region, depth])
cv2.imwrite(output_path, combined_result)

212
metric_depth/train.py Normal file
View File

@@ -0,0 +1,212 @@
import argparse
import logging
import os
import pprint
import random
import warnings
import numpy as np
import torch
import torch.backends.cudnn as cudnn
import torch.distributed as dist
from torch.utils.data import DataLoader
from torch.optim import AdamW
import torch.nn.functional as F
from torch.utils.tensorboard import SummaryWriter
from dataset.hypersim import Hypersim
from dataset.kitti import KITTI
from dataset.vkitti2 import VKITTI2
from depth_anything_v2.dpt import DepthAnythingV2
from util.dist_helper import setup_distributed
from util.loss import SiLogLoss
from util.metric import eval_depth
from util.utils import init_log
parser = argparse.ArgumentParser(description='Depth Anything V2 for Metric Depth Estimation')
parser.add_argument('--encoder', default='vitl', choices=['vits', 'vitb', 'vitl', 'vitg'])
parser.add_argument('--dataset', default='hypersim', choices=['hypersim', 'vkitti'])
parser.add_argument('--img-size', default=518, type=int)
parser.add_argument('--min-depth', default=0.001, type=float)
parser.add_argument('--max-depth', default=20, type=float)
parser.add_argument('--epochs', default=40, type=int)
parser.add_argument('--bs', default=2, type=int)
parser.add_argument('--lr', default=0.000005, type=float)
parser.add_argument('--pretrained-from', type=str)
parser.add_argument('--save-path', type=str, required=True)
parser.add_argument('--local-rank', default=0, type=int)
parser.add_argument('--port', default=None, type=int)
def main():
args = parser.parse_args()
warnings.simplefilter('ignore', np.RankWarning)
logger = init_log('global', logging.INFO)
logger.propagate = 0
rank, world_size = setup_distributed(port=args.port)
if rank == 0:
all_args = {**vars(args), 'ngpus': world_size}
logger.info('{}\n'.format(pprint.pformat(all_args)))
writer = SummaryWriter(args.save_path)
cudnn.enabled = True
cudnn.benchmark = True
size = (args.img_size, args.img_size)
if args.dataset == 'hypersim':
trainset = Hypersim('dataset/splits/hypersim/train.txt', 'train', size=size)
elif args.dataset == 'vkitti':
trainset = VKITTI2('dataset/splits/vkitti2/train.txt', 'train', size=size)
else:
raise NotImplementedError
trainsampler = torch.utils.data.distributed.DistributedSampler(trainset)
trainloader = DataLoader(trainset, batch_size=args.bs, pin_memory=True, num_workers=4, drop_last=True, sampler=trainsampler)
if args.dataset == 'hypersim':
valset = Hypersim('dataset/splits/hypersim/val.txt', 'val', size=size)
elif args.dataset == 'vkitti':
valset = KITTI('dataset/splits/kitti/val.txt', 'val', size=size)
else:
raise NotImplementedError
valsampler = torch.utils.data.distributed.DistributedSampler(valset)
valloader = DataLoader(valset, batch_size=1, pin_memory=True, num_workers=4, drop_last=True, sampler=valsampler)
local_rank = int(os.environ["LOCAL_RANK"])
model_configs = {
'vits': {'encoder': 'vits', 'features': 64, 'out_channels': [48, 96, 192, 384]},
'vitb': {'encoder': 'vitb', 'features': 128, 'out_channels': [96, 192, 384, 768]},
'vitl': {'encoder': 'vitl', 'features': 256, 'out_channels': [256, 512, 1024, 1024]},
'vitg': {'encoder': 'vitg', 'features': 384, 'out_channels': [1536, 1536, 1536, 1536]}
}
model = DepthAnythingV2(**{**model_configs[args.encoder], 'max_depth': args.max_depth})
if args.pretrained_from:
model.load_state_dict({k: v for k, v in torch.load(args.pretrained_from, map_location='cpu').items() if 'pretrained' in k}, strict=False)
model = torch.nn.SyncBatchNorm.convert_sync_batchnorm(model)
model.cuda(local_rank)
model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[local_rank], broadcast_buffers=False,
output_device=local_rank, find_unused_parameters=True)
criterion = SiLogLoss().cuda(local_rank)
optimizer = AdamW([{'params': [param for name, param in model.named_parameters() if 'pretrained' in name], 'lr': args.lr},
{'params': [param for name, param in model.named_parameters() if 'pretrained' not in name], 'lr': args.lr * 10.0}],
lr=args.lr, betas=(0.9, 0.999), weight_decay=0.01)
total_iters = args.epochs * len(trainloader)
previous_best = {'d1': 0, 'd2': 0, 'd3': 0, 'abs_rel': 100, 'sq_rel': 100, 'rmse': 100, 'rmse_log': 100, 'log10': 100, 'silog': 100}
for epoch in range(args.epochs):
if rank == 0:
logger.info('===========> Epoch: {:}/{:}, d1: {:.3f}, d2: {:.3f}, d3: {:.3f}'.format(epoch, args.epochs, previous_best['d1'], previous_best['d2'], previous_best['d3']))
logger.info('===========> Epoch: {:}/{:}, abs_rel: {:.3f}, sq_rel: {:.3f}, rmse: {:.3f}, rmse_log: {:.3f}, '
'log10: {:.3f}, silog: {:.3f}'.format(
epoch, args.epochs, previous_best['abs_rel'], previous_best['sq_rel'], previous_best['rmse'],
previous_best['rmse_log'], previous_best['log10'], previous_best['silog']))
trainloader.sampler.set_epoch(epoch + 1)
model.train()
total_loss = 0
for i, sample in enumerate(trainloader):
optimizer.zero_grad()
img, depth, valid_mask = sample['image'].cuda(), sample['depth'].cuda(), sample['valid_mask'].cuda()
if random.random() < 0.5:
img = img.flip(-1)
depth = depth.flip(-1)
valid_mask = valid_mask.flip(-1)
pred = model(img)
loss = criterion(pred, depth, (valid_mask == 1) & (depth >= args.min_depth) & (depth <= args.max_depth))
loss.backward()
optimizer.step()
total_loss += loss.item()
iters = epoch * len(trainloader) + i
lr = args.lr * (1 - iters / total_iters) ** 0.9
optimizer.param_groups[0]["lr"] = lr
optimizer.param_groups[1]["lr"] = lr * 10.0
if rank == 0:
writer.add_scalar('train/loss', loss.item(), iters)
if rank == 0 and i % 100 == 0:
logger.info('Iter: {}/{}, LR: {:.7f}, Loss: {:.3f}'.format(i, len(trainloader), optimizer.param_groups[0]['lr'], loss.item()))
model.eval()
results = {'d1': torch.tensor([0.0]).cuda(), 'd2': torch.tensor([0.0]).cuda(), 'd3': torch.tensor([0.0]).cuda(),
'abs_rel': torch.tensor([0.0]).cuda(), 'sq_rel': torch.tensor([0.0]).cuda(), 'rmse': torch.tensor([0.0]).cuda(),
'rmse_log': torch.tensor([0.0]).cuda(), 'log10': torch.tensor([0.0]).cuda(), 'silog': torch.tensor([0.0]).cuda()}
nsamples = torch.tensor([0.0]).cuda()
for i, sample in enumerate(valloader):
img, depth, valid_mask = sample['image'].cuda().float(), sample['depth'].cuda()[0], sample['valid_mask'].cuda()[0]
with torch.no_grad():
pred = model(img)
pred = F.interpolate(pred[:, None], depth.shape[-2:], mode='bilinear', align_corners=True)[0, 0]
valid_mask = (valid_mask == 1) & (depth >= args.min_depth) & (depth <= args.max_depth)
if valid_mask.sum() < 10:
continue
cur_results = eval_depth(pred[valid_mask], depth[valid_mask])
for k in results.keys():
results[k] += cur_results[k]
nsamples += 1
torch.distributed.barrier()
for k in results.keys():
dist.reduce(results[k], dst=0)
dist.reduce(nsamples, dst=0)
if rank == 0:
logger.info('==========================================================================================')
logger.info('{:>8}, {:>8}, {:>8}, {:>8}, {:>8}, {:>8}, {:>8}, {:>8}, {:>8}'.format(*tuple(results.keys())))
logger.info('{:8.3f}, {:8.3f}, {:8.3f}, {:8.3f}, {:8.3f}, {:8.3f}, {:8.3f}, {:8.3f}, {:8.3f}'.format(*tuple([(v / nsamples).item() for v in results.values()])))
logger.info('==========================================================================================')
print()
for name, metric in results.items():
writer.add_scalar(f'eval/{name}', (metric / nsamples).item(), epoch)
for k in results.keys():
if k in ['d1', 'd2', 'd3']:
previous_best[k] = max(previous_best[k], (results[k] / nsamples).item())
else:
previous_best[k] = min(previous_best[k], (results[k] / nsamples).item())
if rank == 0:
checkpoint = {
'model': model.state_dict(),
'optimizer': optimizer.state_dict(),
'epoch': epoch,
'previous_best': previous_best,
}
torch.save(checkpoint, os.path.join(args.save_path, 'latest.pth'))
if __name__ == '__main__':
main()

View File

@@ -0,0 +1,41 @@
import os
import subprocess
import torch
import torch.distributed as dist
def setup_distributed(backend="nccl", port=None):
"""AdaHessian Optimizer
Lifted from https://github.com/BIGBALLON/distribuuuu/blob/master/distribuuuu/utils.py
Originally licensed MIT, Copyright (c) 2020 Wei Li
"""
num_gpus = torch.cuda.device_count()
if "SLURM_JOB_ID" in os.environ:
rank = int(os.environ["SLURM_PROCID"])
world_size = int(os.environ["SLURM_NTASKS"])
node_list = os.environ["SLURM_NODELIST"]
addr = subprocess.getoutput(f"scontrol show hostname {node_list} | head -n1")
# specify master port
if port is not None:
os.environ["MASTER_PORT"] = str(port)
elif "MASTER_PORT" not in os.environ:
os.environ["MASTER_PORT"] = "10685"
if "MASTER_ADDR" not in os.environ:
os.environ["MASTER_ADDR"] = addr
os.environ["WORLD_SIZE"] = str(world_size)
os.environ["LOCAL_RANK"] = str(rank % num_gpus)
os.environ["RANK"] = str(rank)
else:
rank = int(os.environ["RANK"])
world_size = int(os.environ["WORLD_SIZE"])
torch.cuda.set_device(rank % num_gpus)
dist.init_process_group(
backend=backend,
world_size=world_size,
rank=rank,
)
return rank, world_size

16
metric_depth/util/loss.py Normal file
View File

@@ -0,0 +1,16 @@
import torch
from torch import nn
class SiLogLoss(nn.Module):
def __init__(self, lambd=0.5):
super().__init__()
self.lambd = lambd
def forward(self, pred, target, valid_mask):
valid_mask = valid_mask.detach()
diff_log = torch.log(target[valid_mask]) - torch.log(pred[valid_mask])
loss = torch.sqrt(torch.pow(diff_log, 2).mean() -
self.lambd * torch.pow(diff_log.mean(), 2))
return loss

View File

@@ -0,0 +1,26 @@
import torch
def eval_depth(pred, target):
assert pred.shape == target.shape
thresh = torch.max((target / pred), (pred / target))
d1 = torch.sum(thresh < 1.25).float() / len(thresh)
d2 = torch.sum(thresh < 1.25 ** 2).float() / len(thresh)
d3 = torch.sum(thresh < 1.25 ** 3).float() / len(thresh)
diff = pred - target
diff_log = torch.log(pred) - torch.log(target)
abs_rel = torch.mean(torch.abs(diff) / target)
sq_rel = torch.mean(torch.pow(diff, 2) / target)
rmse = torch.sqrt(torch.mean(torch.pow(diff, 2)))
rmse_log = torch.sqrt(torch.mean(torch.pow(diff_log , 2)))
log10 = torch.mean(torch.abs(torch.log10(pred) - torch.log10(target)))
silog = torch.sqrt(torch.pow(diff_log, 2).mean() - 0.5 * torch.pow(diff_log.mean(), 2))
return {'d1': d1.item(), 'd2': d2.item(), 'd3': d3.item(), 'abs_rel': abs_rel.item(), 'sq_rel': sq_rel.item(),
'rmse': rmse.item(), 'rmse_log': rmse_log.item(), 'log10':log10.item(), 'silog':silog.item()}

View File

@@ -0,0 +1,26 @@
import os
import re
import numpy as np
import logging
logs = set()
def init_log(name, level=logging.INFO):
if (name, level) in logs:
return
logs.add((name, level))
logger = logging.getLogger(name)
logger.setLevel(level)
ch = logging.StreamHandler()
ch.setLevel(level)
if "SLURM_PROCID" in os.environ:
rank = int(os.environ["SLURM_PROCID"])
logger.addFilter(lambda record: rank == 0)
else:
rank = 0
format_str = "[%(asctime)s][%(levelname)8s] %(message)s"
formatter = logging.Formatter(format_str)
ch.setFormatter(formatter)
logger.addHandler(ch)
return logger

6
requirements.txt Normal file
View File

@@ -0,0 +1,6 @@
gradio_imageslider
gradio==4.29.0
matplotlib
opencv-python
torch
torchvision

73
run.py Normal file
View File

@@ -0,0 +1,73 @@
import argparse
import cv2
import glob
import matplotlib
import numpy as np
import os
import torch
from depth_anything_v2.dpt import DepthAnythingV2
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Depth Anything V2')
parser.add_argument('--img-path', type=str)
parser.add_argument('--input-size', type=int, default=518)
parser.add_argument('--outdir', type=str, default='./vis_depth')
parser.add_argument('--encoder', type=str, default='vitl', choices=['vits', 'vitb', 'vitl', 'vitg'])
parser.add_argument('--pred-only', dest='pred_only', action='store_true', help='only display the prediction')
parser.add_argument('--grayscale', dest='grayscale', action='store_true', help='do not apply colorful palette')
args = parser.parse_args()
DEVICE = 'cuda' if torch.cuda.is_available() else 'mps' if torch.backends.mps.is_available() else 'cpu'
model_configs = {
'vits': {'encoder': 'vits', 'features': 64, 'out_channels': [48, 96, 192, 384]},
'vitb': {'encoder': 'vitb', 'features': 128, 'out_channels': [96, 192, 384, 768]},
'vitl': {'encoder': 'vitl', 'features': 256, 'out_channels': [256, 512, 1024, 1024]},
'vitg': {'encoder': 'vitg', 'features': 384, 'out_channels': [1536, 1536, 1536, 1536]}
}
depth_anything = DepthAnythingV2(**model_configs[args.encoder])
depth_anything.load_state_dict(torch.load(f'checkpoints/depth_anything_v2_{args.encoder}.pth', map_location='cpu'))
depth_anything = depth_anything.to(DEVICE).eval()
if os.path.isfile(args.img_path):
if args.img_path.endswith('txt'):
with open(args.img_path, 'r') as f:
filenames = f.read().splitlines()
else:
filenames = [args.img_path]
else:
filenames = glob.glob(os.path.join(args.img_path, '**/*'), recursive=True)
os.makedirs(args.outdir, exist_ok=True)
cmap = matplotlib.colormaps.get_cmap('Spectral_r')
for k, filename in enumerate(filenames):
print(f'Progress {k+1}/{len(filenames)}: {filename}')
raw_image = cv2.imread(filename)
depth = depth_anything.infer_image(raw_image, args.input_size)
depth = (depth - depth.min()) / (depth.max() - depth.min()) * 255.0
depth = depth.astype(np.uint8)
if args.grayscale:
depth = np.repeat(depth[..., np.newaxis], 3, axis=-1)
else:
depth = (cmap(depth)[:, :, :3] * 255)[:, :, ::-1].astype(np.uint8)
if args.pred_only:
cv2.imwrite(os.path.join(args.outdir, os.path.splitext(os.path.basename(filename))[0] + '.png'), depth)
else:
split_region = np.ones((raw_image.shape[0], 50, 3), dtype=np.uint8) * 255
combined_result = cv2.hconcat([raw_image, split_region, depth])
cv2.imwrite(os.path.join(args.outdir, os.path.splitext(os.path.basename(filename))[0] + '.png'), combined_result)

88
run_video.py Normal file
View File

@@ -0,0 +1,88 @@
import argparse
import cv2
import glob
import matplotlib
import numpy as np
import os
import torch
from depth_anything_v2.dpt import DepthAnythingV2
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Depth Anything V2')
parser.add_argument('--video-path', type=str)
parser.add_argument('--input-size', type=int, default=518)
parser.add_argument('--outdir', type=str, default='./vis_video_depth')
parser.add_argument('--encoder', type=str, default='vitl', choices=['vits', 'vitb', 'vitl', 'vitg'])
parser.add_argument('--pred-only', dest='pred_only', action='store_true', help='only display the prediction')
parser.add_argument('--grayscale', dest='grayscale', action='store_true', help='do not apply colorful palette')
args = parser.parse_args()
DEVICE = 'cuda' if torch.cuda.is_available() else 'mps' if torch.backends.mps.is_available() else 'cpu'
model_configs = {
'vits': {'encoder': 'vits', 'features': 64, 'out_channels': [48, 96, 192, 384]},
'vitb': {'encoder': 'vitb', 'features': 128, 'out_channels': [96, 192, 384, 768]},
'vitl': {'encoder': 'vitl', 'features': 256, 'out_channels': [256, 512, 1024, 1024]},
'vitg': {'encoder': 'vitg', 'features': 384, 'out_channels': [1536, 1536, 1536, 1536]}
}
depth_anything = DepthAnythingV2(**model_configs[args.encoder])
depth_anything.load_state_dict(torch.load(f'checkpoints/depth_anything_v2_{args.encoder}.pth', map_location='cpu'))
depth_anything = depth_anything.to(DEVICE).eval()
if os.path.isfile(args.video_path):
if args.video_path.endswith('txt'):
with open(args.video_path, 'r') as f:
lines = f.read().splitlines()
else:
filenames = [args.video_path]
else:
filenames = glob.glob(os.path.join(args.video_path, '**/*'), recursive=True)
os.makedirs(args.outdir, exist_ok=True)
margin_width = 50
cmap = matplotlib.colormaps.get_cmap('Spectral_r')
for k, filename in enumerate(filenames):
print(f'Progress {k+1}/{len(filenames)}: {filename}')
raw_video = cv2.VideoCapture(filename)
frame_width, frame_height = int(raw_video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(raw_video.get(cv2.CAP_PROP_FRAME_HEIGHT))
frame_rate = int(raw_video.get(cv2.CAP_PROP_FPS))
output_width = frame_width * 2 + margin_width
output_path = os.path.join(args.outdir, os.path.splitext(os.path.basename(filename))[0] + '.mp4')
out = cv2.VideoWriter(output_path, cv2.VideoWriter_fourcc(*"mp4v"), frame_rate, (output_width, frame_height))
while raw_video.isOpened():
ret, raw_frame = raw_video.read()
if not ret:
break
depth = depth_anything.infer_image(raw_frame, args.input_size)
depth = (depth - depth.min()) / (depth.max() - depth.min()) * 255.0
depth = depth.astype(np.uint8)
if args.grayscale:
depth = np.repeat(depth[..., np.newaxis], 3, axis=-1)
else:
depth = (cmap(depth)[:, :, :3] * 255)[:, :, ::-1].astype(np.uint8)
if args.pred_only:
out.write(depth)
else:
split_region = np.ones((frame_height, margin_width, 3), dtype=np.uint8) * 255
combined_frame = cv2.hconcat([raw_frame, split_region, depth])
out.write(combined_frame)
raw_video.release()
out.release()