본문 바로가기
TIL/Boostcamp AI tech

[3rd P stage] Segmentation Wrap UP

by seowit 2021. 10. 18.

10.18

1. 강의 듣기 & 정리

2. baseline 코드 돌려보기

  • ERROR
    • error message : "Error loading preloads : Could not find renderer"
    • 해결 :  관련 라이브러리 설치 
      • apt-get update
      • apt-get install -y libsm6 libxext6 libxrender-dev​
  • CUDA OOM
    • restart를 하고 batch size를 6으로 줄임
    • gpu 어떻게 쓰고 있는지 보고 싶음
  • Unet++ baseline 코드 결과 : miou 0.219 (굉장히 낮음)

 


10.19

1. 강의 듣기 & 정리

2. Special Mission

  • FCN8 / FCN16 / FCN32 구현
  • 더보기
    FCN8
    # 모델 참고 코드 
    # https://github.com/wkentaro/pytorch-fcn/
    import torch
    import torch.nn as nn
    class FCN8s(nn.Module):
        def __init__(self, num_classes=11):
            super(FCN8s, self).__init__()
            
            def CBR(in_channels, out_channels, kernel_size=3, stride=1, padding=1):
                return nn.Sequential(nn.Conv2d(in_channels=in_channels,
                                                out_channels=out_channels,
                                                kernel_size=kernel_size,
                                                stride=stride,
                                                padding=padding),
                                    nn.ReLU(inplace=True)
                                    )
            
            # conv1
            self.conv1_1 = CBR(3, 64, 3, 1, 1)
            self.conv1_2 = CBR(64, 64, 3, 1, 1)
            self.pool1 = nn.MaxPool2d(2, stride=2, ceil_mode=True) 
            
            # conv2
            self.conv2_1 = CBR(64, 128, 3, 1, 1)
            self.conv2_2 = CBR(128, 128, 3, 1, 1)  
            self.pool2 = nn.MaxPool2d(2, stride=2, ceil_mode=True)
    
            # conv3
            self.conv3_1 = CBR(128, 256, 3, 1, 1)
            self.conv3_2 = CBR(256, 256, 3, 1, 1)
            self.conv3_3 = CBR(256, 256, 3, 1, 1)          
            self.pool3 = nn.MaxPool2d(2, stride=2, ceil_mode=True) 
    
            # Score pool3 -> 1x1 Conv로 채널 num_classes로 맞춰주는 과정
            self.score_pool3_fr = nn.Conv2d(256,
                                            num_classes,
                                            kernel_size=1,
                                            stride=1,
                                            padding=0)
            # conv4
            self.conv4_1 = CBR(256, 512, 3, 1, 1)
            self.conv4_2 = CBR(512, 512, 3, 1, 1)
            self.conv4_3 = CBR(512, 512, 3, 1, 1)          
            self.pool4 = nn.MaxPool2d(2, stride=2, ceil_mode=True)   
    
            # Score pool4
            self.score_pool4_fr = nn.Conv2d(512,
                                            num_classes, 
                                            kernel_size=1,
                                            stride=1,
                                            padding=0)
    
            # conv5
            self.conv5_1 = CBR(512, 512, 3, 1, 1)
            self.conv5_2 = CBR(512, 512, 3, 1, 1)
            self.conv5_3 = CBR(512, 512, 3, 1, 1)
            self.pool5 = nn.MaxPool2d(2, stride=2, ceil_mode=True)
    
            # fc6
            self.fc6 = nn.Conv2d(512, 4096, 1)
            self.relu6 = nn.ReLU(inplace=True)
            self.drop6 = nn.Dropout2d()
    
            # fc7
            self.fc7 = nn.Conv2d(4096, 4096, 1)
            self.relu7 = nn.ReLU(inplace=True)
            self.drop7 = nn.Dropout2d()
    
            # Score
            self.score_fr = nn.Conv2d(4096, num_classes, kernel_size=1)
    
            # Upscore2 using deconv
            self.upscore2 = nn.ConvTranspose2d(num_classes,
                                                num_classes,
                                                kernel_size=4,
                                                stride=2,
                                                padding=1)
            
            # UpScore2_pool4 using deconv
            self.upscore2_pool4 = nn.ConvTranspose2d(num_classes, 
                                                     num_classes, 
                                                     kernel_size=4,
                                                     stride=2,
                                                     padding=1)
    
            # UpScore8 using deconv
            self.upscore8 = nn.ConvTranspose2d(num_classes, 
                                               num_classes,
                                               kernel_size=16,
                                               stride=8,
                                               padding=4)
    
    
        def forward(self, x):
        
            h = self.conv1_1(x)
            h = self.conv1_2(h)
            h = self.pool1(h)
    
            h = self.conv2_1(h)
            h = self.conv2_2(h)
            h = self.pool2(h)
    
            h = self.conv3_1(h)
            h = self.conv3_2(h)
            h = self.conv3_3(h)        
            pool3 = h = self.pool3(h)
    
            # Score
            score_pool3c = self.score_pool3_fr(pool3)
    
            h = self.conv4_1(h)
            h = self.conv4_2(h)
            h = self.conv4_3(h)        
            pool4 = h = self.pool4(h)
            
            # Score
            score_pool4c = self.score_pool4_fr(pool4) 
    
            h = self.conv5_1(h)
            h = self.conv5_2(h)
            h = self.conv5_3(h)        
            h = self.pool5(h)
    
            h = self.fc6(h)
            h = self.drop6(h)
    
            h = self.fc7(h)
            h = self.drop7(h)
    
            h = self.score_fr(h)
    
            # Up Score I
            upscore2 = self.upscore2(h)
    
            # Sum I
            h = upscore2 + score_pool4c
    
            # Up Score II
            upscore2_pool4c = self.upscore2_pool4(h)
            
            # Sum II
            h = upscore2_pool4c + score_pool3c
            
            # Up Score III
            upscore8 = self.upscore8(h)
            
            return upscore8

10.20

1. 강의 듣기 & 정리

  • FCN의 한계를 극복한 모델들 Ⅰ
  • FCN의 한계를 극복한 모델들 Ⅱ

2. Special Mission

  • DeconvNet / DilatedNet / SegNet / DeepLabV1 구현

3. Models에 fcn 모델 추가

 

GitHub - Tramac/awesome-semantic-segmentation-pytorch: Semantic Segmentation on PyTorch (include FCN, PSPNet, Deeplabv3, Deeplab

Semantic Segmentation on PyTorch (include FCN, PSPNet, Deeplabv3, Deeplabv3+, DANet, DenseASPP, BiSeNet, EncNet, DUNet, ICNet, ENet, OCNet, CCNet, PSANet, CGNet, ESPNet, LEDNet, DFANet) - GitHub - ...

github.com


10.21

1. 강의 듣기 & 정리

  • High Performance를 자랑하는 U-Net 계열의 모델들
  • Semantic Segmentation 대회에서 사용하는 방법들 1

2. Special Mission

  • DeepLabV2 / DeepLabV3 / DeepLabV3+ 구현

3. K-fold 구현

  • straitified k fold(class 개수 균등하게 split) 구현
  • k개의 train, valid용 annotation file 생성 코드 작성
  • object detection 때 사용했던 코드를 segmentation 용으로 바꾸고, parser 추가(K, seed)

4. Inference

  • vgg-FCN 훈련 모델 inference 해보려고 했으나, parser_config 형식과 맞춰야해서 못 함

10.22

1. 강의 듣기 & 정리

  • Semantic Segmentation 대회에서 사용하는 방법들 2

2. Special Mission

  • Unet / Unet++ 구현

3. K-fold용 train, validation set 분할된 json 파일 사용시 Key error 발생

  • k를 5로 하여 train, valid set을 5 set을 만들었을 때 각각 없는 image index에 대한 key error 발생
  • image index를 0부터 맞춰주고 해당 이미지에 대한 annotation 의 image_id도 바뀐 index에 맞게 바꿔 주는 함수 구현하여 json 파일 저장 전에 실행

 

 

 

댓글