부스트 캠프 ai tech 8주 3일차 Object Detection


Object Detection

  • 특정 오브젝트가 어디에 위치해있고, 그 오브젝트가 무엇인지를 탐지하는 Task를 말한다
  • Classification과 Box Localization을 같이 하는 Task
  • 자율주행이나 OCR등에서 사용된다
  • Classification과 Box Localization을 따로 연산하는 Two Stage 방식과 동시에 연산하는 One Stage 방식이 존재한다

Two Stage Object Detection

  • 이미지의 BBox를 추출하고 이 BBox로 Classification을 진행하는 모델을 말한다
  • R-CNN 계열의 모델이 여기에 속한다
  • 2단계로 연산을 하기 때문에 연산속도는 느린편에 속하지만 정확도가 높다
  • 이미지로부터 BBox를 만들어 내는 알고리즘
  • 이미지의 색상단위로 Over Segmentation을 진행하고 규칙에 따라 점점 합쳐나가는 알고리즘
    • Color Similarity
    • Texture Similarity
    • Size Similarity
    • Shape Similarity
    • A final meta-similarity measure

R-CNN

Classification이 바로 Object Detection에 응용된 모델이다.
모델은 아래와 같이 간단한 단계로 BBox를 구하고, Classification을 진행한다

  1. Selective Search를 사용하여 물체가 있을 법한 후보를 선택한다(~2k)
  2. 선택된 후보군 전체에 대해서 이미지의 크기를 재가공하여 Classification 모델에 집어넣는다 (2000개의 후보들에 대해서 모두 CNN, SVM 연산)
  • RCNN은 초기 모델인 만큼 다양한 문제점 또한 존재한다
    • BBox를 뽑아내는 알고리즘은 Seletive Search 같은 Huristic 알고리즘이기 때문에 학습이 불가능해서 성능향상이 크지 않다
    • Selective Search는 Cpu에서 연산이 이루어지기 때문에 시간도 많이 소요된다
    • 후보 전체에 대하여 Classfication을 한번씩 진행하다보니 연산량이 많아져서 시간소모가 크다

Fast R-CNN

기존의 R-CNN의 연산이 매우 오래걸린것을 해결한 모델이다.
Roi Pooling을 이용하여 모든 후보에 대해서 Convolution Network 에 입력하던것을 단 1번으로 줄였다.

  • Keyword
    • RoI Pooling
    • SPPNet

RoI Pooling을 이용한 Fast R-CNN

  1. 전체 이미지를 CNN에 통과시켜서 Feature Map을 추출한다
  2. Seletive Search등의 Region Proposal Method를 이용하여 RoI를 찾는다
  3. 찾은 RoI를 미리 뽑아둔 Feature Map에 투영하여 RoI에 해당하는 부분에 대해서 Pooling을 진행해서(SPPNet 이용) Classification을 위한 FC Layer의 input Size에 맞춘다
  4. softmax연산을 통하여 Classification을 진행한다
  5. Bounding Box Regression을 통하여 BBox의 위치를 재조정한다

R-CNN에서 RoI Pooling을 도입하여 연산속도면에서 획기적인 발전을 이룩한 모델이지만 여러 한계점이 존재했다

  • 아직도 Seletive Search를 사용하기 때문에 BBox 검출에 대해서 큰 학습이 이루어지지 않았기 때문에 성능면에서는 큰 차이가 없다
  • 모델 뒷부분의 성능은 개선되었지만 BBox 검출 속도는 그대로기 때문에 Bottleneck 현상이 발생한다

Faster R-CNN

Fast R-CNN의 단점이었던 Seletive Search를 Nueral Network(RPN)로 대체함으로써 End to End로 학습이 가능해진 모델이다

  • Keyword
    • RPN
    • NMS
    • IoU (Intersection over Union)
      • 두 BBox가 얼마나 잘 겹쳐있는지를 판단하는 Metric

RPN

  • Region Proposal Network

R-CNN 계열에서 RoI를 생성하던 Region Proposal Method를 대체하는 Network이다.
RPN에서는 다양한 모양의 BBox를 출력 해 내기 위해서 미리 특정 크기의 Anchor Box들을 구현해 놓고 이 Anchor Box들과 대조하여 IoU를 계산한다.

  • Faster RCNN 에서는 3개의 Scale과 3개의 비율을 조합하여 9개의 Anchor Box를 미리 정해 두었다.

RPN에서는 Slide Window 방식으로 Anchor Box를 이용하여 물체가 존재하는지에 대한 유무와 BBox의 delta 값을 Feature Map으로 부터 추출한다

  • Delta : 고정된 크기의 Anchor Box를 실제 BBox에 일치시키는 이동 정보를 담고있는 벡터를 말한다

결론적으로 RPN을 학습시키면 물체가 존재할 가능성이 높은 BBox를 도출하는 쪽으로 학습이 진행된다

RPN으로 부터 추출된 BBox 좌표를 기준으로 기존에 뽑아두었던 Feature Map에 RoI Pooling을 적용하고 Classification과 Box Regression을 진행한다

Non Maximum Suppression

  • RPN으로 생성된 수많은 BBox중 중복되는 Box들을 지우는 알고리즘
  1. 동일한 클래스에 대해서 Sorting을 통해 Comfidence 순서로 정렬 시킨다
  2. 가장 Confidence가 높은 BBox와 IoU가 일정 이상인 BBox는 중복되었다고 판단하고 삭제한다

추가적인 사항

  • 실제로 Faster RCNN을 학습시킬때는 RPN과 RCNN 모델을 따로 각각 학습을 시킨뒤에 붙였다고 한다

One Stage Object Detection

  • 이미지의 BBox를 추출하면서 Classification까지 동시에 진행하는 모델을 말한다
  • 1단계로 연산을 하기 때문에 실시간 처리속도가 높지만 정확도가 2 Stage Detector 보다 조금 떨어진다

YOLO

  • One Stage Object Detection Model의 대표적인 모델
  • Faster RCNN과 유사하게 Anchor Box와 Box Regression을 통해서 BBox를 예측한다
  • Anchor Box의 위치를 찾는것과 동시에 Class Probability map을 생성한다
  • Class Probability map과 BBox를 합쳐서 detection을 마친다
  • 초당 처리 프레임 수는 Faster RCNN을 앞섰지만, 성능면에서는 조금 떨어지는 경향을 보였다

Single Shot MultiBox Detector(SSD)

  • YOLO의 정확도 문제가 개선된 One Stage 모델이다
  • 아래의 그림과 같이 여러개의 Feature Map에서 Anchor를 이용하여 Feature를 추출한다
  • 각 레이어마다 Anchor Box에 대한 정보들을 종합하여 최종적으로 NMS를 통해 겹치는 BBox를 제거하여 결과를 낸다
  • 이를 통하여 Yolo와 비슷한 수준의 처리속도와 Faster RCNN을 넘는 성능을 보여주었다

RetinaNet

  • Focal Loss와 FPN구조를 도입함으로써 One Stage Detector의 성능을 더욱 끌어올린 모델 구조
  • Keyword
    • Focal Loss
    • Feature Pyramid Network(FPN)

Focal Loss

  • One Stage Detector의 고질적인 문제인 적은 Positive Sample 문제를 해결하기 위해 고안된 Loss 함수이다
    • Positive Sample은 단 하나지만 Negative Sample은 엄청나게 많이 발생하기 때문에 Class imbalance 문제가 발생한다
  • Cross Entropy loss로 부터 고안된 Loss 함수
  • 맞추기 쉬운 Sample에 대해서 발생하는 weight를 낮추고 맞추기 힘든 Sample에 대해서는 높은 weight를 주게 된다
    • loss값은 Focal loss가 작지만 같은 지점의 Gradient를 보면 Focal Loss가 훨씬 크다

Feature Pyramid Networks

  • 서로다른 해상도의 Feature Map을 쌓아올린 형태를 가지는 CNN 모델이다
  • 입력층에 가까울수록 Low Level의 Feature를 가지고, 출력층에 가까울수록 High Level(Global Level)의 Feature를 보유하는 CNN의 특성을 이용하였다
  • (a)는 다양한 Scale의 Feature 맵을 사용해서 다양한 크기의 Object를 탐색하는 것이 가능하고 성능도 좋다. 하지만 여러장의 이미지에서 모두 Feature Map을 추출해야하기 때문에 느린 처리속도를 가진다
  • 기존의 Yolo는 단일 Scale의 Feature 맵을 사용하는 (b) 방식을 사용했다. 모델구조가 단순하여 빠른 처리가 가능하지만, 성능이 떨어지는 단점이 존재한다
  • SSD에서 사용한 방식인 (c)는 다양항 크기의 Feature Map을 사용하여 좋은 성능과 빠른 처리속도를 보여주었지만, Backbone을 지나서 충분하게 High Level 수준의 Feature들을 합쳐서 결과를 내기 때문에, 더 높은 해상도의 Low Level Feature Map(High Resolution map)을 사용 하지 않아 Small Object 검출에 한계가 있다고 논문에서 서술했다
  • FPN에서는 (d)의 구조를 통하여 Low Level 부터 High Level 까지의 Feature Map을 전부 사용하여 검출이 힘든 작은 물체 까지 잘 검출하는 모습을 보여주었다

reference

부스트 캠프 ai tech 8주 2일차 Sementic Segmantation


Semantic segmentation

  • 이미지의 픽셀단위로 Classification을 수행하는 Task
  • 의료분야에서나 자율주행, 영상편집 등의 분야에서 다양하게 사용된다.

Fully Convolutional Networks (FCN)

  • KeyPoint : 기존 fully connected Layer(fc Layer)를 Convolutional Layer로 대체하면서 fc Layer의 문제점을 해결하고 Semantic Segmentation까지 end to end로 구현한 모델
  • 기존의 Classification 모델들은 마지막 Layer를 fc Layer로 구성하기 때문에 고정된 input 이미지 사이즈를 가져야 했지만 1 x 1 Convolution Layer를 사용하면서 가변적인 input 이미지를 사용할 수 있게 되었다

  • 맨 마지막 단에 Upsampling을 시행하여 해상도를 맞춰주어 Segmentation을 한다

    • Transposed Convolution
  • 아래와 같은 특징을 골고루 가지기 위해 중간단계의 map을 Upsampling을 해서 가져와 더한다. 단계별 Map들이 합쳐지면서 더 좋은 Segmantaion 이 가능했다.

    • Layer를 적게 거칠수록 이미지의 지역적이고 세부적인 부분에 집중한다
    • Layer를 많이 지나가면 이미지의 전체적인 부분에 집중한다

U Net

  • FCN을 유사한 구조를 가진 Segmentation 모델
  • Feature를 추출하는 Contracting 과정과 Upsampling을 단계적으로 진행하는 Expanding 과정으로 나뉜다
  • Contracting Path
    • 한번의 과정이 끝날 때 마다 Channel 수를 2배로 늘린다
    • 기존의 FCN의 추출과정과 비슷하다
  • Expanding Path
    • 해상도를 2배씩 늘리면서 점진적으로 Upsampling을 진행한다
    • 반대로 Channel수는 절반으로 줄이면서 진행한다
    • Contracting 과정에서 대칭으로 대응되는 Layer에서 나온 Map과 Concatenating을 진행해서 Fusion 시킨다
  • 주의할점
    • MaxPooling을 통해서 크기를 반으로 점진적으로 줄이고 다시 Upsampling을 통해 2배씩 늘려나가기 때문에 이미지 사이즈가 홀수일 경우 차원이 맞지않아 계산이 불가능하다

DeepLab

  • 구글에서 2018년에 작성된 논문으로 그 당시 좋은 성능을 보여주었다
  • 모델의 특징으로는 Dilated convolution와 Depthwise separable convolution를 이용하여 파라미터 수를 줄이면서 성능을 유지시켰다
  • 본 글에서는 논문의 주된 특징인 Dilated convolution와 Depthwise separable convolution Layer에 대해서 다룬다

Dilated convolution

  • Atrous Convolution 이라고도 한다
  • 필터 내부에 빈 공간이 존재하는 Convolution Layer를 말한다
  • parameter r을 조절하여 내부의 빈 공간의 크기를 조절 할 수 있다
    • 1일 경우 기본적인 Convolution Layer와 동일
  • 동일한 양의 파라미터와 계산량을 유지하면서 한 픽셀이 볼 수 있는 영역을 크게 할 수 있다.
    • 기존에 한 픽셀이 볼 수 있는 영역을 크게 하기위해서는 Kernel Size를 키워야 했는데 이는 필연적으로 파라미터와 계산량의 증가가 따라온다
    • 이미지 데이터의 경우에는 한 픽셀 주위의 픽셀이 어느정도 연관이 되어있다고 가정할 수 있기 때문에 가능한 방식으로 생각된다

Depthwise separable convolution

  • 기존 Convolution Layer의 연산을 2단계로 분리시켜서 사용되는 파라미터 수를 획기적으로 줄인 방법이다
  • Convolution Layer에서는 Channel축을 필터가 한번에 연산하지만, Depthwise separable convolution Layer에서는 Channel을 분리해서 1의 길이를 가지는 여러개의 Feature로 만들고 여기에 1 x 1 x 채널길의 크기의 필터를 다시한번 적용하여 연산을 하는 방식을 취한다
  • 이를 통해서 기존 연산에서는 $H \times W \times C \times n$ 개의 파라미터가 필요 했지만 Depthwise separable convolution 연산에서는 $H \times W \times C + C \times n$ 개의 파라미터가 필요하게 되어 수를 더욱 줄일 수 있었다.

reference

부스트 캠프 ai tech 8주 1일차 CNN architectures


Image Classifier

  • 이미지를 분류하는 기본적인 모델을 말한다
  • 충분한 데이터가 존재한다면 모든 분류문제는 K-Nearest Neighobors로 해결이 가능하다.
    • 영상 분류 문제를 검색 문제로 바꿔서 해결이 가능하다
    • 하지만 데이터는 너무 많고, 우리의 머신 리소스는 한정적이기 때문에 모든 문제를 해결하기에는 적합하지 않다
    • 데이터 수에 비례해서 시간복잡도가 증가한다
  • 초창기에는 single Fully Connected Layer를 이용해서 분류 문제를 해결하려 했다
    • 레이어층이 적다보니 평균적인 이미지에서 벗어나면 잘 작동하지 않았다(test 성능이 좋지 않았다)
  • 이미지를 전체적으로 보는것이 아닌 부분적으로 파라미터 연산을 하는 Locally Connected Layer가 등장하였고 Convolution Layer의 전신이 되었다

Data Augmentation

  • 우리가 모델을 학습시킬때 사용하는 Data는 실제 전체 데이터에서 샘플링한 극히 일부의 데이터이다. 또한 데이터를 제작한 사람의 주관또한 들어가 있을 가능성이 존재하기 때문에 Train Data의 분포가 실제 데이터와 일치한다고 보기 힘들다. 이를 보안하기 위해서 Data의 분포를 다양하게 만드는 방법을 Data Augmentation이라고 한다.
  • 기본적인 Augmentation
    • 밝기, 채도, 명암 조절
    • Random Crop, Filp, Rotate
    • Affine Transform : 기하학적 변환
      • warp로 시작하는 함수
  • 특수한 Augmentation
    • CutMix : 두개의 사진을 잘라서 합치는 Augmentation. 라벨값 또한 비율에 맞게 조절한다
  • MixUp : 두개의 사진을 Alpha값의 조절을 통한 픽셀을 합치는 Augmentation. 라벨값 또한 비율에 맞게 조절한다

Transfer Learning

  • 기존에 학습시킨 네트워크를 이용하여 새로운 Task를 해결하는 모델에 재학습 시키는 방법
  • 학습시키는 Dataset이 비슷한 분포를 가지고 있어야 더욱 잘 학습 된다.
  • Layer Freeze
    • 특정한 Layer의 Parameter를 Freeze시켜서 고정시키고 나머지 Layer로만 학습시키는 방법
    • 데이터의 양이 적을때 효과가 좋다
  • Fine Tuning
    • 새로 추가된 Layer의 Learning Rate와 기존 CNN 부분의 Learning Rate를 다르게(기존 부분을 더 작게) 설정하여 Tuning하는 방법
    • 어느정도 데이터가 존재할때 효과가 좋다

Knowledge distillation

  • Teacher Student Learning
  • 큰 모델에서 학습한 weight를 작은 모델에도 비슷하게 작동하게 전달하는 기법
    • 최적화방면에서도 많이 이용된다.

reference

Week7 Review


P-Stage 회고

1. P Stage 동안 진행 한 일

  • Pytorch Lightning을 이용한 베이스 라인 코드를 작성하였다. Yaml파일을 이용하여 빠르게 Hyperparameter와 모델을 수정 할 수 있도록 코드를 설계했고, 이 코드를 바탕으로 팀에서 많은 실험을 할 수 있었다.
  • 하나의 Task를 분리하는 가설을 세우고 검증하였다. 마스크, 성별, 나이 3가지를 한 모델로 판단하는 것보다 3개의 모델로 3가지를 따로 판단하는 것이 더 학습시키기 용이하다고 생각하였다. 동일 모델 동일 Hyperparameter를 가지고 Target Label만 바꿔서 학습을 시켰을 때 약 0.01의 스코어 상승이 있었다.
  • Soft Voting 구현을 하였다. 최종 제출을 앞두고 Soft Voting 을 구현하여 0.015정도의 스코어 상승을 실현했다.
  • Gradient Cam Module을 코드에 사용할 수 있게 적용하였다. 이를 통하여 일부 모델이 예측할 때 강한 옷의 무늬나 배경이 영향을 준다는것을 확인하였다.
  • 베이스라인 코드에 Layer Freeze 기능 추가. 학습이 진행되면서 Loss값이 증가하는것을 확인하고 이를 방지하기 위해 특정 Epoch가 지나면 자동으로 Layer를 Freeze 하도록 코드를 수정하였다.

2. 한계 및 아쉬웠던 점

  • 시간상의 제약으로 여러가지 실험을 진행하지 못한 가설들이 여러가지 있어서 많이 아쉬웠다
    • mean variance loss를 이용한 Regression Model로 나이 예측
    • 추가적인 데이터 전처리 (배경 제거, 학습시킨 모델을 이용한 이상치 제거)
  • SOLID 원칙을 일부 지키지 않아 코드의 재사용성이 조금 떨어져서 기능을 추가할 때 고쳐야할 코드가 많아지고 이때문에 시간이 더 소요되었다
  • 협업 툴을 사용하긴 했으나 제대로 활용되지 않아서 아쉬웠다.

3. 다음 프로젝트 위해 해보고 싶은 것

  • 여유를 가지고 프로젝트에 임하기 위해서 자신만의 유연한 베이스라인 코드를 완성시키고 싶다
  • 협업 툴 사용이 미숙하여 체계적으로 협업을 진행하지 못한것에 대해서 아쉬움이 남아 미리 팀 룰을 정하고 체계적으로 역할을 분담하여 진행해보자 한다

4. 느낀점

  • 2주동안 진행되었던 P-Stage가 끝나고 기존 팀원들과 흩어지고 새로운 팀으로 이동하게 되었는데 아쉽기도 하면서 기대되기도 한다.
  • 급하게 하다보니 시간이 많이 부족했었다. 아직 Pythonic하지 못한 듯 하다. 더 노력해야지

Week6 - Day5 Review


1. 오늘 한 것

  • P-Stage
    • ipynb파일로 구현한 Baseline Code를 분리 및 모듈화
    • GradCam이 코드에 적용되도록 구현

2. 피어세션에서 한 것

  • mask RCNN 논문 리뷰

3. 주말 할 일

  • 베이스라인 코드를 가지고 가설검증(주말내에 끝내기)
  • 실험 정리

4. 하루 느낀점

  • 하루종일 코드만 보고있어서 조금 지친 하루가 된것 같다
  • level2에서 같이 팀을 하자고 연락이 온 캠퍼들과 이야기를 나누었는데 긴장되어 보였다

5. 미세한 팁

  • pyyaml로 yaml파일을 불러올때 1e5같은 형식의 수치는 str형으로 받아온다
  • 이때 float형으로 받고 싶으면 1.0e5같이 쓰면 된다
  • Linear scaling role
    • 배치사이즈와 비례해서 lr을 움직여야 한다

Week6 - Day4 Review


1. 오늘 한 것

  • P-Stage
    • Baseline code 추가수정
    • Grad cam 코드 구현

2. 피어세션에서 한 것

  • P-Stage
    • 팀원들에게 Baseline코드 설명

3. 내일 할 일

  • ipynb 파일을 Python IDE로 변환

4. 하루 느낀점

  • 하루종일 코드만 보고있어서 조금 지친 하루가 된것 같다
  • level2에서 같이 팀을 하자고 연락이 온 캠퍼들과 이야기를 나누었는데 긴장되어 보였다

Week6 - Day3 Review


1. 오늘 한 것

  • P-Stage
    • 기존의 CV score와 LB score간의 차이가 큰점을 해결하기 위해 베이스라인 코드를 수정하였다
  • Kaggle Study
    • House Price Dataset에 관한 EDA 발표
      • 화장실에 대한 고찰
      • Data Descript.txt를 읽고 데이터에 대한 고찰

2. 피어세션에서 한 것

  • P-Stage
    • 팀원들과 여러가지 가설을 세워보았다
    • Data Agument를 위한 Transform 선택
    • Face Crop
    • Model Design

3. 내일 할 일

  • 가설 검증을 위한 코드 제작

4. 하루 느낀점

  • House price 데이터가 column이 많아서 다시 봐도 헛갈린다
  • 스터디를 마치고 김태진 마스터님이 좋은 말씀을 많이 해주셨다
    • 역시 즐겁게 해야 오래 할 수 있다

Week6 - Day1 Review


1. 오늘 한 것

  • 강의
    • 1~6강
  • P-Stage
    • EDA
    • Dataset 코드 작성
    • Solution에 필요한 논문탐색

2. 피어세션에서 한 것

  • P-Stage가 시작해서 팀원들과 어떤방식으로 진행해야할지 대해서 의논하였다

3. 내일 할 일

  • Pytorch Lightning base코드 작성
  • 일부 모델 구성 생각

4. 하루 느낀점

  • 드디어 P-Stage가 시작하였다. 열심히 진행해서 좋은 결과를 내면 좋겠다.

윈도우, Linux 그리고 Docker


부스트 캠프를 진행하던 도중 질문게시판에 mlflow를 윈도우에서 돌렸는데 에러가 발생했다고 올라와서 궁금해서 조사하던 도중 알게된 사실과 추가적으로 궁금해서 찾아본 것들에 대해 정리해 보고자 한다

발생한 문제점

  • docker: Error response from daemon: invaild mode: 경로와 같은 에러가 발생하였다.

조사과정

  • 평소 python에서 코딩을 할 경우에도 /와 \를 혼용해서 사용하면 매우 쉽게 에러가 발생하는 모습을 보았기 때문에 Linux기반인 docker에서 windows 명령어를 사용해서 에러가 나는것이 아닐까 생각하였다

알게된 점

  • 원인은 : symbol에 존재했다. 윈도우에서는 : symbol을 C:\directory식으로 드라이브를 표기할 때 사용하지만, mount할때에는 : 를 연동할 대상의 구분자로 사용을 하기 때문이다
  • docker 에서 volumn mount를 시행할 시 입력되는 경로는 무조건 절대경로로 적어야한다. pwd로 입력해야한다고 doc에 나와있었다

해결 방법

  • C: 형태를 //C/directory 형태로 바꿔서 입력을 한다
    • 기존 윈도우에서 사용하는 형태를 리눅스 커맨드 형태로 바꿔서 입력한다
    • 어차피 docker 내부에서 작동할 커맨드이기 때문에 윈도우 커널에서도 잘 돌아간다
  • “”로 한번 감싸준다
    • “”로 싸주어서 전체 C:\가 링크인것을 알려준다

결론

  • 기본적으로 docker는 Linux 기반이기 때문에 windows로 사용할 경우 많은 제약이 당연하게도 뒤따른다
  • windows에서 Docker를 쓸 때는 WSL을 이용하자

reference

Week5 - Day 1~4 Review


1. 이번주동안 한 것

  • 강의
    • Data viz 6~7강
    • Ai serving 관련해서
  • 정리
    • Project Serving
  • docker 추가공부
  • fastai, mlflow, feature

2. 피어세션에서 한 것

  • tmux

3. 내일 할 것

  • 다음주 대회 미리 baseline code 준비

4. 하루 느낀점

  • 이번주 내용이 매우 가볍다보니 정리를 조금 소홀히 한듯하다
  • 다시 다잡고 마저 정리해야겠다