【docker】How to use dockerfile & docker run in detail

  • 공개된 Github 코드들 중에 Facebook, Microsoft, Google과 같은 대형 기업이 만든 패키지는 모두 Docker Installation을 제공한다. 즉 dockerfile이 제공되는데, 이것을 이용하는 방법에 대해서 간략히 공부해본다.
  • (이전 Post 링크) docker hub에서 Image를 가져올 때는 pull 명령어! 내가 Image를 배포하고 싶으면 push 명령어!
  • 미리 알아두어야할 핵심은, dockerfile로 Image를 만드는 것이다. container 만드는 것은 docker run

1. How to use dockerfile in order to make docker Image

(0) Reference

  1. https://tech.osci.kr/2020/03/23/91695884/
  2. https://javacan.tistory.com/entry/docker-start-7-create-image-using-dockerfile

(1) reference summary

  • Docker File이란 Docker Image를 만들기 위한 여러가지 명렁어의 집합이다.

  • 첫번째 reference에서는 아래의 일렬의 과정을 수행하기 위한 명령어들은 무엇이고, 이 과정이 자동으로 수행되게 만들기 위해서 dockerfile에는 어떤 내용이 들어가야하는지 설명한다.

    1. ubuntu 설치
    2. 패키지 업데이트
    3. nginx 설치
    4. 경로설정 (필요한 경우)
  • 최종적으로 dockerfile은 아래와 같이 만들어 질 수 있다.

    FROM ubuntu:14.04 
    MAINTAINER Dongbin Na "kbseo@osci.kr" 
    RUN apt-get update
    RUN apt-get install -y nginx
    WORKDIR /etc/nginx 
    CMD ["nginx", "-g", "daemon off;"]
    EXPOSE 80 
    
  • 이 내용을 한줄한줄 설명하면 다음과 같다.

    1. FROM ubuntu:14.04 -> 기반으로 할 이미지를 가져옵니다. 여기에서는 ubuntu 14.04버전의 이미지를 가져오겠습니다.
    2. MAINTAINER Dongbin Na "kbseo@osci.kr" -> 작성자의 정보를 기입해줍니다.
    3. RUN apt-get update -> RUN이라는 명령어를 통하여 쉘 스크립트를 실행하여 줍니다.
    4. RUN apt-get install -y nginx -> 도커 빌드 중에는 키보드를 입력할 수 없기에 [-y] 옵션을 넣어줍니다.
    5. WORKDIR /etc/nginx -> cd와 같다. CMD 명령어가 실행 할 경로로 먼저 이동을 해 줍니다.
    6. CMD ["nginx", "-g", "daemon off;"] -> nginx를 백그라운드로 실행합니다
    7. EXPOSE 80 -> 80번 포트를 오픈하여 웹서버에 정상적으로 접근할 수 있게 합니다.
      
    필요 내용만 정리 (명령어, 명령어 역할, 예시)
    RUN	- 직접적으로 쉘 스크립트 내에서 실행 될 명령어 앞에 적어줍니다.	RUN <command>	RUN apt-get update
    2. CMD	- 도커가 실행될 때 실행할 명령어를 정의해줍니다.	CMD ["executable", "param", "param"]	CMD ["nginx", "-g", "daemon off;"]
    3. WORKDIR	- 이후 명령어가 작업할 디렉토리로 이동합니다	WORKDIR /path	WORKDIR /etc/nginx
    4. COPY	- 파일이나 디렉토리를 이미지로 복사합니다	COPY <src> <dst>	COPY . /usr/src/app
    5. ADD	- COPY와 비슷하게 복사를 위해 사용합니다	ADD <src> <dst>	ADD . /usr/src/app
    6. EXPOSE	- 공개 하고자 하는 포트를 지정해줍니다	EXPOSE <port>	EXPOSE 80
    
  • 만든 dockerfile을 build 하기 $ docker build --force-rm --tag mynginx:0.1 .

    • docker build가 실행되는 터미널 pwd에 있는 dockerfile을 자동으로 build해준다.
    • –force-rm : 중간중간에 생성되는 임시 container를 항상 remove 한다. (--force-rm: Always remove intermediate containers)
    • –tag : 태그를 설정해줍니다. (docker-image-name : tag-name)

나의 사용 예시

  • 실제 DETR docker Image를 build하기 위해 아래의 과정을 수행했다.

    $ cd ~/git-package/
    $ git clone https://github.com/facebookresearch/detr.git
    $ cd ./detr
    $ sudo docker build ./ # 이렇게 하면 아래처럼 대참사 발생
    $ sudo docker build --force-rm --tag ImageName:tag ./  #이렇게 사용하라. 
    # 처음에 ./ 를 안해줬더니 아래 같은 에러가 떴다.
    # "docker build" requires exactly 1 argument. Usage : docker build [Options] Pash 
    
  • detr의 dockerfile을 보면 다음과 같다.

    ROM pytorch/pytorch:1.5-cuda10.1-cudnn7-runtime
    ENV DEBIAN_FRONTEND=noninteractive
    RUN apt-get update -qq && \
        apt-get install -y git vim libgtk2.0-dev && \
        rm -rf /var/cache/apk/*
    RUN pip --no-cache-dir install Cython
    COPY requirements.txt /workspace
    RUN pip --no-cache-dir install -r /workspace/requirements.txt
    
  • 생각해보니까, 내가 굳이 Physical server (내 데스크탑)에 detr package 전체를 git clone할 필요가 없었다.

  • 어차피 dockerfile에 의해서 만들어지는 이미지안에 detr package가 들어갈 거다. 그리고 그 package내부의 requirement.txt가 pip install 될 것이다.

  • –tag 옵션으로 Image 이름 꼭 설정해주자… 안그러면 아래와 같은 대참사가 발생한다.
    image

  • 나는 하나의 Image만 build하고 싶은데, 왜 많은 Image가 생성된걸까?
    image-20210402185216777

    • 우선 위의 대참사를 해결하기 위해서 –force-rm –tag 옵션을 넣어서 다시 수행했을때, 왠지는 모르겠지만 빠르게 Image가 build 되었다. 기존에 90f7 ca40 6296 4789 와 같은 Image가 존재하기 때문이다.
    • dockerfile을 build하는 과정은 다음과 같다.
      1. 맨 위에 명령어부터 차근차근 실행한다.
      2. docker-hub에서 이미지를 다운받는다.
      3. 그 이미지로 container를 생성한다.
      4. 그 container에서 우분투 명령어를 RUN한다.
      5. 그렇게 만들어진 container를 Image로 저장한다. (–force-rm옵션에 의해서 위의 임시 container를 삭제한다.)
      6. 이 과정을 반복해서 많은 Image가 생성된다.
      7. 최종적으로 만들어지는 Image는 Successfully built 7f745326ad49 에서 명시된 이미지이다.

지금까지 dockerfile을 build함으로써 docker Image는 만들었다!

이 다음부터는 $ sudo docker run 의 문제이다.

2. docker run

나의 사용 예시

  • 일단 아래처럼, ML-workspace 명령어 그대로 가져오면 안된다. 여기서 -it를 사용하지 않는 이유는 -it를 사용하지 않더라도 jupyter가 실행되며 terminal이 살아있기 때문이다.
$ sudo docker run -d \
    -p 8888:8080 \
    --name "detr" \
    --gpus all\
    -v "${PWD}/docker_ws:/workspace" \
    --shm-size 512m \
    --restart always \ # exit상태가 되면 무조건 다시 start한다.
    7f745326ad49
  • gpu사용하려면 이제 앞으로 –gpus 옵션만 넣으면 된다. 근데 이렇게 실행하면 이상하게 자동으로 exit가 되고 start를 수행하도 다시 exit가 된다. 이유 : -d 옵션을 사용하기만 하면 shell이 생성이 안되므로 자동으로 container가 죽어버린다
$ sudo docker run -d 7f74
  • 이렇게 하니가 start하면 계속 살아있네?
$ sudo docker run -it --gpus all  7f745326ad49
  • 결론 -d -it 꼭 같이 사용하자…
$ sudo docker run -d -it --gpus all  7f745326ad49
  • 다른 필요한 옵션도 추가 (이거 쓰지말고 맨 아래에 새로 만들었으니 그거 써라) 문제점 : -v에서 PWD가 들어가 있으니까, terminal PWD 생각안하고 container만들면 무조건 에러가 생기더라.
$ sudo docker run -d -it \
         --gpus all\
         --restart always\
         -p 8888:8080\	
         --name "detr" \
         -v "${PWD}/docker_ws:/workspace" \
         7f745326ad49

image

3. Error

  1. 어제까지만 잘 실행되던 container가 VScode에서 오늘 안열린다.

    • Error 내용 : /root/detr 이 존재하지 않는다.
    • 분석 : 내가 어제 git clone한 detr 폴더를 제거해버렸는데 그거 때문인가..?
    • 일단 아래 처럼 문제 해결
  2. Dockerfile 이 실행되면서 마지막에 에러가 발생하고 이미지가 안 만들어진다. (어제까지는 잘만 되더만)

    • 무식하게 분석하지 말고 에러를 일고 확실히 분석해보자.
      image-20210403180959468

    • 가장 마지막 step 이후에 만들어진 Image를 이용해서 test를 해본다. 이럴때 $ docker run --rm 옵션을 사용하는 거구나
      image-20210403181225402

    • 그렇다면 submitit package는 나중에 따로 직접 설치하다 requirement.txt에서 submitit 일단 지워 놓자.

    • 오케이 일단! sumitit 패키지가 안들어간 이미지 생성 완성
      image-20210403181805986

    • 첫번째 에러가 해결되었다!!
      image-20210403182238913

      • 근데 처음에 /root/detr이 없다고 첫번쨰 에러가 발생했는데… 새로 생긴 container에서도 detr은 존재하지 않는데…. 어떻게 된것일까 모르겠다.

      • 가장 안정된 docker run command

        • -v 옵션에서 조금이라도 문제가 있으면, 아에 -v 옵션이 적용이 안된다. 매우매우 주의할것

          sudo docker run -d -it      \
          --gpus all         \
          --restart always     \
          -p 8888:8080         \
          --name "detr"          \
          -v ~/docker/detr:/workspace   \
          detr:1
          
        • 앞으로 꼭!!! 이 과정으로 docekr 만들기

          1. $ cd ~/docker 하고 거기서 원하는 package $ git clone <packageA link>
          2. docker run의 -v옵션은 무조건 ~/docker/packageA:/workspace 으로 설정
          3. 이렇게 하면 container의 /workspace에는 자동으로 packageA도 들어가 있고 아주 개꿀이다.
          4. 참고로!! 혹시 모르니까 packageA 전체 내용은 삭제하지 말기.(첫번째 에러와 같은 문제가 다시 생길 수 있다.) 폴더를 만들고 싶다면 packageA 안에다가 폴더를 만들어서 거기서 작업하기
    • 아까 sumitit는 설치 못했으므로, 컨테이너에 직접 들어가서 패키지 설지
      image-20210403183947407

【DA】ProDA -Prototypical Pseudo Label Denoising by Microsoft

  • 논문 : Prototypical Pseudo Label Denoising and Target Structure Learning for Domain Adaptive Semantic Segmentation
  • 분류 : Domain Adaptation
  • 읽는 배경 : 선배 추천, Microsoft에서 연구된 현재까지 UDA 끝판왕
  • 느낀점 :
    • 앞으로 이렇게 알지도 못하면서 Abstract와 Conclusion 미리 정리하지 말자. Abstract와 Conclusion 제대로 이해하지도 못했는데, 일단 대충 때려 맞춰서 이해한 것을 정리한다고 시간을 쏟는거 자체가 시간 아깝다. Method 읽고 다시 처음부터 다시 Abstract와 Conclusion 읽고 정리하면 더 깔끔하고, 보기 좋고, 완벽한 정리를 할 수 있고, 시간도 절약할 수 있다.
    • 뭔지 알지도 못하면서 그냥 배경지식으로 나혼자 짜맞춰서 Abstract, Conclusion, Instruction을 정리하는 것은 무식한 것 같다.
    • 이 논문은 Few shot learning을 하던 사람이 거기서 사용하는 기법을 가져와서 DA에 잘 적용한 논문인 것 같다.
  • 읽어야 하는 논문
    • CVPR2019, FAIR, Momentum Contrast for Unsupervised Visual Representation Learning (Momentom Encoder)
    • CVPR2018, Learning to adapt structured output space for semantic segmentation
    • Arxiv, 2019, Confidence Regularized Self-Training (output-feature map regularization)
    • SimCLRv2 [11]
  • 목차
    1. 논문리뷰
    2. 논문 세미나 이후 인사이트 추가


ProDA

1. Conclusion, Abstract

  • 기존 방법들의 문제점

    1. source로 학습시킨 모델로 target image를 inference한 결과인, Pseudo labels은 너무 Noisy하고 신뢰할 수 없다.
    2. the target features(feature map이 embedinge된 공간의 모습이) are dispersed (너무 흩어져있다. 해산되어 있다.)
  • 논문 핵심 우선 정리
    1. Prototypes(centroids) 사용해서 Pseudo label을 Online으로 denoise (rectify) 하기
      • 여기서 Representative prototypes이란? The feature centroids of classes이랑 동의어이다.
      • the feature distance from centroids를 사용해서, the likelihood of pseudo labels를 계산하고 online correction(donoise)를 수행한다.
    2. target’s structure가 compact! feature space 모양이 되도록 만들었다. data augmentation 기법을 적절히 활용하였다.
    3. 위의 과정으로 +17.1%의 성능향상을 주었다. 그후에 Knowledge distillation을 적용함으로써 최종적으로 20.9% 성능을 획득했다.
  • 추가 알아야 할 것
    • Kullback–Leibler (KL) divergence : 두 확률분포의 엔트로피 차이를 계산하는 식. CrossEntropy랑 비슷한 거이다. 단순이 두 확률분포의 거리 차이랑은 개념이 조금 다르다. (기계학습 책에 잘 적혀 있었고, 공부했었으니 필요하면 참고하자.)

2. Instruction, Relative work

  • 읽어야 하는데… 선배들이 Instruction이 가장 중요하다고 했는데… Method에도 조금조금씩 분석과 Motivation에 대한 내용이 이미 나왔어서 그런지 읽기가 싫다.
  • 나중에 필요하면 읽자… ㅎㅎ
  • 이 논문의 Relative work는 따로 없고, 5.2. Comparisons with state-of-the-art methods부분에 짧게 존재한다.

3. Preliminary (Requirement)

image-20210404152232530

  • 위에 아래의 내용들을 순서대로 정리. 나중에 참고 할 것.
    1. denoting(변수정의)
    2. (un) self-supervised Domain adaptation에서 Loss함수
    3. Pseudo label 생성하는 수식 및 추가 Details

4. Method

4.1. Prototypical pseudo label denoising

  • Centroids를 사용해서 Pseudo label 보정하기 (아래 과정으로 설명 되어 있다.)
    1. formula to rectify nosiy pseudo label
    2. weight calculate
    3. Prototype(centroids) computation
    4. Pseudo label training loss
    5. Why are prototypes useful? 분석
  1. formula to rectify nosiy pseudo label

    • 문제점 : Source로 학습된 모델은, Target Image에 대한 inference결과로 Noisy labels을 생성하는데 Overfitting되었다. 그래서 Threshold를 넘는 Pseudo label을 생성하기까지 너무 오랜시간이 걸린다.

    • not good 해결책 : Pseudo label과 Network weight를 동시에 update하는 것은 그리 좋은 방법이 아니다. 학습이 불안정하게 이뤄지므로.

    • good 해결책2 : online update the pseudo labels(the pseudo labels을 그 이미지 배치 학습 그 순간순간 마다, noisy를 제거해서 다시 생성해 주는 것)

    • 해결책 2 수행 방법 : fix the soft pseudo labels & progressively weight(가중치를 주다) them by class-wise probabilities using Centroids(Prototypes) (주의!) 이때, 아래의 수식에서 P_t,o는 처음 source model에 의해서 정해진 값이고 학습과정 내내 고정되어 있다고 한다.(? 코드 확인하기)
      image-20210404154400700

  2. weight calculate

    • 아래 공식의 ω_t는 직관적으로 p_t의 비슷할테지만, 실험적으로 trust confidence(label)과 비슷한 것을 확인할 수 있다.
    • 이 weight공식은 few-shot learning에서 많이 사용되는 기술이다. few-shot learning에서는 classifying new samples을 목적으로 사용하지만 우리는 당연히 recity pseudo labels을 하기 위에서 사용한다.
      image-20210404155035886
    • Momentom Encoder가 무슨 느낌이냐면, data augmentation처럼 “모델을 힘들게 하고, 다른 결과를 생성하게 만드는 그런 혼동의 존재”의 반대이다. 비슷한 이미지가 들어오면 비슷한 결과를 추론하게 만들어 준다.
  3. Prototype(centroids) computation

    • 위의 weight공식에서 η가 각 class마다 가지고 있는 Prototype(centroids)이다. 이 것을 계산하는 공식은 아래와 같다.
    • 이 값은 on-the-fly으로 계산되고 업데이트 된다. 이 값을 계산하는 것은 computational-intensive (계산 집약된 무거운) 문제를 가질 수 있기 때문에, 아래의 수식과 같이 moving average of the cluster centroids in mini-batches을 사용해서 centroids를 업데이트 한다.
      image-20210404155616051
  4. Pseudo label training loss

    • symmetric cross-entropy (SCE) 을 사용한다. in order to further enhance the noise-tolerance to stabilize the early training phase(?)
      image-20210404155755037
  5. Why are prototypes useful? 분석

    1. 아래의 이미지에서 볼 수 있듯이, centroids는 outliers(dicision boundary)에 덜 sensitive하다. 그래서 아래 이미지의 필기 1~4 번 과정이 이뤄지면서 rectify pseudo label이 가능하다.
    2. centroids를 사용함으로써 class inbalance문제에도 덜 sensitivie하다. 만약 사람 class의 occurrence frequency(발생 빈도 = class를 가지는 이미지 수)가 매우 높다면, 비슷한 위치에 존재하는 feature이지만 다른 class인 원숭이의 학습이미지가 별로 없다면, 모델은 p(추측결과)로 사람 class를 선택할 가능성이 높다. 하지만 centroids는 그런 occurrence frequency와 관련이 없다.
    3. 실험적으로 denoise한 결과가 실제 target label에 더 가까운 값을 가지는 것을 확인했다.
    4. 따라서 centroids를 사용함으로써 gradually rectify the incorrect pseudo labels를 수행할 수 있다.

image-20210404145209925


4.2. Structure learning by enforcing consistency

  • 문제점 1
    • 위 이미지의 Figure1 (a)과 같은 도식이 나오려면 조건이, feature extractor의 최종 결과가 class마다 compact한 feature들이 나온다는 조건에서 저렇게 그려질 수 있다.
    • [42]에서 찾아진 문제점 : 만약 Figure1 (b) 처럼 각 class에 대해서 feature가 compact한 결과가 나오지 않는다면 centroids를 사용하는게 의미가 없고 차라리 성능이 더 떨어질 수도 있다. (If the darget distribution is dispersed, the prototypes fail to rectify the pseudo label)
    • 이러한 문제가 발생하는 가장 큰 이유는, 매우 적은 수의 target pseudo label들이 target domain의 모든 distribution을 커버할 수 없기 때문이다. (즉 feature embeding 공간상에서 feature vector가 너무 드문드문 존재하기 때문이다. 이러니 dispersed한 형상일 수 밖에 없다.)
  • 해결책 1
    • target domain의 underlying structure (근본적인 본질적인 구조 정보)를 사용한다! 더 compact한 feature embeding 모습을 가지기 위해서.
    • 그래서 최근 unsupervised learning에서 성공적으로 사용되고 있는, simultaneously clustering and representation learning기법을 사용한다. 그 기법은 data augmentation을 적절히 사용한다.
    • we use the prototypical assignment under weak augmentation to guide the learning for the strong augmented view
      image-20210404161819342
    • 위 필기(우상단)의 soft, hard는 label을 의미하는 것이 아니라, soft augmentation, hard augmentation을 의미한다.
    • 이 과정을 통해서 produce consistent assignments(consistent prototypical labeling for the adjacent feature points) 할 수 있게 한다. 즉 f가 좀 더 compact한 feature를 생성하도록 만드는 것이다.
  • 새로운 문제점 2
    • 위 과정의 장점이 있지만, 단점으로 degeneration issue 가 발생할 수있다. (one cluster becomes empty = P_k에서 하나만 1이 되고 나머지는 0이라면 모든 feature가 가장 compact하게 뭉치는 것이므로, 의도치 않게 f가 이런 p를 생성하는 모델이 되어진다.)
  • 2 해결책
    • use a regularization term from [76]
      image-20210404163802707
  • Total loss
    image-20210404163847806

4.3. Distillation to self-supervised model

  • 진짜 Target model을 supervised로 학습시킨 모델과 비슷한 모델이 되도록, 영혼을 다해 끌어당긴다. Knowledge distillation을 사용해서.
  • Knowledge distillation을 사용하기는 하지만, student model은 teacher와 same architecture를 가지지만 self-supervised manner(SimCLRv2 [11])로 pretrained된 모델을 사용한다.
    image-20210404165118504
  • 첫 Loss_ce값은 model의 source data에 대한 성능 저하를 막기위해 사용된다.
  • 실제 실험에서는 Knowledge distillation을 한번만 하는게 아니고 여러번 반복한다.
  • Knowledge distillation을 통해서 DA결과가 achieve even higher performance하도록 만든다.

5. Experiments

  • Training
    • DeepLabv2 [8] with ResNet-101 [25]
    • a warm-up으로 Learning to adapt structured output space 논문의 기법을 사용한다.
    • the initial learning rate as 1e-4 which is decayed by 0.9 every training epoch
    • training lasts 80 epochs
    • data augmentation : random crop, RandAugment [15] and Cutout [16]
    • SimCLRv2 model with the ResNet-101 backbone as well
    • Extra batch normalization (BN) (?)
    • distillation stage, we use hard pseudo labels with the selection threshold 0.95
    • 4 Tesla V100 GPUs
  • Dataset
    • game scenes : GTA5 [45] and SYNTHIA [46] datasets
    • real scene, the Cityscapes [14] dataset
    • The Cityscapes는 500 images for validation을 가진다. GT를 제공하지 않는 validation set이기 때문에, we conduct evaluations on its validation set.
  • Ablation Study
    image-20210404165626785
  • Result Matrix
    image-20210404165651962

세미나 이후 인사이트 추가

img img img img img img img img img img img img

【Lecture】startup company

  • 스타트업 관련 강의 정리

1. 서울로보틱스 이한빈 대표

  • B2B 같은 경우에는 절대 한국 company부터 시작하지 말아라. 외국에서 시작하라.
  • Korea Preimum은 진짜다. 다른 기업의 기술을 배껴서 싸게 많이 판다는 전략은 이제 한국에서 안 통한다. 왜냐면 중국보다 더 싸게 팔 수 없기 때문이다. 중국보다는 비싸더라도 한국 프리미엄의 신뢰성을 강조해야한다.
  • Don’t funcking waste your time. 그 좋은 머리 가지고 박사하고 논문 종이 찍어내지말고, 위험성을 감안하여 도전하고 시도해보는건 어떠냐?
  • 세계 곳곳의 지사의 장점 : 각 나라마다 장점과 특성이 있다. 현지인이기 때문에 비지니스하는데 문제가 없다.
  • 대표를 하면 인생이 갈려나가지만, 존버하면 언젠가 기회가 온다.
  • (1) Accuracy (2) Speed(Efficiency) (3) Robustness
  • 컴퓨터비전 회사는 결국 Data와 Labeling 싸움이다. Data는 회사에서 주고, Labeling은 해외회사가 일도 잘하고 싸다.
  • 현대랑 일 해봤는데, 함께 일하던 팀은 항상 1년 후에 부서 재배치 받더라. 이렇게 지긋이 못하니까 소프트웨어 회사들에 밀리는거다.
  • 박사학위가 회사 창업 성공과는 크게 관련이 없다. 하지만 고객과 회사들에게 기술력을 인정받으려면 박사학위 대표가 필요할 수도 있다.
  • 라이더 회사 아니다. 3D 컴퓨터 비전 회사다. 라이더 상용화 가능? 무조건이다. 이미 많은 차 회사들이 라이더를 이용하고 있다.
  • 진짜 필요한 능력은 (1) 알고리즘 구현 능력 - 수학적 능력 (2) 논문의 내용을 코딩으로 구현하는 능력. 그럼에도 불구하고 가장 필요한 능력은 “빨리 배우고 빨리 습득하고 능력”이다.
  • 현대랑 삼성이랑 협업 안하고도, 해외 회사들과 협업해서 살아남을 수 있다. 일본 분위기 회사가 아닌 중국 회사에 밀리지 않는 회사가 많이 나오면 좋겠다.

【DA】Domain Adaptive Semantic Segmentation Using Weak Labels

  • 논문 : Domain Adaptive Semantic Segmentation Using Weak Labels
  • 분류 : Domain Adaptation
  • 느낀점 :
  • 참고 사이트 : ECCV Presentation
  • 목차
  • 일어야할 논문들
    • Learning to adapt structured output space for semantic segmentation [49] : 이 논문에서 Sementic Segmentation을 위해서 여기서 사용하는 Architecture를 사용했다. 이 코드를 base code로 사용한 듯 하다.


DA Semantic Segmentation Using Weak Labels

이 논문의 핵심은 weak labels in a Image( 이미지 내부의 객체 유무 정보를 담은 List(1xC vector)를 이용하는것 ) 이다.

1. Conclusion, Abstract

image-20210401225204575

  • 논문의 핵심만 잘 적어 놓은 그림이다.
  • 하지만 Weak label for category-wise Alignment, Weak label classification Module은 그림으로 보고 이해하려고 하지말고, 아래 Detail과 Loss함수를 보고 이해하도록 해라.
  • 당연한 Domain Adatation의 목표 : lacking annotations in the target domain

3. DA with Weak Labels Method

3.1 Problem Definition

image-20210401230116281


3.2 Algorithm Overview

  • Model Architecture
    image-20210401230133034
  • 이 이미지에서 Domain Adaptation에서 많이 사용되는 Adversarial Discriminative Domain Adaptation이 핵심적으로 무엇인지 오른쪽 필기에 적어 놓았다. 진정한 핵심이고 많이 사용되고 있는 기술이니 알아두도록 하자.
  • Conference Presentation 자료 정리
    image-20210401235541159

3.3 Weak Labels for Category Classification

  • 이 과정의 목적은 segmentation network G can discover those categories 즉 segmentation network인 G가 domain이 변하더라고 항상 존재하는 Object/Stuff에 pay attention 하도록 만드는 것을 목표로 한다. G가 이미지 전체의 environment, atmosphere, background에 집중하지 않도록 하는데에 큰 의의가 있는 방법이다.
  • (Eq1) Global Pooling이 적용되는 방법과, (Eq2) Loss 수식에 대한 그림이다.
    image-20210401231357314
  • 이미지에 특정 class가 있는지 없는지에 대해서 집중하기(판단하기) 위해서 Global Pooling이 사용되었다.
  • 위에 (1)식에 사용되는 수식은 smooth approximation of the max function이다. k가 무한대로 크면 max pooing이 적용된 것이라고 할 수 있다. 하지만 하나의 값으로 pooling 값이 정해지는 max pooling을 사용하는 것은 Noise에 대한 위험을 안고 가는것이기 때문에, 적절하게 k=1로 사용했다고 한다.
  • Pooling에 의해서 적절한 값이 추출되게 만들기 위해서는 Loss함수가 필요한데, 그 함수를 (2)번과 같이 정의하였다. category-wise binary cross-entropy loss를 사용했다고 말할 수있다.

3.4 Weak Labels for Feature Alignment

  • image-level weak labels의 장점과 특징
    • 위의 방법을 보면 distribution alignment across the source and target domains(domain 변함에 따른 데이터 분포 변화를 고려한 재정비 기술들) 이 고려(적용)되지 않은 것을 알 수 있다.
    • 적용되지 않은 이유는, 우리가 category를 이용하기 때문이다. performing category-wise alignment를 적용하는 것에는 큰 beneficial이 있다. (3.3의 내용과 같이, class에 대한 특성은 domain이 변하더라도 일정하기 때문에)
    • 과거에 performing category-wise alignment을 수행한 논문[14]이 있기는 하다. 하지만 이 방법은 pixel-wise pseudo labels을 사용했다.(?)
    • 반면에 우리는 pixel-wise가 아니라 image-level weak labels를 사용했다. 그냥 단순하게 사용한 것이 아니라. an attention map guided by our classification module(global pooling) using weak label을 사용한 것이므로 매우 합리적이고 make sense한 방법이라고 할 수 있다.
  • Category-wise Feature Pooling
    image-20210401233013356

  • Category-wise Feature Alignment
    image-20210401233336307
    • 핵심은 Discriminator를 하나만 정의하지 않고, each category-specific discriminators independently를 사용했다는 점이다.
    • 이렇게 하면 the feature distribution for each category가 독립적으로 align되는 것이 보장될 수 있다. (맨위의 이미지를 보면 이해가 될 거다.)
    • a mixture of categories를 사용하면 the noisy distribution 문제점이 존재한다.
    • 그 이외의 내용들은 위 사진의 필기에 잘 적혀있으니 잘 참고할 것

3.5 Network Optimization

image-20210401234406864


3.6 Acquiring Weak Labels

  1. Pseudo-Weak Labels (UDA)
    • the unsupervised domain adaptation (UDA)
      image-20210401234539237
    • T는 threshold이다. 실험적으로 0.2로 세팅해서 좋은 결과를 얻었다.
    • 학습하는 동안에 the weak labels은 online 으로 생성해서 사용했다.
  2. Oracle-Weak Labels (WDA)
    • 사람의 조언(Human oracle)이 이미지 내부에 존재하는 카테고리의 리스트를 만들도록 한다.
    • weakly-supervised domain adaptation (WDA)
    • pixel-wise annotations 보다는 훨씬 쉽고 효율적이다.
    • 위의 방법 말고도 이 논문에서 Fei-Fei, L.: What’s the point: Semantic segmentation with point supervision. In: ECCV (2016) 논문에 나오는 기법을 WDA로 사용했다. (아래 Results의 성능 비교 참조)
    • 이 기법은 사람이 이미지 일정 부분만 segmentation annotation한 정보만을 이용하는 기법이다.
      image-20210401235242988

4. Results

  • 당연히 성능이 올라갔다. 자세한 내용은 논문을 참조 하거나 혹은 conference presentation 자료를 아래에서 참조하자.
  • 여기서 사용한 Weak Label은 2가지 이다. 아이러니 하게도… 이 논문에서 제안된 핵심 Weak label 기법보다 2016년에 Fei-Fei가 작성한 what’s the point 논문 기법으로 더 좋은 결과를 얻어냈다. (하지만 논문에서는 자기들 기법이 더 빠르게 anotaion할 수 있다고 한다. (?)
    image

1_Domain Adaptive Semantic Segmentation-1.png 1_Domain Adaptive Semantic Segmentation-2.png 1_Domain Adaptive Semantic Segmentation-3.png 1_Domain Adaptive Semantic Segmentation-4.png 1_Domain Adaptive Semantic Segmentation-5.png

【docker】Windows10에서 원격서버의 docker container에 접속하기

  • 최종결과 화면
    image-20210329204418671
  • 꼭 reference 사이트에 들어가서 순서대로 따라할 것.
  • 사이트 내부의 내용을 모두 정리하지 않을 계획이다.

Windows10에서 원격서버의 docker container에 접속하기

1. Reference

  1. https://www.44bits.io/ko/post/wsl2-install-and-basic-usage
  2. https://hwan-shell.tistory.com/182
  3. https://seokhyun2.tistory.com/42
  4. https://seokhyun2.tistory.com/48

2. WLS 및 docker desktop 설치

  • 참고 : https://www.44bits.io/ko/post/wsl2-install-and-basic-usage
  • WLS2와 docker desktop을 설치한다. 이 과정이 꼭 필요한 과정인지는 모르겠다. vscode에서 attach container를 하면 make sure docker deamon is running 이라는 에러가 났다. 이 문제를 해결하기 위해서 docker desktop을 설치해야하는 듯 했다.
  • windows home을 사용하기 때문에 WLS2를 설치해야만 docker desktop을 설치할 수 있었다.
  • 사이트 순서를 정리하면 다음과 같다
    1. Windows Terminal 설치하기
    2. WSL 활성화를 위해서 PowerShell에서 두개의 명령어를 복붙 처주기
    3. WSL 설치하기 = MS store에서 Ubuntu 설치하기
    4. WSL1을 2로 업데이트 시켜주기 (커널을 설치해주고 PowerShell에서 $ wsl --set-version/default 처리 해주기 )
    5. Docker Desktop 설치하기 (windows home이지만, WSL2를 설치해놨기에 docker가 잘 설치가 되었다.)
    6. Docker 세팅 바꿔서 Ubuntu Terminal in window10에서도 docker 사용할 수 있게 만들기

3. VScode에서 SSH-remote 연결하기

  • Remote - Docker Containers extension만 설치하면 안된다. 우선 SSH 연결이 필요하다

  • 따라서 아래의 사이트를 참고 해서 다음의 과정을 진행해준다.

  • 순서 정리

    1. window vscode에서 Remote Development extention 설치 (Remote 관련 extention 다 설치된다)

    2. Ubuntu Server 아래의 명령어 실행

      • $ sudo apt-get update
        $ sudo apt-get install ssh
        $ sudo apt-get install openssh-server
        $ sudo nano /etc/ssh/sshd_config # port 22 만 주석 풀어주기
        $ sudo service ssh status
        $ sudo service ssh start
        방화벽
        $ sudo ufw enable
        $ sudo ufw allow 22
        $ sudo ufw reload
        
    3. 윈도우 agent 세팅해주기

      • 관리자모드 CMD - $ sc config ssh-agent start=auto
      • $ net start ssh-agent
    4. 윈도우에서 ssh-keygen해서 ubuntu에 넣어주기 (사이트)

      • Powershell : $ ssh-keygen -t rsa -b 4096
      • Powershell : $ Get-Content .\.ssh\id_rsa.pub - 그러면 출력되는 긴~~ 결과물이 있을텐데, 그것을 복사해서 메일로든 뭐든 저장해두기
      • Ubuntu : $ code /home/junha[=userName]/.ssh/authorized_keys - Ubuntu : $ chmod 644 /home/junha/.ssh/authorized_keys : 이렇게 설정해주면 윈도우에서 ssh연결할때 우분투 비밀번호 안물어본다.
      • 여기에 그~대로 key 복붙해서 저장해두기 (아래 이미지 참조) - (에러 발생 및 문제 해결) 같은 아이피를 사용하는 우분투 케이스를 바꿔서 다시 연결하려니 안됐다. 이때 해결책 : 윈도우에서 known_hosts파일 삭제하기. $ cd C:\Users\sb020\.ssh && rm ./known_hosts
    5. 윈도우 VScode ssh config

      • VScode -> ctrl+shift+p == F1 -> Remote-SSH: Connect to Host

      • Host server1
        	HostName 143.283.153.11 # 꼭! ifconfig해서 ip확인
        

        User junha

    IdentityFile ~/.ssh/id_rsa ```

    • 위와 같이 config 파일저장해두기

    • 그리고 SSH VScode로 연결해보면 아주 잘된다.
      image-20210329211438915 ```

4. Ubuntu Docker 설치 및 Container 실행

  1. Docker 설치 : 기본 Docker 를 설치해줘야 NVIDA docker로 업그레이드 가능

  2. 우분투에 NVIDA Driver 설치

  • $ sudo ubuntu-drivers devices
    • $ sudo ubuntu-drivers autoinstall
  • $ reboot
    • 꼭 드라이버 설치하고, $ nvida-smi 하기 전에, reboot 꼭 해보기.
    • $ nvidia-smi
  1. NVIDIA-Docker 설치

    • # 정리
      1$ curl https://get.docker.com | sh \
        && sudo systemctl --now enable docker
      2$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
         && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
         && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
      3$ sudo apt-get update
      4$ sudo apt-get install -y nvidia-docker2
      5$ sudo systemctl restart docker
      6test-$ sudo docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi
      
  2. ML workspace Docker Image 다운로드(pull) 및 container Run

    • $ sudo docker run -d \
          -p 8080:8080 \
          --name "8080ML" \
          --runtime nvidia \
          --env NVIDIA_VISIBLE_DEVICES="all" \
          -v "${PWD}/docker_ws:/workspace" \
        --env AUTHENTICATE_VIA_JUPYTER="junha" \
          --shm-size 512m \
          --restart always \
          mltooling/ml-workspace:0.12.1
      
    • ### 설명 추가
      $ sudo docker run -d \ # background 실행
          -p 8080:8080 \ # 앞 포트는 내 우분투 포트, 뒤 포트는 컨테이너 내부 우분투 포트, 실험에 의하면 host-port/container-port이며, host-port만 바꿔주고 container-port는 8080으로 고정해서 사용하자
          --name "8080ML" \ # 맘대로 해라
          --runtime nvidia \ # 이거 꼭! 
          --env NVIDIA_VISIBLE_DEVICES="all" \ # 이것도 꼭 
          -v "${PWD}/docker_ws:/workspace" \ # 터미널실행PWD=="${PWD}"/docker_ws 폴더 만들어 놓기
        --env AUTHENTICATE_VIA_JUPYTER="junha" \ # 비밀번호
          --shm-size 512m \ # 일단 해놈. 안해도 될듯 
        --restart always \ # 알지? 
          mltooling/ml-workspace:0.12.1 # docker-hub에 버전 참고
      

      ```

    ```

## 5. Docker Container 연결하기

  1. 참고

  2. VScode -> ctrl+shift+p == F1 -> Preferences: Open Settings (JSON)

  3.   {
        "docker.host": "ssh://junha@143.283.153.11"
      }
    
  4. 이렇게 수정해두기. 위에서 junha로 하는 대신 우분투에서 아래의 작업 진행

  5.   $ sudo usermod -aG docker junha
    
  6. VScode -> ctrl+shift+p == F1 -> Remote-Containers: Attach to Running Container

  7. 존버타고 있으면, 서버에 실행되고 있는 container 목록이 뜬다. 원하는거 선택하고 Open 및 설정이 완료되기까지 시간이 좀 걸린다.

  8. 그러면 최종 성공!
    image-20210329211903648

6. 완성!

  • Windows10

image-20210329213115925

  • Ubuntu

image-20210329213208677

7. VS code 환경설정

  1. 아래와 같이 Python Interpreter 설정을 해야한다.
  2. ML-workspace자체에 conda가 설치되어 있고, base env는 opt/conda/bin/python 에 존재한다. interpreter에 마우스 길게 갖다 대고 있으면 path가 나온다. 나의 window conda path와 겹칠일은 없겠지만 그래도 조심하자.
    image-20210329223237549

8. docker container에서 code 명령어 사용하기

  • reference site : The “code” command does not work when connecting to a Docker container remotely with VSCode

  • 종합적으로, 아래의 명령어를 docker container Terminal에 입력했다.

    $ ls ~/.vscode-server/bin # hash name 파악하기
    $ export PATH="$PATH:$HOME/.vscode-server/bin/<hash name>/bin/"
    (예시) $ export PATH="$PATH:$HOME/.vscode-server/bin/08a217c4d27a02a5bcde8555d7981bda5b49391b/bin/"`
      
    $ code ~/.bashrc
    (Addding in the file) export PATH="$PATH:$HOME/.vscode-server/bin/08a217c4d27a02a5bcde898555981bda5b49391b/bin/"` 
    

9. –shm-size 의 중요성

mmclassification 을 돌리면서 만난 에러가 다음과 같았다.
RuntimeError: DataLoader worker (pid 167565) is killed by signal: Bus error. It is possible that dataloader's workers are out of shared memory. Please try to raise your shared memory limit

찾아보니 원인은 다음과 같았다.

  1. 도커로 컨테이너를 생성하게 되면 호스트와 컨테이너는 공유하는 메모리 공간이 생기게 되는데 이 공간에 여유가 없어서 발생되는 에러이다.(참조사이트)

  2. container $ df -h 명령어로, shm가 얼마인지 확인할 수 있다.

  3. container run 할 때 충분한 -shm-size 를 설정해주는 방법이 답이다.

  4. ML-workspace github 참조
    image

  5. 찾아보니, 대강 이 문제가 발생한 사람들은 docker run --shm-size=2G 설정한다. 어떤 글을 보니 docker run --ipc=host 이런식으로 설정해주는 사람도 있었다. 어떤 사람은 8G로 설정하는 경우도 있었다. (문제 안생기나?)

    # 최종 실행 터미널 코드
    $ sudo docker run -d -it      \
    --gpus all         \
    --restart always     \
    -p 8000:8080         \
    --name "mmcf"          \
    --shm-size 2G      \
    -v ~/docker/mmclf/mmclassification:/workspace   \
    -v ~/hdd1T:/dataset   \
    pytorch/pytorch:1.5.1-cuda10.1-cudnn7-devel
    
  6. 또한 $ watch -d- n 1 df -h 명령어를 사용해서 현재 container가 어느정도의 –shm-size를 사용하고 있는지 알 수 있다.

  7. 참조 사이트 : pytorch-issue, share-memory-8G

10. 새로운 windows로 원격 vscode 코드 열기

  1. vscode에서 단축키 변경으로 ctrl + k + s
  2. duplicateWorkspaceInNewWindowctrl+shift+n 으로 단축키 지정해주기
  3. 참조 사이트

11. permission denied

참고 나의 포스트

  • 핵심 : $ sudo chown -R junha:junha ./detectron2/

【Transformer】Pre-Trained Image Processing Transformer



Pre-Trained Image Processing Transformer

1. Conclusion, Abstract

  • Conclusion
    • pre-trained transformer model (IPT)을 사용해서, 기본적인 이미지 프로세싱 문제(Denoising, Deraining, SRx2=super resolution 2배, SRx4)를 해결한다.
    • Class, Image Color도 다양하게 가지고 있는 종합적인 ImageNet datesets를 degraded한 이미지 데이터를 pre-trained dataset으로 사용했다. 모델이 low-level image processing을 위한 intrinsic features를 capture하는 능력을 향상시킬 수 있었다.
    • (1) supervised and self-supervised approaches (2) contrastive learning approaches 모두 융합해서 모델을 학습시킨다.
  • Abstract
    • pre-trained deep learning models을 사용해서, 원하는 Task의 모델을 만드는 것은 좋은 방법이다. 특히나 transformer module을 가지고 있는 모델은 이런 과정이 주요한 이바지를 할 것이다.
    • 그래서 우리가 image processing transformer (IPT)을 개발했다.
    • 다른 image processing task들에서도 금방 적응할 수 있도록, Contrastive learning을 수행했다!

3. Image Processing Transformer

image-20210328130543692

  • 위 이미지 그림과 필기 먼저 확실히 파악하기

3.1 IPT architecture

  • 4개의 components : (1) Head = extract features from input imaeg) (2) Encoder = (3) Decoder = 이미지에 중요한 missing 정보를 capture&recover 한다. (4) tails = Final restored images를 만들어 낸다.
  • Head
    • 각각의 Task에 대해, 3 conv layer로 이뤄진다. 이미지 x가 input으로 들어가서 f_H가 만들어진다.
      image-20210328131546974
  • Transformer encoder
    • Almost same Transformer in All you need is Attention
    • Split the given features into patches
    • Learnable position encodings -> Element-wise SUM
      image-20210328131917272
  • Transformer decoder
    • Almost same encoder Transformer : 다른 점은 a task-specific embedding (Task에 따라서 다른 emdedding 백터 사용)
    • two multi-head self-attention (MSA)
      image-20210328132514512
  • Tails
    • Head와 같이 3 conv layer로 이뤄진다.
      image-20210328132729227
    • 여기서 H’그리고 W’는 각 Task에 적절한 Size가 되면 된다. 예를 들어 Task가 SRx2 이라면 W’ = 2W, H’ = 2H가 되겠다.

3.2 Pre-training on ImageNet

  • the key factors for successfully training은 바로, the well use of large-scale datasets 이다!
  • 하지만 image processing task에 특화된 Dataset 별로 없다. 예를 들어 DIV2K (only 2000 Images). (이 Dataset은 ImageNet을 manually degrading한 것과는 다르다고 한다. 이러한 다름을 고려하여 추후에 generalization ability에 대해 분석해본다.)
  • 따라서 ImageNet을 사용해서 we generate the entire dataset for several tasks. 이것을 이용해서 Pre-training model을 만든다!
  • ImageNet에서 Label에 대한 정보는 버려버리고,, 인위적으로 여러 Task에 맞는 a variety of corrupted images를 만들었다.
    image-20210328133446178
  • 이 과정을 통해서, Model은 a large variety of image processing tasks에 대해서 the intrinsic features and transformations을 capture할 수 있는 능력이 생긴다. 그리고 추후에 Fine-tuning과정을 거치기는 해야한다. 그때는 당연히 원하는 Task에 맞는 desired task using the new provided dataset를 사용하면 된다.
  • Contrastive Learning
    • we introduce contrastive learning for learning universal features.
    • 이 과정을 통해서 the generalization ability (= adaptation, robustness of Tasks or Image domains)을 향상하는데 도움을 준다. 다시 말해, pre-trained IPT 모델이 unseen task에 빠르게 적응하고 사용되는데 도움을 받는다.
    • 한 이미지로 나오는 Feature map의 Patch들의 관계성은 매우 중요한 정보이다. NLP에서 처럼(?) 하나의 이미지에서 나오는 patch feature map은 서로 비슷한 공간에 최종적으로 embeding되어야 한다.
    • We aims to (1) minimize the distance between patched features from the same images (2) maximize the distance between patches from different images
    • 최종 수식은 아래와 같이 표현할 수 있다. 맨아래 수식이 Final 목적 함수이다
      image-20210328140204710

4. Experiments and Results

  • 각 Task에 따른, 결과 비교는 아래와 같다.

image-20210328142118123

  • Generalization Ability
    • 비록 우리가 ImageNet으로 currupted image를 만들었지만, 이 이미지와 실제 DIV2K와 같은 dataset과는 차이가 존재하고 실제 데이터셋이 더 복잡하다.
    • 데이터셋에 따라서, 모델의 성능에서도 차이가 존재할 것이기에, generalization ability를 실험해보았다. 실험은 denoised Image Task에 대해서 실험한 결과가 나와있다.
      image-20210328142558904


【Detection】Tokens-to-Token ViT



Tokens-to-Token ViT

1. Conclusion, Abstract

  • Conclusion
    • the novel tokens-to-token (T2T) 이란?? proggressively image/feature 를 tokenizing 하는 것
    • 장점(1) 이미지의 구조정보를 파악할 수 있다. (2) feature richness를 향상시킬 수 있다.
    • 특히 backbone에서는 the deep-narrow architecture = transformer layer는 많이 hidden dimention은 작게 가져가는 것이 효율적이다.
  • Abstract
    • ViT 문제점 : midsize dataset으로 학습시키면, CNN 보다 성능이 낮다.
    • 문제점 이유1 : Image patch를 그대로 tokenization해서 important local structure(edge, line, 주변 픽셀과의 관계) 등을 파악할 수 없다.
    • 문제점 이유2 : redundant attention backbone(너무 많은 Attention layer, 여기서 backbone은 Transformer encoding 앞에 있는 layer가 아니라, 그냥 Image patch의 PE이후에 Transformer encoding 전체를 의미하는 것이다.)

2. Instruction, Relative work

image-20210326211042928

  • 위 그림은 (1) ResNet (2) ViT (3) T2T-ViT 내부를 각각 들여다 본 그림이다.
  • 확실히 녹색 박스와 같이 ResNet과 T2T에서는 Desired Local Structure를 잘 파악하는 것을 알 수 있다.
  • 하지만 ViT에서는 너무 Global attention에만 집중해서 Local Structure에 대해서 잘 파악하지 못한다. 심지어 빨간 박스처럼 쓰레기 같은 결과가 나오기도 한다.
  • our contributions
    • visual transformers이 진짜 CNN을 띄어넘게 만들기 위해서, (1) T2T module (2) efficient backbone 을 만들었다.
    • a novel progressive tokenization
    • Backbone으로 Transformer encoder와 같은 구조를 차용하기도 하지만, the architecture engineering of CNNs 을 사용해서 비슷한 성능(ResNeXt)혹은 조금더 나은 성능(SENet)을 얻는다.

3. Method

  • 논문의 핵심 전체 Architecture는 아래의 이미지라고 할 수 있다.
    • 아래의 그림과 같이 T2T-ViT는 2개의 구성으로 나눌 수 있다. (1) Tokens To Token Module (2) T2T-ViT Backbone 각각의 목적과 목표는 아래 필기에 정확하게 정리해 적어놓았으니, 녹색과 빨간색 필기를 꼭 참고하기 바란다.
    • 참고로 여기서 length는 vector dimention을 의미하는게 아니라, vector의 갯수를 말한다.
      image-20210326211700095
  • T2T module(process) : 위 그림에서 T2T
    image-20210326211801773
    • Step1 : spatial 형상의 이미지처럼 토큰을 reshape한다.
    • Step2 : Soft split처리를 함으로써 이미지의 지역정보를 학습하고 토큰의 length(갯수)를 줄일 수 있다. 토큰을 overlapping을 해서 patch 형태로 split 하는 것이다. 이렇게 함으로써 주변 tokens들과의 더 강한 correlation을 파악 할 수 있다. (ViT처럼 patch로 처음에 자르고 그 patch들 (특히 주변 patch들간의 관계성에 대한 정보를 넣어주지 않으면 지역정보(edge, line)를 파악할 수 없다.)
    • 전체를 정리하면, 위 그림의 오른쪽 아래 식과 같이 나타낼 수 있다.
    • ViT에서는 Patch의 수가 16*16 즉 256개였다. 이것또한 메모리 관점으로 굉장히 많은 숫자였다. 그래서 우리의 T2T 모둘은 patch수는 어쩔 수 없고, the channel dimension을 small (32 or 64)으로 설정함으로써 메모리 효율을 높이고자 노력했다.
  • T2T-ViT Backbone
    • reduce the redundancy / improve the feature richness
    • Transformer layer를 사용하기는 할 건데, 그들의 조합을 어떤 구조로 가져갈 것인가? (자세한 구조는 Appendix를 참조)
      1. DenseNet
      2. ResNets
      3. (SE) Net
      4. ResNeXt = More split heads in multi-head attention layer
      5. GhostNe
    • 많은 실험을 통해서 the deep-narrow architecture = transformer layer는 많이 hidden dimention은 작게 가져가는 것이 효율적이라는 결론을 얻었다.
    • 여기서는 fixed length T_f가 이뤄진다. 그리고 concatenate a class token 마지막으로 Sinusoidal Position Embedding (PE)을 사용하는게 특징이다.
      image-20210326213635717
  • T2T-ViT Architecture
    • n = 2 re-structurization
    • n+1 = 3 soft spli
    • patch size P = [7, 3, 3]
    • overlapping is S = [3, 1, 1]
    • Reduces size of the input image = from 224 × 224 to 14 × 14
    • batch size 512 or 1024 with 8 NVIDIA

4. Results

  • Table1: 다양한 구조의 T2T-ViT 모델들
  • Table2,3,4 : 기존의 모델(1. ViT 2. ResNet 3. MobileNet)들과 비교 결과

image-20210326214106574

  • 어떤 구조가 가장 좋은지 비교
    image-20210326214205431

  • 좀 더 자세한 설명은 필요하면 나중에 논문 참조하기



Youtube 참고 정리

【Detection】Feature Pyramid Transformer

  • 논문 : Feature Pyramid Transformer
    논문 필기는 C:\Users\sb020\OneDrive\21.1학기\논문읽기_21.1 여기 있으니 참조
  • 분류 : Detection
  • 읽는 배경 :
  • 느낀점 :
    1. 이 논문도 약간 M2Det같다. 뭔가 오지게 많이 집어넣으면 성능향상이 당연하긴하지.. 약파는 것 같다.
    2. 비교도 무슨 Faster-RCNN, Mask-RCNN 이런거 써서 비교하는게 전부이고 약간 많이 부족하고 아쉬운 논문이다.


Feature Pyramid Transformer

image-20210325162755839

  • 이 그림이, 이 논문의 전부. FPN의 결과에 Same size + richer contects 를 가지는 feature map 만드는 것을 목표로 한다.
  • 보라색 동그라미 부분과 같이, (1) feature map 그대로 self-attention을 수행하는 Self-transformer (2) Up! 하는 Rendering Transformer (3) Down! 하는 Grounding transformer 를 제안했다. (개인적인 생각으로, 이 방법이 약간 어설프고? 약간 너무 파라메터와 레이어를 무작정 늘리는 행동? 같다.)

1. Conclusion, Abstract

  • efficient feature interaction approach
  • 3개의 Step : Encoder(Self-Transformer), Top-down(Grounding Transformer), Bottom-up(Rendering Transformer)
  • FPN(feature pyramid network)에서 나온 P2~P5에 FPT(feature pyramid transformer)를 적용해서 P2~P5는 크기는 보존되는데 좀더 Sementic한 Feature map이 되게 만든는 것을 목표로 한다.(the same size but with richer contexts) 따라서 이 모듈은 easy to plug-and-play 한 모델이다. (대신 파라메터수가 엄청 많아 진다. 결과 참조)
  • the non-local spatial interactions (2017년에 나온 논문으로 MHSA과 비슷한 구조를 가지고 있지만 좀 다르다 예를들어서 Multi head를 안쓴다던지…)는 성능향상에는 도움이 된다. 하지만 across scale 정보를 이용하지 않는다는 문제점이 있다.
  • 이 문제점을 해결하고자 interaction across both space and scales을 수행하는 Feature Pyramid Transformer (FPT) 모듈을 만들었다.

2. Instruction, Relative work

image-20210325162730412

  • 위의 그림이 개같으니 굳이 이해하지 못해도 상관하지 말기
  • Fig. 1 (d) : non-local convolution을 통해서 상호 동시 발생 패턴 (reciprocal co-occurring patterns of multiple objects)을 학습할 수 있다고 한다. 예를 들어서, 컴퓨터가 이미지에 있으면 주변에 책상이 있는게 옮바르지, 갑자기 도로가 예측되는 것을 막는다고 한다. (Self-attention 구조를 약간 멋지게 말하면 이렇게 표현할 수 있는건가? 아니면 ` non-local convolution논문에 이러한 표현을 하고 증명을 해놓은 건가? 그거까지는 모르겠지만 non-local convolution`은 Transformer 구조에 진것은 분명한 것 같다.)
  • Fig. 1 (e) : 이와 같이 cross scale interactions을 유도할 것이라고 한다.
  • Feature Pyramid Transformer (FPT) enables features to interact across space and scales. 내가 지금 부정적으로 생각해서 그렇지, 파라메터 오지게 많이 하고 깊이 오지게 많이 한다고 무조건 성능이 올라가는 것은 아니다. 그렇게 해서라도 성능이 올랐으니 일단은 긍정적으로 봐도 좋다. 하지만 FPN을 차용해서 아이디어를 짠것은 좋은데 좀더 깔끔하고 신박하고 신기하게 설계한 구조와 방법이 필요한 듯 하다.

3. Method

image-20210325162755839


3.1 Non-Local Interaction Revisited

  • typical non-local interaction 은 다음과 수식으로 이뤄진다고 할 수 있다. (하나의 level Feature map에 대해서) 하지만, 논문에서는 이 공식을 그대로 사용하지 않는다.
    image-20210325164245529
  • (사실 self-attention과 거의 같은 구조이다. 차이점에 대해서는 BottleneckTransformer를 참조하면 도움이 될 수 있다.)

3.2 Self-Transformer

  • 위의 typical non-local interaction공식에서 하나만 바꿔서, 새로운 이름을 명명했다.
  • 위에서 weight를 계산하는것이 그냥 softmax를 사용했다. 이것을 the Mixture of Softmaxes (MoS) [34] 로 바꾼다.
    image-20210325165146471
  • 위의 N에 대한 설명은 자세히 나와있지 않다. the same number of divided parts N 이라고 나와있는게 전부이다. 따라서 위에 내가 생각한게 맞는지 잘 모르겠다. [34] 논문을 참고하면 알 수도 있다.

3.3 Grounding Transformer

image-20210325165710081

  • a top-down non-local interactio을 수행하는 방법이 위와 같다.
  • 어렵게 생각할거 없고 위에 그림과 같이 q, k, v를 설정하여 self-attention을 적용한 모듈이다.
  • 예를 들어서 변수 = 변수.shape로 표현해 정리한다면, q = H * W * d, K = h * w * d 차원을 가진다고 하면, q_i = 1 * d, k_j = 1 * d 가 된다고 할 수 있다. d를 맞추는 것은 channel 크기를 맞춰주면 되는 것이기 때문에 그리 어려운 문제는 아니다.
  • Locality-constrained Grounding Transformer : 그냥 Grounding Transformer를 적용하는 방법도 있고, Locality 적용하는 방법이 지들이 제안했다고 한다. stand-alone에 있는 내용아닌가…

3.4 Rendering Transformer

  • a bottom-up fashion. self attentino을 적용한 방법이 아니다. 과정은 아래와 같다. (논문의 내용을 정리해놓은 것이고 헷갈리면 논문 다시 참조)
    image-20210325170353850

3.5 Overall Architecture

  • FPT for object detection and instance segmentation
    • BFP = FPN 지들맘대로 이름 바꿔서 사용함.
    • divided parts of N은 ST에서는 2 그리고 GT에서는 4로 설정했다.
    • FPT를 통해서 나오는 Pyramid Feature map들을 head networks에 연결되어서 예측에 사용된다.
    • head networks는 Faster R-CNN 그리고 Mask RCNN에서 사용되는 head를 사용한다.
    • (분명 retinaNet과 같은 head도 해봣을텐데, 안 넣은거 보니 성능이 그리 안 좋았나? 라는 생각이 든다.)
  • FPT for semantic segmentation.
    • dilated ResNet-101 [4]
    • Unscathed Feature Pyramid (UFP) - a pyramidal global convolutional network [29] with the internal kernel size of 1, 7, 15 and 31
    • segmentation head network, as in [14 ASPP,19]

5. Results

image-20210325171045436

image-20210325171111809

【Detection】Bottleneck Transformers for Visual Recognition



Bottleneck Transformers

1. Conclusion, Abstract

image-20210325120118016

  • self-attention(MHSA) 모듈을 사용하는 backbone을 만들었다. 그것들을 사용해서 몇가지 task에서 성능향상을 가져왔다. 미래에 추천하는 연구로는 (1) self-attention for self-supervised (2) combining botNet backbone with DETR (3) smalll object detection 와 같은 연구들이 있다.
  • ResNet 에서 일반적은 Conv2d(= spatial convolution) 연산을 global self-attention으로 바꾼것이 전부이다. 이렇게 만든 backbone을 사용함으로써 성능 향상, (상대적인?) 파라미터 감소, 연산 시간 증가 등의 효과를 볼 수 있었다.
  • Result : Mask R-CNN 44.4 Mask AP on COCO / BoTNet for image classification 84.7% top-1 accuracy on ImageNet

2. Instruction, Relative work

image-20210325120222270

image-20210325120200529

  • Related Work에서는 (1) Transformer vs BoTNet; (2) DETR vs BoTNet; (3) Non-Local vs BoTNet 에 대한 비교를 한다. 이 비교에 대한 정리는 아래에 블로그 정리 부분에 추가해 놓았으니 거기서 참고할 것

3. Method

  • BoTNet은 아주 심플하게 만들여졌다. 맨위의 표처럼 resnet의 c5의 3x3 conv를 global (all2all) self-attention over a 2D featuremap을 수행하는 MHSA으로 바꾼것이 전부이다.
  • In BoTNet, the 2D relative position self-attention [51, 2] 을 사용했다. (absolute, relative position embeding에 대한 차이를 아직 모르겠다. 이 차이를 알기 위해서 코드를 확인해봤짐나)

4. Experiments & Results

  • 여기에서 나오는 4.1 ~ 4.8 까지, 지금까지 실험해본 결과(= the benefits of BoTNet for instance segmentation and object detection )를 요약해놓는 식으로 논문을 정리해보았다. 하나하나씩 간력하게 살펴보고 넘어가자
  1. BoTNet improves over ResNet on COCO Instance Segmentation with Mask R-CNN
    image-20210325124234077
    • multi-scale jitter 란, 이미지를 자유자제로 scaling하는 것이다. 예를들어, Input Image : 1024x1024 / multi-scale jitter : [0.8, 125] 조건에서는 이미지를 820~1280 크기로 이미지로 scaling 한다.
  2. Scale Jitter helps BoTNet more than ResNet
    • multi-scale jitter의 범위를 심하게 하면 할 수록 더 높은 성능향상을 가져다 주었다.
  3. Relative Position Encodings Boost Performance
    • image-20210325124348428
  4. Why replace all three c5 spatial convolutions?
    image-20210325124422713
  5. BoTNet improves backbones in ResNet Family
  6. BoTNet scales well with larger images (1024보다 1280 크기에 이미지에 multi-scale-jitter 심하게 주고 학습시키면 더 좋은 성능이 나온다.)
  7. Non-Local Neural Networks 보다 훨씬 좋은 성능이 나온다.
    • 이것을 보면, 버클리와 구글에서 이미지 처리에 가장 좋은 MHSA 구조를 사용하는 방법에 대해서 많은 실험을 해서 나온 결과가 BoTNet이라는 것을 짐작할 수 있다. MHSA를 그냥 사용하는 게 아니라, BottleNet구조로 바꿔고, BottleNet Transformer라는 새로운 Block을 만들고 이름까지 명명해버렸다. (이미지 처리를 위해서 가장 완벽하게 Transformer를 사용하는 구조를 많은 실험을 통해 최종적으로 찾아낸 BottleNet Transformer 이라고 말할 수도 있을 것 같다.)
  8. Image Classification on ImageNet
    image-20210325125140525


블로그 내용 정리

  • 블로그 링크 : https://sanghyeok.tistory.com/5

  • BoT와 vanilla transformer간의 차이

     transformerBoTNet
    Normalizationlayer normalizationBatch normalization (ResNet처럼 그대로)
    Non-LinearitiesFFN block에서 1개의 non-linearity3개의 non-linearities
    Output projectionoutput projection(?) 있음없음
    OptimizerAdamSGD with momentum
  • DETR과 BoTNet과의 차이점

     DETRBoTNet
     outside(after) the backbonebackbone내부에 Transformer같은 block 삽입/대체
     RPN그리고 NMS 제거를 목적으로 함recognition의 많은 task에서 적용가능
      visibly good gains on small objects (상대적 작은객체 탐지 더 좋음)
  • NL(Non-Local)Net과 BoTNet의 차이점

     NL(Non-Local)NetBoTNet
    channel reduction ration24
    Role네트워크에 추가로 삽입convolutional block을 대체
    또 다른 차이점 (1) multiple head(2) value projection(3) posutuib encodings
  • Method

    • ResNet의 가장 마지막 c5 stage에서 마지막 3개의 saptial convolution = conv2d을 모두 MHSA로 대체한다. 단, c5 stage는 stride 2가 적용된 conv연산이 있음으로, 똑같이 MHSA를 하기 전에 2x2 average pooling을 수행한다.
    • 2D relative position encoding 를 사용했다. figure4에서 확인 할 수 있다.
    • 논문에서는 ResNet구조를 바꾸는 것만 보여주지 않고, BoTNet의 영향력을 보여주고자 노력했다. Detection 또는 Segmentation에서도 좋은 성능을 확인할 수 있었다.
  • Experiments

    • 여러 논문에서 Vision Transformer에서 hard augmentation이 성능 향상에 도움을 준다고 이야기 하고 있다.
    • 여기서도 강한 multi-scale jitter기법을 적용해서 (적은 epoch으로) 더 빠른 성능 수렴 을 얻었다고 한다.
    • content-content interaction = self attentioncontent-position interaction = position encoding이 성능에 영향을 미치는 정도를 비교하였다. position encoding이 영향을 미치는 정도가 더 컸으며 둘을 함께 사용했을 때가 성능이 가장 좋았다.
    • absolute position encodingrelative encoding에 비해 성능이 좋지 않았다.

Code 참조

  1. absolute positional embeding

    class AbsPosEmb(nn.Module):
        def __init__(
            self,
            fmap_size,
            dim_head
        ):
            super().__init__()
            height, width = pair(fmap_size)
            scale = dim_head ** -0.5
            self.height = nn.Parameter(torch.randn(height, dim_head) * scale)
            self.width = nn.Parameter(torch.randn(width, dim_head) * scale)
       
        def forward(self, q):
            """
    		from einops import rearrange 
    		에 의해서 만들어진 rearragne 함수 어려워 보이지만 어렵지 않다. 
    		처음 원본의 shape -> 내가 바꾸고 싶은 shape 
    		로 쉽게 shape를 변형할 수 있다.
            """
            emb = rearrange(self.height, 'h d -> h () d') + rearrange(self.width, 'w d -> () w d')
            # 1*h +(element wise sume) 1*w = h*w ?! 브로드 케스팅에 의해서 연산된 결과이다 
            emb = rearrange(emb, ' h w d -> (h w) d')
            # from torch import nn, einsum = element wise sum (multiple은 그냥 * 곱 연산)
            logits = einsum('b h i d, j d -> b h i j', q, emb) 
            return logits
    
  2. relative positional embeding (stand-alone attention 논문에서 나오는 것이라 한다. 아직은 아래 코드가 무슨 행동을 하는지 이해 안 함 = 코드도 복잡하고 논문도 복잡하니 필요하면 그냥 가져와서 사용해야겠다. Axial deeplab에서 추천하는 논문들 (stand-alone, Position-Sensitivity 논문이 이에 관한 좋은 코드 정보로 제공해줄 것 같다.) ㄷ

    class RelPosEmb(nn.Module):
        def __init__(
            self,
            fmap_size,
            dim_head
        ):
            super().__init__()
            height, width = pair(fmap_size)
            scale = dim_head ** -0.5
            self.fmap_size = fmap_size
            self.rel_height = nn.Parameter(torch.randn(height * 2 - 1, dim_head) * scale)
            self.rel_width = nn.Parameter(torch.randn(width * 2 - 1, dim_head) * scale)
       
        def forward(self, q):
            h, w = self.fmap_size
       
            q = rearrange(q, 'b h (x y) d -> b h x y d', x = h, y = w)
            rel_logits_w = relative_logits_1d(q, self.rel_width)
            rel_logits_w = rearrange(rel_logits_w, 'b h x i y j-> b h (x y) (i j)')
       
            q = rearrange(q, 'b h x y d -> b h y x d')
            rel_logits_h = relative_logits_1d(q, self.rel_height)
            rel_logits_h = rearrange(rel_logits_h, 'b h x i y j -> b h (y x) (j i)')
            return rel_logits_w + rel_logits_h
    
    • 확실하게는 이해 안되지만,
      absolute positional embeding는 각 query(1xd)에 대해서 그냥 절대적인 하나의 1xd positional embeding을 element wise sum 해준것이다.
      relative positional embeding은 각 query(1xd)에 대해서, 각 query(1xd)가 전체 key에 대해서 상대적으로, 어디에 위치하는지에 대한 정보를 가지고(=input사이에 pair-wise relationship을 고려) positional embeding 값을 만드는 것 인것 같다. (아래 그림은 stand-alone attention 논문 참조)
      image-20210325123015842

【Se-Segmen】Rethinking Semantic Segmentation with Transformers

Rethinking Semantic Segmentation

1. Conclusion, Abstract

  • sequence-to-sequence prediction framework를 사용해서 Semantic Segmentation을 수행해 보았다.
  • 기존의 FCN들은
    • Encoder, Decoder 구조를 차용한다. CNN을 통과하면서 resolution을 줄이고 abstract/semantic visual concept을 추출한다.
    • receptive field를 넓히기 위해서 dilated convolutions and attention modules 를 사용했다.
  • 하지만 우리는 global context 를 학습하기 위해 (= receptive field를 넓히기 위해서) every stage of feature learning에서 Transformer 를 사용했다. pure transformer (without convolution and resolution reduction)
  • (Panoptic deeplab 처럼) 엄청나게 복잡한 구조를 사용하지 않고, decoder designs을 사용해서 강력한 segmentation models = SEgmentation TRansformer (SETR) 을 만들었다.
  • Dataset에 따른 결과 : ADE20K (50.28% mIoU), Pascal Context (55.83% mIoU), ADE20K test server(1 st, 44.42% mIoU)

3. Method

image-20210319132539937

  • 위의 이미지는 아래의 것에 대한 이미지 이다.
    • (맨왼쪽) Transformer layer
    • Image (transformer) Encoder
    • (오른쪽 위) 두번째 Decoder : SETR-PUP
    • (오른쪽 아래) 세번째 Decoder : SETR-MLA
    • 첫번쨰 Decoder인 Naive에 대한 이미지는 없다.

3.1. FCN-based semantic segmentation

  • About receptive field
    • typically 3×3 conv를 사용하는 layer를 deep하게 쌓으면서 linearly하게 receptive field를 증가시킨다.
    • 결과적으로, 높은 layer에서 더 큰 receptive fields를 가지게 되서 layer depth dependency가 생기게 된다.
    • 하지만 layer를 증가시킴으로써 얻는 benefits에는 한계가 있고, 특히 특정 layer이상으로 가면 그 benefits가 빠르게 감소하는 형상을 볼 수 있다.
    • 따라서, 제한적인 receptive fields (for context modeling)가 FCN의 본질적인 한계라고 할 수 있다.
  • Combination of FCN with attention mechanism
    • 하지만 이런 attention mechanism는 quadratic complexity 때문에 higher layers with smaller input sizes 를 가져야한다는 한계점이 존재한다.
    • 이로 인해, 전체 모델은 lower-level feature만이 가지고 있는 정보들을 learning하지 못하게 된다.
    • 이러한 한계점을 극복하게 위해서, 우리의 모델은 pure self-attention based encoder를 전적으로 사용하였다.

3.2. Segmentation transformers (SETR)

  • Image to sequence
    1. image sequentialization : flatten the image pixel -> 총 1D vector with size of 3HW 가 만들어진다.
    2. 하지만 a typical image가 480(H) × 480(W) × 3 = 691,200 차원의 1차원 백터이다. 이것은 너무 high-dimensional vector이므로 handle하기가 쉽지 않다. 따라서 transformer layer에 들어가기 전에, tokenizing (to every single pixel) 할 필요가 있다.
    3. FCN에서는 H×W×3 이미지를 FCN encoder에 통과시켜서, H/16 × W/16 ×C 의 feature map을 뽑아 낸다. 이와 같은 관점으로 우리도 transformer input으로는 H/16 × W/16 (백터 갯수) x C(백터 차원) 으로 사용하기로 했다.
    4. 우리는 FCN의 encoder를 사용하는게 아니라 fully connected layer (linear projection function)을 사용해서 tokenizing을 한다.
    5. 이미지를 가로 16등분, 세로 16등분을 해서 총 256개의 이미지 patchs를 얻어낸다. 그리고 이것을 flatten하면, HW/256 (백터 갯수) x C*(백터 차원) 를 얻을 수 있고, 이것을 linear projection function를 사용해서 HW/256 (=L: 백터 갯수) x C(백터 차원 < C*) 의 patch embeddings 결과를 뽑아 낸다.
    6. positional embeding : specific embedding p_i를 학습한다. i는 1~L개가 존재하고 차원은 C이다. 따라서 Transformer layer에 들어가기 전 final sequence input E = {e1 + p1, e2 + p2, · · · , eL + pL} 가 된다. 여기서 e는 patch embeding 결과 그리고 p는 positional emdeing 값이다.
  • Transformer
    • a pure transformer based encoder
      image-20210319140800325
    • 여기서 말하는 transformer layer는 위 이미지 가장 왼쪽의 Block 하나를 의미한다. 이것을 24개 쓴다.
    • 즉 Transformer layer를 통과하고 나온 output 하나하나가 Z_m 이다.

3.3. Decoder designs

  1. three different decoder를 사용했다. 1. Naive upsampling (Naive) 2. Progressive UPsampling (PUP) 3. Multi-Level feature Aggregation (MLA)
  2. 이 decoder의 목표는 pixel-level segmentation을 수행하는 것이다. Decoder에 들어가기 전에, HW/256(갯수) × C(차원) 의 feature를 H/16 × W/16 ×C로 reshape하는 과정은 필수적이다.
  3. ` Naive upsampling (Naive)`
    • simple 2-layer network (1 × 1 conv + sync batch norm (w/ ReLU) + 1 × 1 conv )를 사용해서 #class의 수를 가지는 channel로 만든다.
    • 그리고 간단하게 bilinearly upsample을 사용하여 가로세로 16배를 하여 full image resolution을 만들어 낸다.
    • 그리고 pixel-wise cross-entropy loss 를 사용해서 pixel-level classification을 수행한다.
  4. Progressive UPsampling (PUP)
    • 쵀대한 adversarial effect (어떤 작업을 해서 생기는 역효과) 를 방지하기 위해서, 한방에 16배를 하지 않는다.
    • 2배 upsampling 하는 작업을 4번을 수행한다.
    • 이 작업에 대한 그림은 Figure 1(b)에 있고, progressive(순차적인, 진보적인) upsampling 으로써 SETR-PUP 이라고 명명했다.
  5. Multi-Level feature Aggregation (MLA)
    • feature pyramid network와 비슷한 정신으로 적용하였다.
    • 물론 pyramid shape resolution을 가지는 것이 아니라, FPN와는 다르게 every SETR’s encoder transformer layer는 같은 resolution을 공유한다.
    • Figure 1(c) 와 같이, {Z_m} (m ∈ { L_e/M , 2*L_e/M , · · · , M*L_e/M }) 를 사용한다. 이미지에 나와있는 것과 같이, 다음의 과정을 수행한다. (1) reshape (2) ` top-down aggregation via element-wise addition (3) channel-wise concatenation`

4. Experiments

  • Dataset : Cityscapes, ADE20K, PASCAL Context
  • Implementation details
    1. public code-base mmsegmentation [40],
    2. data augmentation : random resize with ratio between 0.5 and 2, random cropping, random horizontal flipping
    3. training schedule : iteration to 160,000 and 80,000, batch size 8 and 16
    4. polynomial learning rate decay schedule [60, 이건뭔지 모르겠으니 필요하면 논문 참조], SGD as the optimizer
    5. Momentum and weight decay are set to 0.9 and 0
    6. learning rate 0.001 on ADE20K, and 0.01 on Cityscapes
  • Auxiliary loss
    1. auxiliary losses at different Transformer layers
    2. SETRNaive (Z_10, Z_15, Z_20)
    3. SETR-PUP (Z_10, Z_15, Z_20, Z_24)
    4. SETR-MLA (Z_6 , Z_12, Z_18, Z_24)
    5. 이렇게 각 layer에서 나오는output을 새로 만든 decoder에 넣고 나오는 결과와 GT를 비교해서 Auxiliary loss의 backpropagation를 수행한다.
    6. 당연히 이후의 각 dataset 당 사용하는 Evaluation metric을 사용해서 main loss heads에 대한 학습도 수행한다.
  • Baselines for fair comparison
    1. dilated FCN [37] and Semantic FPN [28]
  • Multi-scale test
    1. the default settings of mmsegmentation [40] 를 사용했다.
    2. 일단, uniform size 의 input Image를 사용한다.
    3. scaling factor (0.5, 0.75, 1.0, 1.25, 1.5, 1.75)를 이용하여, Multi-scale scaling and random horizontal flip 을 수행한다.
    4. 그리고 test를 위해서 Sliding window를 사용했다고 하는데, 이게 뭔소리인지 모르겠다. (?)
  • SETR variants
    1. encoder “T-Small” and “T-Large” with 12 and 24 layers respectively.
      image-20210319150947438
    2. SETR-Hybrid 는 ResNet-50 based FCN encoder 를 사용해서 뽑은 Feature map을 Transformer input으로 사용하는 모델이다. 이후에 언급하는 SETR-Hybrid는 ResNet50 and SETR-Naive-S 를 의미하는 것이다.
  • Pre-training
    1. the pre-trained weights provided by [17, ViT]
  • Evaluation metric
    1. cityscape : mIoU 사용
    2. ADE20K : additionally pixel-wise accuracy 까지 사용한 loss

5. Results

  • Ablation Studies
    image-20210319152013916

  • SOTA comparision
    image-20210319151946197

Pagination


© All rights reserved By Junha Song.