1강
강의 목표
- semantic segmentation에 대한 기초
- 논문에 대한 정확한 이해보다 논문이 나온 배경과 방법론에 대한 이해
- 모델의 구조를 살펴보면서 어떤 식으로 코드를 작성할지에 대한 실력 향상
- 대회에서 사용되는 기법에 대해 살펴보며 많은 스킬들 습득
2강
데이터셋 및 baseline 코드 설명
3강 - Semantic Segmentation의 기초
- Fully Convolutional Networks
- concept
- vggnet 백본 사용
- vggnet의 nn.linear를 convolution으로 대체
- transposed convolution을 이용해 pixel wise prediction을 수행
- Fully connected layer vs Convolution layer:
- Fully connected layer는 각 픽셀의 위치정보를 해침(nn.Linear: flatten, fc layer)
- convolution layer는 각 픽셀정보를 해치지 않음 + 다른 입력사이즈가 들어와도 학습가능하다.
- transposed convolution
- 이전 convolution값과 동일한 것이 아닌 convolution처럼 학습 가능한 파라미터이기 때문에 backpropagation에서 update되는 것임
- FCN에서 성능을 향상시키기 위한 방법(skip connection)
- MaxPooling에 의해 잃어버린 정보를 복원
- Upsampled size를 줄여주기에 좀 더 효율적인 이미지 복원이 가능
4강 - FCN모델의 한계를 극복한 모델들1
FCN의 한계점
- 객체의 크기가 크거나 작은 경우 예측을 못함
- receptive field 문제
- maxpooling때문에 정보 손실
- 객체의 디테일한 모습이 사라짐
- upsampling과정이 간단해 경계를 학습하기 어려움
Decoder 개선
- DeconvNet(정확도)
- Decoder를 Encoder와 대칭으로 만듬
- Unpooling
- pooling은 노이즈 제거하나 정보를 손실
- unpooling시에 pooling시에 지워진 경계에 정보를 기록했다가 복원
- 하지만 sparse한 activation map을 가지기 때문에 이를 채워야함 → transposed convolution(unpooling, transposed conv가 상호보완적)
- unpooling은 자세한 구조 잡아냄
- transposed conv의 경우 위의 구조에 빈 부분을 채워넣음
- SegNet(빠른 속도)
- 가운데 부분을 없애서 파라미터가 줄어 속도가 빨라짐
- unpooling을 통해 학습이 필요하지않음
- DeconvNet vs SegNet
Skip connection 적용
- FC DenseNet
- 바로 앞 레이어 뿐만 아니라 그 전의 레이어로부터 skip connection
- Unet
- 인코더의 정보를 skip connection으로 디코더로 넘겨줌
Receptive Field를 확장
receptive field?: 뉴런이 얼마만큼의 영역을 바라보고 있는지에 대한 정보
receptive field가 작으면 부분적인 정보를 가지고 있어서 segmentation의 정확도가 낮다.
- DeepLabv1
- conv → maxpooling→conv를 반복하면 효율적으로 receptive field를 넓힐 수 있음
- Dilated convolution: receptive field높히고 파라미터 줄이고 high resolution
- CRF(conditional random field)
- DilatedNet
5강 - Receptive Field를 확장시킨 models
-
복습
- DilatedNet, DeepLab-LargeFOV둘다 dilated rate를 줘서 더 큰, 효율적인 receptive field를 가질 수 있다.
-
DeepLabv2
- FC6부터 FC8까지 여러 branch 형태로 바꿈(ASPP:Atrous Spatial Pyramid Pooling)
- ASPP(rate가 작으면 작은 물체에 집중, rate가 크면 큰 물체에 집중, 여러 결과를 앙상블처럼 합침)
- backbone을 ResNet으로 바꿈
-
PSPNet
-
기존 문제점
1. 객체들간의 관계를 catch하지 못함
2. 비슷한 카테고리를 혼동
3. 무늬가 비슷한 객체를 잘 구분하지 못함
→ global한 context를 catch해야한다!
global average pooling을 적용해 sub-region을 생성
-
global average pooling
- 전체 피쳐맵을 1x1의 형태로 바꿔 각기다른채널에 대해 하나의 피처맵으로 바꿈, average pooling과 비슷하지만 각 채널에 대해 1x1형태로 바꾼점이 다름
- 주변 정보(문맥)을 파악해서 객체를 예측하는데 사용
-
DeepLabv3
- ASPP에 global average pooling이 추가됨→ global한 Context
-
DeepLabv3+
- Encoder-Decoder구조
- encoder에서 손실된 정보를 decoder에서 점진적으로 복원
-
SPP(Spatial Pyramid Pooling)
-
Encoder-Decoder(Skip connection)를 합쳐서
→ Encoder-Decoder with Atrous Conv
- Backbone(modeified Xception)
-
Depthwise Convolution: 각 채널마다 다른 filter를 사용하여 convolution연산 후 결합
-
pointwise convolution(1x1kernel)
→ Depthwise Separable Convolution(더 효율적인 계산, 성능줄고 속도빨라짐)
4~5강 정리
FCN의 한계를 극복
-
Encoder와 Decoder를 대칭으로 만든 형태
- upsampling으로 unpooling사용하는데 unpooling은 max indices를 이용해 maxpooling에 의해 잃어버린 index정보를 복원하는 과정, unpooling은 자세한 구조를 잡아냄
- Transposed Conv: class specific한 구조를 잡아냄(unpooing의 구조에 빈 부분을 채워넣는다.)
-
SegNet(속도)
- 내부 fclayer를 제거
-
Skip connection: Neural network에서 이전 layer의 output을 일부 layer를 건너 뛴 후의 layer에게 입력으로 제공하는 것
- DenseNet, FCDenseNet, UNet
-
Receptive Field
- 원래는 conv, maxpooling을 통해 receptive field를 넓혔으나 , resolution측면에서 안좋음
→ dilated convolution으로 down sampling과 upsampling을 없애줌
- Dilated Conv
-
DeepLab v1
- dense CRF후처리
-
DeepLab v2
- ASPP를 통해 다른 dilated rate
- vgg가 아니라 resnet
-
PSPNet
- 객체간 관계, 비슷한 클래스 혼동, 무늬 비슷한거 잘 못나눔→global context
→ Global average pooling
→많은 영역을 catch하는 average pooling
-
DeepLabv3
- global average pooling을 aspp에 적용
- xception
- encoder decoder
6강-UNet
- U-Net구조
- Contracting path와 Expanding Path가 대칭인 U자형을 이룸
- contracting path: 입력 이미지의 전반적인 특징 추출
- Expanding path: localization을 가능하게 함
- skip connection
- concat하는데 resolution이 다른 문제(64에서 56) → crop
- Augmentation
- Random Elastic deformations
- pixel wise loss weight를 계산하기 위해 weight map생성
- 인접한 셀의 경우 weight 크게 멀리있으면 weight 작게해 loss에 반영
- 한계점
- 깊이가 4로 고정
- 데이터셋마다 다른 성능 → 최적 깊이 탐색 비용이 커짐
- 단순한 skip connection
- U-Net++
- 구조적 이점
- Encoder를 공유하는 다양한 깊이의 U-Net생성
- Skip connection을 동일한 깊이에서의 feature maps이 모두 결합되도록 유연한 feature map 생성
- Dense Sip connection, Ensemble, Deep Supervision
- 한계점
- 파라미터와 메모리가 많아짐
- encoder와 decoder사이에서의 connection이 동일한 크기를 갖는 featuremap에서만 진행됨
- U-Net3+
- Full scale skip connection
- encoder layer로 부터 same scale의 feature maps받음
- encoder layer로부터 smaller scale의 lower level feature maps를 받음
- decoder layer로 부터 larger scale의 high level feature maps를 받음
- Classification guided Module(CGM)
- lower level layer에 남아있는 background의 noise발생하여 많은 False positive 문제 발생(배경이 있는데 물체가 있다고함)
- Full scale Deep Supervision(loss function)
- focal loss
- ms ssim loss: boundary인식 강화
- iou loss: 픽셀의 분류 정확도 상승
- encoder backbone만 다르게
- Residual UNet
- Mobile-UNet(빠르게해줌)
- Eff-UNet
정리
- UNet architecture
- contracting path, expanding path
- skip connection
- data augmentation
- weight map
- 한계: depth 고정, Simple skip connection
- UNet++
- depth 1, 2, 3, 4 Ensemble
- Dense skip connection
- deep supervision(loss)
- 한계: simple skip connection(결국 같은 scale), 파라미터와 메모리, Full scale에서 정보탐색못함
- UNet 3+
- Full scale skip connections
- loss function 세가지 결합
- CGM(후처리)
7강-Semantic Segmentation대회에서 사용하는 방법들1
- model 불러오기
- segmentation models
- 라이브러리 설치
- architectures
- encoders
- 주의할사항
- 디버깅모드
- 시드고정
- 실험기록
- 실험은 한 번에 하나씩
- 역할분배
- validataion
- hold out(8:2)
- k-fold
- stratified k-fold
- group k-fold
- augmentataion - 도메인에 맞는 augmentation 기법이 필요
- 목적
- 데이터수 증가, 일반화 성능 class imbalance 해결
- 방법
- torchvision.transforms
- albumentation
- 최신 방법
- Cutout(A.CoarseDropout)
- gridmask(A.GridDropout)
- mixup
- cutmix
- snapmix(cam을 이용해 이미지 및 라벨 mixing)
- cropnonemptymaskifexists(A.augmentations.crops.transforms.CropNonEmptyMskIfExists
- SOTA Model
- Scheduler
- lr이 너무 작으면 학습이 오래걸리고 local minima에 빠질 위험이 있음
- 너무 크면 발산
- CosineAnnealingLR
- ReduceLROnPlateau(성능이 향상되지 않을 때 learning rate를 조절) - 파라미터가 많음
- Gradual Warmup
- 이 방식을 사용하면 weight가 불안정한 초반에도 비교적 안정적으로 학습을 수행할 수 있음
- backbone 네트워크 사용시에 weight가 망가지는 것을 방지
- Batch size
- 크면 빨라지고 일반화가 좋음
- gradient Accumulation - gradient를 누적했다가 이후에 update
- optimizer
- adam, adamw, adamp..
- Lookahead optimizer
- adam이나 sgd로 빠져나오기 힘든 local minima를 빠져나올 수 있음
- loss
8강
baseline이후에 시도해볼만한 것들
- Ensemble
- 5-fold ensemble
- epoch ensemble
- swa-각 step마다 weight를 업데이트 시키는 sgd와 다르게 일정 주기마다 weight를 평균 → 일반화에 좋음
- seed ensemble
- resize ensemble
- TTA(Test time augmentataion)
- 테스트할 때 augmentation을 수행하고 ensemble
- resize기법 multi scale - 성능좋아짐
- rotate
- TTA library-ttach
- horizontalflip
- verticalflip
- rotate90
- scale
- pseudo labeling
- 외부데이터셋 활용
대회에서 사용하는 기법들
- 문제1 - 한번 학습하는데 너무 오랜시간 걸림
- FP16(부동소수점)
- 실험간소화
- 가벼운 모델로 실험하고 최종 성능이 잘 나오는 모델로 확인
- 문제2 - 이미지가 매우 큼
- resize를 시킨 후 test set에 대해 예측된 Mask를 원본 size로 복원
- sliding window
- 문제3 - label noise
- label smoothing
- pseudo labeling을 활용한 label preprocessing(threshold보다 높은 값에 대해서 처리하기)
9강-Semantic segmentation연구동향
- 모델의 발전
-
LeNet
-
AlexNet
-
VGGNet
-
ResNet
-
EfficientNet
→ 고해상도 입력을 점차 저해상도로 줄여나가는 설계방식
저해상도 high level feature를 이용해 upsampling, decoder등으로 segmentation결과 생성
image classification 모델이 해상도를 점점 줄여나가는 이유?
-
물체를 분류하는데 이미지 내 모든 특징이 필요하지 않음
-
해상도가 줄어들어 효율적인 연산이 가능하며 큰 receptive field를 가짐
-
중요한 특징만을 추출해 과적합을 방지
- segmentation vs image classification
-
분류모델은 공간적 정보를 고려하지 않지만 segmentation은 중요
-
특징을 추출하기 위한 pooling등의 연산은 모든 픽셀에 대해 정확히 분류하기에 자세한 정보를 유지하지 못함
→ semantic segmentation은 높은 해상도를 유지할 필요가 있음!
기존까지는 저해상도 특징을 생성하고 다시 고해상도로 복원하는 방식의 기존 연구
- HRNet
- 저해상도(encoder-decoder)/중해상도(dilited rate)복원이 아니라 고해상도 정보를 계속 유지한다면?
-
전체 과정에서 고해상도 특징을 계속 유지
- 전체 구조에서 1/4해상도를 그대로 유지
-
고해상도부터 저해상도까지 다양한 해상도를 갖는 특징을 병렬적으로 연산
- 고해상도 convolution stream을 시작으로 점차 해상도를 줄여 저해상도 stream
- 해상도를 줄여 넓은 receptive field를 갖는 특징(semantic한 정보)을 고해상도 특징과 함께 학습함
-
다중 고해상도 정보를 반복적으로 융합(Repeated multi resolution fusions)
- 고해상도 특징: 공간상의 높은 위치 정보 민감도를 가짐
- 저해상도 특징: 넓은 receptive field를 바탕으로 상대적으로 풍부한 의미정보를 가짐
→ 채널이 다름
고해상도 정보를 저해상도로 전달: strided conv 연산
저해상도 정보를 고해상도로 전달: bilinear upsampling, 1x1 conv
- 다양한 종류의 출력 생성
- 해결하고자 하는 문제에 따라 세가지의 서로 다른 출력 형성(pose estimation, segmentation, obdet)
- 정리
- 입력 이미지의 해상도 1/4로 축소
- 1/4해상도는 그대로 유지하면서 새로운 저해상도 stream을 생성하여 서로의 정보들을 융합
- 모든 해상도 정보를 합한 후 원래 이미지 크기로 bilinear upsampling하여 최종 결과 출력