Boostcamper's TIL (15)


Segmentation

  • FCNの限界とSkip-Connectionを採用した機種
  • 受信領域を拡張した型番
  • 1.FCNの限界


    1)オブジェクトのサイズが大きすぎるか小さすぎると予測できません


  • の大対象に対しては,地域情報だけではその全体像を予測できない.
  • のようなオブジェクトであっても、
  • とは異なるタグを付ける.
  • 小オブジェクトは、
  • を無視する場合がある.

    2)ディテール消失の問題

  • Deコンボリューションの手順は簡単すぎて、境界を学ぶのが難しい(exFCN-32 s、16 s、8 sは依然として簡単)
  • 2. FC DenseNet, Unet


    1) Skip Connection?


  • ResNetは、前のレイヤの出力をスキップして入力として第2のレイヤに提供するアイデアを提供します.
  • 層間の勾配ストリームは、深いネットワーク構成
  • をサポートする.

    2) FC DenseNet?


  • エンコーダからDecoderへのSkip接続
  • Dense BlockにもSkip接続
  • が適用する.

    3) Unet?


  • FC DenseNetと同様に、Skip接続はEncoder部分からDecoder部分へ
  • 対称的に各層にSkip接続
  • を適用する.

    3. DeepLab v1, DilatedNet


    Receptive Fieldを拡張することで性能を向上させるモデル.

    1) Receptive field?

  • Receptiveフィールドは、ニューロンが注目する情報
  • を含む.
  • 受信ドメインがより広い範囲の情報を含む予測がより高い
  • .
  • イメージの大部分の領域はバスであるが、より小さな受信ドメインモデルはバスの一部を報告するだけで
  • を予測することができる.
  • はバスに関するすべての情報を含んでおらず、窓の自転車や他の対象とされている
  • セグメントタスクの予測精度を向上させるためには,受入野
  • を増やす必要がある.

    Receptive Fieldを向上させる方法1

  • Convolution、Max Poyoungを繰り返し使用すると、感受野が広がります
    ->Resolutionの観点から見ると
  • は低特徴解像度の問題がある

    リカバリ範囲を向上させる方法2

  • 画像サイズの減少は多くなく、パラメータは変わらず、受信領域のみを拡張する

  • フィルタが入力データ上で演算を行う場合、
  • を含む演算範囲をより広くすることができる.
  • 高解像度
  • パラメータは、既存の3 x 3ボリュームと同様に、受信領域
  • のみを拡張する.

    2) DeepLab v1?

  • 変換率を設定したConvolution Layerにより受信領域の
  • モデルを拡張

    3) Architecture(DeepLab-LargeFOV)


  • Convは、Conv 2 dとReLUからなる
  • def conv_relu(in_channels, out_channels, kernel_size=3, rate=1):
      return nn.Sequential(nn.Conv2d(in_channels, out_channels, kernel_size, stride=1, padding=rate, dilation=rate) # padding과 dilation을 같게
  • conv1
  • self.features1 = nn.Sequential(
      conv_relu(3, 64, 3, 1),
      conv_relu(64, 64, 3, 1),
      nn.PaxPool2d(3, streide=2, padding=1) # 2x2 -> 3x3으로 변경, 입력이미지 1/2
    )
  • conv2
  • self.features2 = nn.Sequential(
      conv_relu(64, 128, 3, 1),
      conv_relu(128, 128, 3, 1),
      nn.PaxPool2d(3, streide=2, padding=1) # 입력이미지 1/4
    )
  • conv3
  • self.features3 = nn.Sequential(
      conv_relu(128, 256, 3, 1),
      conv_relu(256, 256, 3, 1),
      conv_relu(256, 256, 3, 1),
      nn.PaxPool2d(3, streide=2, padding=1) # 입력이미지 1/8
    )
  • conv4
  • self.features4 = nn.Sequential(
      conv_relu(256, 512, 3, 1),
      conv_relu(512, 512, 3, 1),
      conv_relu(512, 512, 3, 1),
      nn.PaxPool2d(3, streide=1, padding=1) # 이미지 사이즈 고정
    )
  • conv5
  • self.features5 = nn.Sequential(
      conv_relu(512, 512, 3, rate=2),
      conv_relu(512, 512, 3, rate=2),
      conv_relu(512, 512, 3, rate=2),
      nn.PaxPool2d(3, streide=1, padding=1),
      nn.AvgPool2d(3, stride=1, padding=1) # 마지막 두 layer 크기 고정
    )
  • FC6 ~ Score
  • self.classifier = nn.Sequential(
      conv_relu(512, 1024, 3, rate=12),
      nn.Dropout2d(0.5),
      conv_relu(1204, 1024, 1, 1),
      nn.Dropout2d(0.5),
      nn.Conv2d(1024, num_classes, 1)
    )
  • Up Sampling
    Bi-linear Interpolationリカバリサイズ
  • class DeepLabV1(nn.Module):
      def __init__(self, backbone, classifier, upsampling=8):
        super(DeepLabV1, self).__init__()
        self.bacbone = backbone
        self.classifier = classifier
        self.upsampling = upsampling
        
      def forward(self, x):
        x = self.backbone(x) # conv1~conv5
        _, _, feature_map_h, feature_map_w = x.size()
        x = self.classifier(x)
        x= torch.nn.F.interpolate(x, size=(feature_map_h * self.upsampling, feature_map_w * self.upsampling), mode="bilinear")

    4) Bilinear Interpolation?


  • 内紛を用いてUp Samplengを行う方法
  • 結果は、
  • alignコーナーオプションによって異なる場合があります.
  • 二重線形Interpolationは画素単位の正確なパーティション
  • をサポートしない.

    5) Dense CRF(Conditional Random Field)


  • 二重線形Interpolationは、画素単位で正確なパーティション化ができないため、後処理技術
  • を採用している.
  • セグメントが完了すると、算出された確率と画像がCRFに入力される
    色が近いピクセルが同じカテゴリにある場合
    色が似ているが画素から遠い場合、同じカテゴリ
  • には属さない.
    反復アプリケーション
  • 複数回
  • 各画素は最も確率の高いカテゴリのみを選択し、最終結果は
  • である.

    6) DelatedNet?



  • conv 4とconv 5からMaxPoolとAvgPoolを削除

  • 二重線形Interpolationを使用して元の寸法を回復し、アップグレードする必要はなく、Deボリュームを使用して元の寸法を回復する.

  • conv4
  • self.features4 = nn.Sequential(
      conv_relu(256, 512, 3, 1),
      conv_relu(512, 512, 3, 1),
      conv_relu(512, 512, 3, 1),
    )
  • conv5
  • self.features5 = nn.Sequential(
      conv_relu(512, 512, 3, rate=2),
      conv_relu(512, 512, 3, rate=2),
      conv_relu(512, 512, 3, rate=2),
    )
  • Up Sampling(Deconv)
  • class DilatedNetFron(nn.Module):
      def __init__(self, backbone, classifier):
        super(DilatedNetFront, self).__init__()
        self.backbone = backbone
        self.classifier = classifier
        
        # deconv
        self.deconv = nn.ConvTranspose2d(in_channels=11,
                                         out_channels=11,
                                         kernel_size=16,
                                         stride=8,
                                         padding=4)
      
      def forward(self, x):
        x = self.backbone(x)
        x = self.classifier(x)
        out = self.deconv(x)
        return out
    7) DilatedNet(Front + Basic Context module)
  • Up Samplingの前に複数の拡張された畳み込み層
  • を使用することにより、
  • は、様々なサイズの受信フィールドを介して情報
  • を得る.
    class BasicContextModule(nn.Module):
      def __init__(self, num_classes):
        super(BasicContextModule, self).__init__()
        
        self.layer1 = nn.Sequential(conv_relu(num_classes, num_classes, 3, 1))
        self.layer2 = nn.Sequential(conv_relu(num_classes, num_classes, 3, 1))
        self.layer3 = nn.Sequential(conv_relu(num_classes, num_classes, 3, 2))
        self.layer4 = nn.Sequential(conv_relu(num_classes, num_classes, 3, 4))
        self.layer5 = nn.Sequential(conv_relu(num_classes, num_classes, 3, 8))
        self.layer6 = nn.Sequential(conv_relu(num_classes, num_classes, 3, 16))
        self.layer7 = nn.Sequential(conv_relu(num_classes, num_classes, 3, 1))
        self.layer8 = nn.Sequential(conv_relu(num_classes, num_classes, 3, 1))

    4. Implementation


    5. Reference


    https://arxiv.org/abs/1505.04366 ("Learning Deconvolution Network for Semantic Segmentation")
    https://arxiv.org/abs/1611.09326 ("The One Hundred Layers Tiramisu: Fully Convolutional DenseNets for Semantic Segmentation")
    https://arxiv.org/abs/1505.04597 ("U-Net: Convolutional Networks for Biomedical Image Segmentation")
    https://arxiv.org/abs/1606.00915 ("DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs")