공부한 내용
Semantic Segmentation
1. Semantic Segmentation
1.1. What is semantic segmentation?
1) overview
• image classification을 pixel 단위로 분류하는 문제
• 영상 속 물체의 mask를 생성
• 같은 class이지만 서로 다른 물체는 구분하지 못함
- e.g. 영상 속 여러명의 사람은 같은 색으로 표현
• instance segmentation : 같은 class이지만 서로 다른 물체를 구분
1.2. Where can semantic segmentation be applied to?
1) applications
• semantic segmentation은 image 내의 contents를 이해하는 데에 다양하게 활용 가능
• 영상 contents 편집에는 필수적
- e.g. object 구분되는 특징 이용해 특정 물체만 수정할 수 있는 UI 제공 (post-processing)
• computational photography
- computer 이용해서 photography 편집하는 기술에 응용 가능
2. Semantic Segmentation Architectures
2.1. FCN (Fully Convolutional Networks)
1) FCN
• end-to-end model
- 입력부터 출력까지 미분 가능한 neural network로 구성
- 입력과 출력 pair만으로 neural network 학습 후 target task에 적용 가능
• 기존에는 hand-designed algorithm의 결합으로 semantic segmentation 수행
- 데이터 많아도 학습 가능한 부분 제한
- 성능 향상 위해 수학적 모델을 try and error 방식으로 실험 -> 성능 향상 어려운 문제
• 임의의 해상도의 input image 사용 가능
• output image의 해상도도 input image에 맞춰진다.
• cf. AlexNet
- input의 해상도 달라지면 convolutional layer의 activation map의 dimension 변화
- convolutional layer 뒤에 flattening part에서 vectorization
- vector 길이 달라지면 FC layer를 사용할 수 없는 한계 존재
- FCN은 학습에 사용한 input 해상도에 관계 없이, 테스트할 때 임의의 해상도의 영상 사용해도 문제 없음 -> 높은 호환성
2) Fully connected vs. Fully convolutional
• FC layer
- 공간정보 고려 안함
- fixed dimensional vector 주어지면 또 다른 fixed dimensional vector 출력하는 구조
• fully convolutional layer
- input, output 모두 activation map(tensor)
- spatial coordinate 유지한 상태로 convolutional operation 수행
- 1x1 convolution으로 구현해서 각 위치마다 classification 결과를 map 형태로 출력
3) FC layer as 1x1 convolutions
• 기존 FC layer를 다르게 해석하면 1x1 convolution으로 구현 가능
• semantic segmentation network 쉽게 구현 가능
• FC layer
- convolutional layer에서 activation map 출력
- activation map에 flattening 적용하여 vectorization (raster order scanning)
- 영상의 공간정보 고려하지 않은 하나의 vector로 만들어짐
• channel axis 기준으로 flattening
- 각 위치마다 1개의 vector 생성
- 각 vector에 대해 FC layer 적용 가능
• 1x1 convolution layer
- 1x1 convolution kernel을 FC layer에서 하나의 weight column으로 볼 수 있다.
- 여러 개의 1x1 convolution kernel == FC layer
- sliding window 방식
- filter의 weight 공유
- spatial information 유지
• FC layer를 convolutional layer로 대체 -> FCN
• semantic segmentation model using FCN
- 위치 별로 classification 가능
- stride & pooling layer 적용 -> 넓은 receptive field size, input의 context 고려
- 필연적으로 해상도가 낮아지는 문제 발생
- 저해상도의 activation map -> 작은 score map
- 문제 해결 위해 upsampling 도입
4) Upsampling
• stride & pooling layer vs. activation map resolution
- stride와 pooling layer가 없으면 고해상도의 activation map 출력 가능
- receptive field의 size가 작아 영상의 전반적인 context 파악 불가능한 문제 발생
- trade-off
• activation map 작게 만들어 receptive field size를 크게 하는 것이 성능에 좋다.
• upsampling 적용하여 강제로 resolution 맞춤
• 대표적인 방식
- Transposed convolution
- Upsample and convolution
5) Transposed convolution
• input value로 filter weight를 scaling 후 output의 해당 위치에 적용
• kernel 중첩되는 부분에서는 더해지는 효과
• 학습 가능한 upsampling을 하나의 layer로 한 번에 처리
• 일정 부분의 kernel 중첩되어 계속해서 결과 더해지는 문제 발생 (checkerboard artifact)
• convolution kernel size와 stride 조정하여 중첩 생기지 않도록 적용하는 것이 중요!
6) Upsample and convolution
• 쉽게 구현 가능하고 좋은 성능
• 골고루 영향 받는 효과
• upsampling operation을 두 개로 분리
① interpolation 적용(NN, bilinear sampling, etc.)
- 학습 가능한 parameter 없이 해상도만 높임
② 학습 가능한 runnable upsampling으로 만들기 위해 convolutional layer 적용
- 학습 가능
7) Feature map resolution
• 해상도 줄어든 상태에서 upsampling 통해 잃어버린 정보 살리기 어려움
• high resolution
- fine : 작은 receptive field size
- low level layer
- detail : 작은 디테일
- local : 국지적, 작은 차이에도 민감
• low resoltion
- coarse : 큰 receptive field size
- high level layer
- semantic : 의미론적 정보 포함
- holistic : 전반적
- global
• semantic segmentation은 high resolution(픽셀 별), low resolution(의미 파악) 모두 필요
• 영상 전체에서 pixel이 물체의 경계선 안쪽인지 바깥쪽인지 파악 필요
• 물체의 경계를 디테일하게 파악해야 한다!
8) skip connection
• 작은 score map과 큰 score map의 특징 모두 확보하기 위해 fusion
• high level layer의 activation map을 upsampling -> 해상도 높임
• low level layer의 activation map을 upsampling 후 concatenation 적용
• e.g. models
- FCN-32s : conv7(마지막) activation map만 사용 (x32)
- FCN-16s : (pool4 + conv7(x2)) activation map (x16)
- FCN-8s : (pool3 + pool4(x2) + conv7(x4)) activation map (x8)
• 중간 단계 activation map 합쳐 성능 향상
9) Features of FCN
• Faster
- end-to-end neural network
- GPU 병렬처리 가능
• Accurate
- model이 전반적으로 해당 task에 대해 학습
- low level feature + high level feature -> 경계선 잘 근사
2.2. Hypercolumns for object segmentation
1) Hypercolumns
• FCN과 유사한 연구
- target task : semantic segmentation
- motivation : skip connection
- 1x1 convolution 적용
- low level layer와 high level layer의 feature map 해상도 맞춰 사용하는 방법 제시
• 낮은 layer와 높은 layer의 feature를 융합하는 과정 강조
• FCN은 1x1 convolution과 fully convolutional 강조
2) Overall architecture
• end-to-end가 아니다.
• third party algorithm 사용해서 object의 bounding box 먼저 추출해서 적용
2.3. U-Net
1) Overview
• 대부분 semantic segmentation model의 break through는 U-Net에서 시작
• neural network model 중 input과 비슷한 size의 output을 가지는 model, object detection이나 semantic segmentation 등 영상의 일부를 자세히 봐야하는 기술에는 U-Net에 기원이 있는 경우가 많다.
• fully convolutional network
• 낮은 층의 feature와 높은 층의 feature의 특징을 더 잘 결합하는 방법 제시 (skip connection)
• 더 정교한 segmentation 결과 도출
2) Overall architecture
• U자 모양
• contracting path
- 일반적인 CNN과 동일하게 해상도 낮추고 채널 늘리는 방식
- input -> convolutional layer -> pooling(receptive field 확보) -> activation map
- 작은 activation map에는 영상의 전반적인 정보가 잘 녹아있다고 가정
- 해상도 반씩 감소
- 채널 수 2배씩 증가
• expanding path
- upsampling 경로
- 한 번에 upsampling하지 않고, 점진적으로 activation map의 해상도 높이고 채널을 줄인다.
- activation map의 채널 수, 해상도는 contracting path에서 대칭으로 대응되는 layer와 동일하게 맞춘다.
- ResNet처럼 더하는 방식이 아니라 concatenation으로 activation map을 합치는 방법 사용 (skip connection)
- 해상도 2배씩 증가
- 채널 수 반씩 감소
• localized information
- 낮은 layer에서 전달된 특징이 localized된 정보를 준다.
- 공간적으로 높은 해상도 -> 민감한 정보 제공
- 경계선이나 공간적으로 중요한 정보들을 뒤쪽 layer에 전달
3) feature map size
• skip connection 통해 전달되는 activation map이 expanding path의 activation map과 concatenation되기 위해서는 해상도가 맞아야 한다.
• feature map의 spatial size가 홀수인 경우
- feature map downsampling : 일반적으로 버림
- e.g. 7x7 -> 3x3
- feature map upsampling : 2배로 늘림
- e.g. 3x3 -> 6x6
- input size 7x7과 output size 6x6이 맞지 않는 현상 발생
• 중간의 모든 layer에서 홀수 activation map size가 나오지 않도록 주의
4) PyTorch code for U-Net
• contracting path
- double_conv : double convolutional block
- convolutional layer x 2, ReLU activation function x 2, max pooling x 1
• expanding path
- upsampling위해 transposed convolution 사용
- hyperparameter : stride=2, kernel_size=2 -> 중첩(checkerboard artifact) 발생 방지
2.4. DeepLab
1) Overview
• semantic segmentation에서 중요한 한 획
• key idea
- CRFs (Conditional Random Fields)
- Atrous convolution operation
2) CRFs
• post processing에 사용
• graph modeling 등 최적화된 배경지식 필요
• pixel 사이의 관계를 모두 이어서 pixel map을 graph로 표현하여 경계 잘 찾도록 modeling
• score map과 input image의 경계선 사용해서 score map이 경계선에 잘 맞도록 확산
• foreground의 mask와 background의 mask를 경계선 근처에서 tight하게 만드는 효과
3) Atrous convolution
• dilated convolution과 depthwise separable convolution을 결합하여 사용
• dilated convolution
- convolution kernel 사이에 dilation factor만큼 일정 공간 넣어주는 방법
- 실제 convolutional kernel보다 넓은 영역 고려
- parameter 수는 동일하지만 receptive field size가 증가하는 효과
• depthwise separable convolution
- 큰 input의 해상도로 인한 오래 걸리는 연산을 줄이기 위한 방법
- ① depthwise convolution : 채널 별로 convolution
- ② pointwise convolution : 1x1 convolution통해 하나의 값 출력
- convolution의 표현력은 유지하면서 계산량 획기적으로 감소
4) Overall architecture
• Atrous convolution으로 feature map 출력
• Atrous spatial pyramid pooling
- 영역 별로 연관된 주변 물체나 배경 정보와의 거리가 다르다.
- 영상 내에서 다양한 scale의 object 고려하는 방법
- 다양한 rate의 dilated convolution 통해 multi scale의 object 처리
- 출력된 feature map을 하나로 concatenation 후 1x1 convolution 통해 하나의 feature map으로 만든다.
• decoder
- 낮은 layer의 low-level feature map과 pyramid pooling 거친 feature을 upsampling한 feature map을 concatenation
- 마지막으로 upsampling하여 segmentation map 출력
피어세션
1. 강의 내용 발표
2. Further idea
• CRF
• dilated convolution
- d = 1 : 빈 칸 없이
- d = 2 : 빈 칸 한 칸
3. 과제 질문
• blur
- blur 적용하면 뭉게지면서 넓은 선을 표현하니 0이 아닌 값들이 많아지게 된다.
- 0으로 parameter를 initialization하게 되면 문제가 될 수 있기 때문에 blur가 효과가 있다.
- 옆 pixel과의 차이가 중요하지 값 자체가 중요하지는 않다.
- blur 적용하면 선이 굵어져 표준화된다고 생각.
매일 늦게 자다보니 피로가 누적이 많이 되는 것 같다.
그래도 공부하는게 재미있어서 버틸만 하다.
내일 하루만 더 열심히 하면 주말이니까 화이팅!
'BoostCamp' 카테고리의 다른 글
2021.09.14 - [Week 7] Day 2. 팀 구성 완료 (0) | 2021.09.15 |
---|---|
2021.09.13 - [Week 7] Day 1. 컨디션 쏘쏘 (0) | 2021.09.14 |
2021.09.07 - [Week 6] Day 2. - (0) | 2021.09.08 |
2021.09.06 - [Week 6] Day 1. Level 2 (0) | 2021.09.07 |
2021.09.03 - [Week 5] Day 5. 마무리 (0) | 2021.09.03 |