Week12 - Day 3 Review


오늘 한 일

  • Efficient Det mmdetection에 넣어서 실행
  • Bifpn 버그 수정

2. 피어세션에서 한 것

  • Efficient Det TTA에 대해서 조원들과 이야기
  • 사이즈가 고정된 모델이기 때문에 Multi scale이 불가능하다

3. 하루 느낀점

  • 컨디션이 나가버려서 몸상태가 상당히 좋지 않은 하루였다
  • 내일은 마저 p-stage에 대해서 정리를 해야겠다

Week12 - Day 1~2 Review


오늘 한 일

  • YoloV5모델에서 다양한 이미지 사이즈와 배치사이즈로 학습 실험
  • 추가로 학습시킨 Yolo를 통해서 Weight Box Fusion 실험
  • Swin Transformer 논문과 mmdetection 내의 구현 코드를 공부 및 확인

2. 피어세션에서 한 것

  • 각자 진행한 실험에 대해서 결과 보고
  • Swin Transformer 구현 코드에 대해서 토론
  • Efficient Det 학습을 진행하면서 발생했던 Error를 공유하고 해결했다

3. 하루 느낀점

  • P-stage를 진행하면서 스코어에 매우 많이 신경쓰고 있다는것을 발견하고 신경안쓰려고 최대한 노력한 하루였다

4. 오늘의 팁

  • DropPath를 통하여 skip Connection을 진행하는 Layer에서 일부 레이어 자체를 스킵하고 넘어가도록 구현 할 수 있다.
    • Timm 모듈로 구현이 되어있다!

An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale


논문 링크 : https://arxiv.org/pdf/2010.11929.pdf

원래 이번 논문 리뷰는 Swin Transformer에 대해서 다루려고 했는데 ViT의 내용을 알지 못하면 풀어서 이야기 할수 없는 부분이 많아서 이번 논문은 CV분야를 CNN에서 transformer로 판도를 바꿔버린 ViT에 대해서 다룹니다

간단 요약

  • Image Data + Multi head Self Attention
  • Position embedding을 통해 token에 위치 정보를 추가
  • Cls Token을 이용한 Classification
  • 그 외의 부분은 NLP의 Transformer 구조를 그대로 가져옴
  • 학습을 위해서는 매우 많은 사전 Data가 필요하다
    • 데이터가 많을 수록 더 robust한 모델이 만들어진다

들어가기 앞서

Inductive bias (귀납 편향)

  • Inductive bias은 Model이 접해보지 못한 input 데이터에 좋은 성능을 내기 위해 사전에 설정된 가정을 이야기한다

  • CNN 계열 : Locality

    • 하나의 pixel에 대하여 주변 pixel또한 비슷한 데이터를 가지고 있을것이라고 가정
    • 부분적인 데이터를 모아서 보기 때문에 Global한 영역에 대해서는 처리가 어렵다
      • 이를 해결하기 위해 Receptive field를 넓히는 등 여러 연구가 이루어지고 있다
  • RNN 계열 : Sequentiality

    • 특정 정보는 비슷한 시간대에 모여있을 것이라고 가정하고 설계 된 모델
    • 순차적이지 않고 먼 뒤쪽에 연관된 데이터가 나오는경우 (ex. 대명사) 예측이 제대로 이루어 지지않음
  • 이러한 Inductive bias가 강하게 설정 되어 있을 수록 특정 데이터에 대해서 적은 Data로도 좋은 performence를 보여줄 수 있다

    • 그 데이터에 특화된 모델이기 때문이다

Transformer와 Inductive bias

  • Vision Transformer는 추후에 설명할 Positional Embedding과 Self Attention을 활용하여 이미지의 모든 정보(Global)를 활용하여 연산을 한다
    • 부분적으로 이미지를 취합하여 예측하는 CNN보다 약한 가정이 들어갔다 볼 수 있다

논문에서 제안한 Point

1. Patch 분할을 통한 image Token화

ViT에서는 이미지를 Transformer에 넣기위해 다음과 같은 과정으로 Token화 시켜준다

  1. 이미지를 Patch 사이즈로 분할한다 (2-d Matrix : $P \times P \times 3$)
  2. $P \times P \times 3$의 길이의 1-d vector로 Patch를 변환시켜준다
  3. Fully Connected Layer를 통하여 Linear Projection을 통해서 같은 차원을 가지는 Embedding Vector를 생성한다

2. Transformer for Classification

  • ViT는 Input에 Image로 부터 생성된 Token을 입력한다는 점을 제외하면 Transformer의 구조를 그대로 사용하였기 때문에 기존 NLP의 BERT와 매우 흡사한 구조를 가지고 있다
  • BERT의 Single text Classification과 같이 Transformer를 Classfication Model로 사용하기 위해 Classfication Token을 0번에 입력한다
    • 학습 가능한 Parameter로 생성을 하여 학습을 통해서 추후에 결정된다
  • 또한 Patch의 위치 정보를 가지고 있는 Position embedding을 각 token에 더해준다
    • (Patch 개수 + 1) x (image token size) 의 크기를 가지는 Parameter
    • 0번은 Classfication Token에 더해지고 나머지 번호는 각각의 순서대로 Patch에 더해지게 된다
    • Classfication Token과 마찬가지로 학습 가능한 Parameter로 생성을 하여 학습을 통해서 추후에 결정된다
    • 2차원 구조의 Position embedding을 사용했었지만, 1차원 구조보다 더 좋지않은 성능을 보여주었기 때문에 사용하지 않는다
  • 마지막으로 Classfication Token 위치의 출력층에 FC Layer를 두어서 분류의 대한 예측을 진행한다

3. ViT Transformer Encoder

ViT의 한계

  • Inductive Bias가 작기 때문에 충분한 데이터를 확보하지 못한 경우에는 성능이 떨어지게 된다
    • Transformer의 고질적인 문제
    • 이부분에 대해서 멘토링 시간에 새로운 논문을 소개해 주셔서 읽고 추후 리뷰를 통해 이야기 하겠습니다
  • Image의 사이즈가 커질수록 만들어지는 Patch의 개수가 늘어나기 때문에 모델에 필요한 Parameter가 기하급수적으로 증가한다

reference

Week11 - Day 5 Review


오늘 한 일

  • OpenCV를 이용한 Background mask 생성 및 이미지 변환
  • 위의 Backgrond Sample을 이용하여 oversampling
  • 학습시킨 데이터로 추가적인 앙상블을 시도하여 0.7118 스코어 달성!
    • 1등이지만 새로운 시도는 계속된다

2. 피어세션에서 한 것

  • 각자 진행한 실험에 대해서 결과 보고
  • 다들 마음에 여유가 생겨서 최종 프로젝트를 위해 전 기수의 프로젝트 탐방

3. 하루 느낀점

  • DeepLearning 못지않게 Huristic한 알고리즘에 대한 공부또한 많이 필요하다고 느낀 하루였다
    • Opencv 강의 사두었었는데 이거 보면서 공부좀 더 해야겠다
    • Mask 다루는 마스터가 되기 위하여

4. 오늘의 팁

  • cv2.copyto와 image, mask, 합칠 이미지만 있다면 얼마든지 합성할 수 있다

Week11 - Day 1~4 Review


1~4 일간 한 일

  • 단일 모델의 최적화를 위한 여러가지 실험
    • scheduler
    • Data augmentation
    • anchor ratio에 관한 실험
      • scale에 변화를 주었을 때는 score의 상승은 없었고 오히려 하락하는 모습을 볼 수 있었다
      • 모델 자체에서 생성하는 총 anchor 개수는 2000개의 상한이 존재하는데 scale을 늘렸을 경우에 생성되는 anchor의 개수는 배로 늘어나고, 작은 박스에 대해서 어느정도 박스 생성을 하지만, 기본적으로 데이터 자체에 small object의 비율이 매우 적고, 그만큼 줄어든 큰 object를 추측하지 못하게 되어서 감소하는것으로 추측한다
  • ensemble에 관한 실험
    • nms -> score 상승
    • soft nms -> score 하락
    • soft nms는 겹치는 box를 삭제하지않고 confident를 낮추어서 뽑아내는데 여기서 생성된 어중간한 score의 box들이 weight box Fusion을 거치면서 점수를 하락시키는 원인이 되는것으로 추정된다
  • tile ensemble에 관한 실험
    • 작은 object에 박스를 생성한다
    • 기본적으로 생성되는 박스의 양이 매우 많아졌다
    • tile끼리 겹치는 경계에 생성되는 bbox에 대한 처리가 매우 힘들고, 이 생성된 bbox로 인하여 합치기 전보다 score가 떨어지는 현상이 발생한다

2. 피어세션에서 한 것

  • 팀원들과 실험 설계

3. 멘토링 시간에 한 것

  • Yolo를 사용한 실시간 웹캠 Detection Model 미니 프로젝트 마무리
  • 대회에 관한 질문

4. 하루 느낀점

  • 대회를 진행하면서 정신없이 보내다보니 어느세 스코어에 집중하고있는 나 자신을 발견했다. 공부하는 느낌으로 해야하는데 너무 집착하는 느낌이 들어서 남은 일주일은 새로운 시도를 해보려고 한다

Week10 - Day 3~4 Review


3~4 일간 한 일

  • mmdetection을 이용한 loss 실험
    • CIoU
    • DIoU
    • GIoU
  • anchor 변경을 통한 실험

2. 피어세션에서 한 것

  • 데이터 클랜징
    • 4883장의 데이터를 직접 눈으로 보고 맞는지 비고
    • 역할분담을 통해서 인당 약 1000장의 이미지를 살펴 보았다
    • 약 10%의 갯수의 수정점이 제안 되었고 이를 이용하여 4개정도의 dataset을 제작할 예정이다
  • Base 모델의 학습시간이 너무 오래걸려 일단 더 작은 small 모델로 먼저 실험을 진행하여 성능이 좋았던 모델만 적용하기로 결정

3. 하루 느낀점

  • 가장 힘들지만 성능이 좋을거라 예상되는 data cleansing을 팀원들과 어느정도 완료했다
  • 이제 약 500항목의 라벨 수정만 가하면 끝난다! 행복!

4. 미세 꿀팁

  • mmdetection config 파일에 다음과 같이 넣으면 class mAP를 epoch마다 출력해준다
    1
    evaluation = dict(classwise=True)

Week10 - Day 1~2 Review


1~2 일간 한 일

  • 강의 후딱 듣기
  • mmdetection Base Config file 만들기
    • Swin Transformer
    • Cascade RCNN
  • Multilabel StratifiedKFold을 통한 Cross Validation 데이터 제작
  • github Template 만들기
    • PR Template Error 발생 - 아직 원인 모름

2. 피어세션에서 한 것

  • mmdetection에 대한 설명

3. 멘토링 시간에 한 것

  • CUDA에 대한 이야기
    • nvcc
    • gcc
    • cuda toolkit
  • Yolo를 사용한 실시간 웹캠 Detection Model 미니 프로젝트

4. 하루 느낀점

  • 하루종일 P-stage 관련해서 코드를 제작하고 Github에 올리고 정신없이 보냈다
  • 깔끔한 github를 보니 기분이 좋아진다

5. 미세 꿀팁

  • mlflow를 외부 호스팅을 해서 사용할 경우 다음과같이 설정하면 된다
    1
    mlflow ui --host 0.0.0.0 --port [PORT NUMBER]

FCOS: Fully Convolutional One-Stage Object Detection


논문 링크 : https://arxiv.org/pdf/1904.01355.pdf

첫 논문 리뷰로 YoloX 등의 고성능 Anchor Free 모델에 응용되는 OB 모델인 FCOS에 대해서 리뷰를 진행하겠습니다.

간단 요약

  • Anchor Free 기반의 Object Detection Model
  • Semantic Segmentation과 비슷하게 Pixel 단위의 예측을 통하여 Object Detection(OB)을 진행
  • FPN + Multi head Branch를 이용하여 성능 UP
  • Center-ness을 이용하여 좀 더 정확성을 끌어올림

Anchor Based Model의 한계

본 논문에서 지금 까지의 OB모델들은 Anchor Box Base로 좋은 성능을 내어왔지만 다음과 같은 단점이 존재한다고 서술한다

  1. Anchor Box 또한 Hyper Parameter로써 성능에 매우 큰 영향을 미치기 때문에 조심스러운 튜닝이 필요하다
  2. 조심스럽게 튜닝을 마쳐도 고정된 Anchor Box의 크기와 차이가 많이 나면 효과적으로 학습하지 못한다
  3. 높은 Recall 성능을 얻기 위해서는 촘촘한 Anchor Box가 필요하다. 수많은 Anchor Box들은 많은 Negetive Sample을 생성하며 Positive와의 균형이 깨어져서 Imbalance를 야기한다
  4. Anchor Box와 Ground Truth(GT)와의 IoU 계산에서 많은 코스트가 필요하다

이를 통하여 본 논문에서는 이런 단점을 해결하기 위해 Anchor Free Object Detection Model인 FCOS를 제안하였다

논문에서 제안한 Point

0. 사전 설정

  • 먼저 Layer $i$ 의 Feature Map을 $F_{i}$ 라고 하고, input 이미지의 GT를 $B_i = (x^{i}_{0}, y^{i}_{0}, x^{i}_{1}, y^{i}_{1}, c^{i})$ 라고 설정한다.
    • $(x^{i}_{0}, y^{i}_{0})$ : left-top
    • $(x^{i}_{1}, y^{i}_{1})$ : right-bottom
    • $c^{i}$ : class
  • Feature Map에서의 위치 좌표 $(x, y)$ 는 실제 이미지에서 다음의 좌표와 대응된다.
    • (xs, ys)로만 표현할 경우 오차의 범위가 너무 커지기 때문에 stride의 절반을 더해주어서 보상한다
    • $s$ : size of stride
      $$
      ([\frac{s}{2}] + xs, [\frac{s}{2}] + ys)
      $$

1. Fully Convolutional One-Stage Object Detector

이 부분에서는 OB를 Pixel 단위로 예측하는 방식이 어떻게 진행되는지에 대해서 알아본다

  • 기존의 Anchor Based Model은 기준점 $x, y$를 Box의 중심으로 가정하고 그 위치로 부터 Anchor Box를 생성하는 방식으로 물체를 Detection 한다. 하지만 FCOS에서는 $x, y$ 좌표의 픽셀말다 해당하는 Class와 GT Box의 Border를 추측한다.

FCOS 상세 계산 방법

  1. $x, y$ 좌표의 픽셀의 분류된 class가 GT Box 안에 속하면서 class값과 같을 경우 Positive Sample로 생각한다
    • 해당되지 않을 경우에는 negative Sample 간주하고, Background(class = 0)로 계산된다
  2. $x, y$ 좌표의 class를 분류함과 동시에 4D vector $\mathbb{t}^* = (l^*, t^*, r^*, b^*)$ 에 대하여 Regresstion을 진행한다
  • 여기서 $(l^*, t^*, r^*, b^*)$ 는 각각 $x, y$ 좌표에서부터 추측한 Bbox의 경계선 까지의 거리를 말하며 다음과 같이 나타낼 수 있다.

$$
l^* = x -x^{i}_{0} ,\quad t^* = y - y^{i}_{0}\\
r^* = x^{i}_{1} - x,\quad b^* = y^{i}_{1} - y
$$

  1. $x, y$에서 예측한 4차원 거리벡터와 GT box로 계산한 거리가 일치하도록 학습이 이루어진다

Network Output

  • FCOS 에서는 Output으로 80-D의 Classfication Vector와 4-D의 Bbox vector $(l^*, t^*, r^*, b^*)$, Center-ness를 추정하도록 구성된다
  • 실제로는 Network에서 출력되는 값 $(l, t, r, b)$ 들을 exp를 통하여 변환시킨 값이 $(l^*, t^*, r^*, b^*)$가 된다
    • 너무 큰 값을 출력으로 할 경우 학습에 문제가 생길 가능성이 존재하기 때문에 의도적으로 작은값을 출력하도록 설정하였다
  • 80-D의 Classfication Vector는 multi-class classifier 구별되는 것이 아닌 각 class에 대해서 binary classification으로 예측된다

Loss

  • Classification Loss는 Focal Loss를 사용
  • Regression Loss는 IoUloss를 사용
  • 그리고 각 Loss는 Positive sample 수만큼 나누어서 Normalization을 해주었다

Inference

  • $p_{x, y}$ 가 threshold 이상일 경우에는 Positive Sample로 생각하여 Bbox를 Bbox vector를 통해서 예측하고 출력한다

2. Multi-level Prediction with FPN for FCOS

  • 위의 항목에서 학습을 그대로 진행하면 Anchor Free Model의 고질적인 2가지의 문제점이 발생한다

    1. 작은 물체들은 stride가 큰 Feature map에서 표현이 되지 않기 때문에 Recall이 낮아진다
    2. GT Box가 겹쳐져 있을때 어느 GT에 맞춰서 Pixel이 학습을 해야하는지 모호함이 발생할 수 있다
  • 이러한 문제점을 해결하기 위해서 논문에서는 FPN을 통한 Multi level Prediection을 제안하였다

Stride Problems

  • FCOS에서는 FPN을 이용하여 다양한 stride를 누적을 통하여 표현
  • 아래에 그림에서와 기본적인 FPN을 통해서 P3, P4, P5의 Layer를 생성한다
    • P3, P4, P5는 각각 (8, 16, 32)의 누적된 stride를 가지고 있다
  • P5에서 추가적으로 stride가 2로 설정된 CNN Layer를 2개 생성한다
    • 생성된 P6, P7는 각각 64, 128의 누적된 stride를 가지고 있다
  • FPN을 통해서 다양한 stride를 가지고 탐색을 진행한다
    • 각 Level의 Layer에서 Box Regression을 진행할 때 $x, y$로 부터 예측되는 Bbox vector의 범위의 제한을 두고 제한을 넘어가면 Negative Sample로 취급한다
    • 논문에서는 0, 64, 128, 256, 512, $\infty$ 로 설정하였다
      ex) P3의 경우 0~64 제한

GT Box Overlap

  • GT Box가 겹치는 경우 발생하는 모호함에 대해서 FPN구조로 어느정도 해결이 가능하다
  • Overlap된 구간에 존재하는 Pixel들에 대해서 겹쳐지는 GT Box들간에 크기 차이가 존재할 경우 다른 Level의 Layer에서 예측될 가능성이 높다
  • 그럼에도 불구하고 한 위치에 Layer 이상의 Box들이 할당이 되면은 면적이 가장 작은 GT Box를 사용한다

3. Center-ness

  • 물체의 중앙점에서 먼 Pixel에서 예측된 Box Vector의 스코어가 낮은 경향을 보이는 문제가 존재하였다. 이것을 해결하기 위해 Center-ness를 도입하였다
    • Box 외각의 pixel에서의 예측값은 classification을 통한 확률은 높아서 Positive sample로 판단 되었지만, 실제 Box Vector값은 잘 예측하지 못하는 경우가 많이 발생하였다

Center-ness

  • 예측한 Box vector로 부터 $x, y$ 좌표가 Box의 Center에 가까울 수록 높은 가중치를 가지게 된다

$$
centerness = \sqrt{\frac{min(l^*, r^*)}{max(l^*, r^*)} \times \frac{min(t^*, b^*)}{max(t^*, b^*)}}
$$

  • classification score 출력에 center-ness를 곱해주면 마지막에 NMS를 진행할 때 낮은 score를 가지게 되기 때문에 걸러지게 만들 수 있다
  • 논문에서는 center-ness를 도입해서 classfication score는 높지만 IoU score는 낮은 Sample들을 걸러내는 효과를 얻었다고 한다

결론

  • Anchor Free 모델로 Anchor와 관련된 HyperParameter를 제외했다
  • 다른 One stage Anchor Based Model과 비교해서 tuning이 없이도 비슷한 성능을 보여주었다
  • Pixel Prediction(Semantic Segmentation) + Multi Label FPN + Center ness
  • 전체 구조가 간단하면서도 좋은 성능을 보여주어서 응용성이 뛰어나다
  • Two Stage Detecto의 RPN으로도 응용이 가능하다

후기

예전에 YoloX를 사용해 보면서 가볍게 보고 넘어갔던 논문이었는데 개념적으로만 일고 넘어가서 이번에 완전히 이해하는것을 목표로 리뷰를 해 보았다.
그동안 개념적으로 이런 논문이지를 알고 왜 그런것인지에 대해서 초점을 맞춰서 하나하나 읽고, 찾아가면서 공부를 했는데 퍼즐맞추는것처럼 나름 재미있었다! 그리고… 사실 다음주 P-Stage 대비용으로 하나두개 씩 읽어두는게 좋을거같아서 한것도 있다…ㅎ
마지막으로 영어공부를 하면서 해야겠다. 파파고가 너무 그동안 편했던것 같다

Week9 - Day 5 Review


오늘 한 일

  • 정리 마무리
  • mmdetection Apex 장착

2. 피어세션에서 한 것

  • 3D에 관련된 딥러닝 기술에 대해서 이야기
  • P-Stage 관련 mmdetection 예시 실행

3. 하루 느낀점

  • 다음 주 P-Stage 준비를 단단히 해야겠다
  • 기대된다

부스트 캠프 ai tech 9주 4일차 3D perspective


3D

  • 사람은 Projection된 2D 이미지로 부터 3D를 인식한다

3D의 표현방법

  • Multiview images
    • 여러 방향에서 찍은 사진데이터로 표현
  • Volumetric (voxel)
    • x, y, z의 3차원 pixel로 3D를 표현
  • Part assembly
    • 단순한 여러개의 Polygon 덩어리로 3D를 표현
  • Point cloud
    • 물체의 surface을 dot의 좌표로 표현
  • Mesh
    • point와 edge로 이루어진 map
    • 3각형으로 이루어진 Polygon Data
  • implicit shape
    • 고차원의 함수형태로 surface를 표현

3D Dataset

ShapeNet

  • 51300개, 55개의 Category를 가진 3D Dataset
  • 전부 디자이너들이 제작함

PartNet

  • 26671개의 3D 데이터가 573585개의 Part로 분리되어있는 3D Dataset

SceneNet

  • 5 Million개의 RGB-Depth Pair Dataset
  • Simulationed indoor image(생성 이미지)

ScanNet

  • 2.5 Million
  • 실제 Indoor Scan Image

Outdoor 3D Scene Dataset

  • KITTI
    • LiDAR Data, 3D Bboxes
  • Semantic KITTI
    • LiDAR Data, point
  • Waymo open Dataset
    • LiDAR Data, 3D Bboxes

3D Task

  • 3D object recognition
  • 3D object detection
  • 3D semantic segmentation

Conditional 3D generation

  • 2D Image에서 3D Mesh를 구하는 Task
  • Mesh RCNN
    • 기존 Mask RCNN 에서 Mesh Branch를 추가한 형태
  • Learning to Reconstruct Shapes from Unseen Classes
    • CNN구조로 부터 Feature 추출
    • 3개의 Branch로 Feature 재생성
      • normal map
      • depth
      • silhuette
    • 재구성을 통한 3D shape 출력

reference