본문 바로가기
AIML 분야/Depth, Camera Pose, VO, SLAM 등

[Monocular Depth Estimation] mono toolbox 코드 뜯는 기록

by 포숑은 맛있어 2022. 8. 5.
반응형

 

Monodepth Estimation Toolbox

https://github.com/zhyever/Monocular-Depth-Estimation-Toolbox

 

GitHub - zhyever/Monocular-Depth-Estimation-Toolbox: Monocular Depth Estimation Toolbox based on MMSegmentation.

Monocular Depth Estimation Toolbox based on MMSegmentation. - GitHub - zhyever/Monocular-Depth-Estimation-Toolbox: Monocular Depth Estimation Toolbox based on MMSegmentation.

github.com

 

[상황]

1. KITTI Dataset으로 train/inference 동작 확인함.

2. 커스텀 데이터셋 코드를 돌리고 있는데 GT가 tiff 파일이라 depth/datasets/pipelines 에 있는 몇군데를 좀 건드려야했음.

여담인데 데이터셋 preprocessing은 이거씀. https://github.com/mli0603/MICCAI_challenge_preprocess 

 

[지원하는 모델들]

  • SimIPU (AAAI 2022)
    • "SimIPU: Simple 2D Image and 3D Point Cloud Unsupervised Pre-Training
      for Spatial-Aware Visual Representations" https://arxiv.org/pdf/2112.04680.pdf
    • 잘 돌아감.
    • pre_eval()부분 구현 안해놔서 에러뜸. 일단 validation 꺼놓고 학습 쭈욱 돌린다음에 test 결과 뽑아볼 생각.
    • ResNet50 + DenseDepthHead + SigLoss. 저 논문에서 downstream task 중 하나로 depth estimation을 뒀고, 거기 설명한것과 동일하게 구조는 간단한거 썼음. 저 논문 자체가 contrastive learning해가지고 3D feature를 잘 뽑자는건데, 그러면 이 레포에서 ResNet pth를 불러올때 그렇게 잘 학습된걸 쓰는건지는 확인해봐야 할듯. 이 레포에서 contrastive learning을 하는건 아니라서.
  • AdaBins
    • KITTI Dataset으로는 학습 잘 되는 것 확인.
    • 증상? Grad_norm값이나 decode.loss_depth값이 줄어들긴 하지만 다른 모델 돌릴 때 대비 값이 터무니없이 큼. 특히나 torch3d 사용하는 chamfer loss값이 nan으로 튀어서 전체 로스도 nan.
    • 원인? tiff 파일 불러오면서 depth_gt 처리하느라 코드를 좀 바꿨는데, gt depth값을 depth_scale값으로 normalize 해주는걸 잊어서인듯. 수정 후 다시 돌릴 예정
  • BTS
  • DPT
  • DepthFormer
    • 이 레포가 공식코드.
    • "TypeError: register_training_hooks() got an unexpected keyword argument 'custom_hooks_config'" 에러 해결중 -> mmcv-full 1.4.0 설치하여 해결 -> 잘 돌아감
  • BinsFormer: 얼마전에 올라옴. 이 모델까지 올라오기 전에 코드 셋업해놔서 아직 못돌려봄

 

 

참고: Scale-Invariant Log Loss


 

AdaBins

custom dataset을 위한 코딩은 기존 mmsegmentation과 동일하게 compose.py, loading.py, dataset 정의부분 등 건드리면 된다.

test code 디버깅을 위해 뭐 좀 돌리는 중이라 그동안 코드 보기.

 

adabins config.

- EfficientNet backbone

- AdaBinsHead

- SigLoss

# model settings
model = dict(
    type='DepthEncoderDecoder',
    backbone=dict(
        type='EfficientNet'),
    decode_head=dict(
        type='AdabinsHead',
        in_channels=[24, 40, 64, 176, 2048],
        up_sample_channels=[128, 256, 512, 1024, 2048],
        channels=128, # last one
        align_corners=True, # for upsample
        loss_decode=dict(
            type='SigLoss', valid_mask=True, loss_weight=10)),
    # model training and testing settings
    train_cfg=dict(),
    test_cfg=dict(mode='whole'))

 

Model

Backbone

torch.hub에서 불러옴. 다만 classification용이 아니라 feature extractor로 쓸거라서 맨뒤에 classifier, global pool layer는 없앰. (nn.Identity)

backbone에 input을 block단위로 순차적으로 적용하다가, 4,5,6,8,11째 block의 feature들만 따로 저장해서 tuple로 묶어서 뱉음

 

Head.

in_channels=[24, 40, 64, 176, 2048],
up_sample_channels=[128, 256, 512, 1024, 2048],

 

얘네에 따라서 적용할 연산들 정의

mmcv.cnn의 ConvModule, 따로 정의한 UpSample 연산 사용.

ConvModule은 Conv 연산, Normalization, Activation을 다 묶어놓은 형태.

https://mmcv.readthedocs.io/en/latest/understand_mmcv/cnn.html

UpSample연산은 ReLU activation사용한 ConvModule 2개로 정의

 

 

다른거 돌리느라 GPU 없어서... AdaBins depth scale 고친건 담주에 돌려야지

반응형

댓글