【Detection】Bottleneck Transformers for Visual Recognition



Bottleneck Transformers

1. Conclusion, Abstract

image-20210325120118016

  • self-attention(MHSA) 모듈을 사용하는 backbone을 만들었다. 그것들을 사용해서 몇가지 task에서 성능향상을 가져왔다. 미래에 추천하는 연구로는 (1) self-attention for self-supervised (2) combining botNet backbone with DETR (3) smalll object detection 와 같은 연구들이 있다.
  • ResNet 에서 일반적은 Conv2d(= spatial convolution) 연산을 global self-attention으로 바꾼것이 전부이다. 이렇게 만든 backbone을 사용함으로써 성능 향상, (상대적인?) 파라미터 감소, 연산 시간 증가 등의 효과를 볼 수 있었다.
  • Result : Mask R-CNN 44.4 Mask AP on COCO / BoTNet for image classification 84.7% top-1 accuracy on ImageNet

2. Instruction, Relative work

image-20210325120222270

image-20210325120200529

  • Related Work에서는 (1) Transformer vs BoTNet; (2) DETR vs BoTNet; (3) Non-Local vs BoTNet 에 대한 비교를 한다. 이 비교에 대한 정리는 아래에 블로그 정리 부분에 추가해 놓았으니 거기서 참고할 것

3. Method

  • BoTNet은 아주 심플하게 만들여졌다. 맨위의 표처럼 resnet의 c5의 3x3 conv를 global (all2all) self-attention over a 2D featuremap을 수행하는 MHSA으로 바꾼것이 전부이다.
  • In BoTNet, the 2D relative position self-attention [51, 2] 을 사용했다. (absolute, relative position embeding에 대한 차이를 아직 모르겠다. 이 차이를 알기 위해서 코드를 확인해봤짐나)

4. Experiments & Results

  • 여기에서 나오는 4.1 ~ 4.8 까지, 지금까지 실험해본 결과(= the benefits of BoTNet for instance segmentation and object detection )를 요약해놓는 식으로 논문을 정리해보았다. 하나하나씩 간력하게 살펴보고 넘어가자
  1. BoTNet improves over ResNet on COCO Instance Segmentation with Mask R-CNN
    image-20210325124234077
    • multi-scale jitter 란, 이미지를 자유자제로 scaling하는 것이다. 예를들어, Input Image : 1024x1024 / multi-scale jitter : [0.8, 125] 조건에서는 이미지를 820~1280 크기로 이미지로 scaling 한다.
  2. Scale Jitter helps BoTNet more than ResNet
    • multi-scale jitter의 범위를 심하게 하면 할 수록 더 높은 성능향상을 가져다 주었다.
  3. Relative Position Encodings Boost Performance
    • image-20210325124348428
  4. Why replace all three c5 spatial convolutions?
    image-20210325124422713
  5. BoTNet improves backbones in ResNet Family
  6. BoTNet scales well with larger images (1024보다 1280 크기에 이미지에 multi-scale-jitter 심하게 주고 학습시키면 더 좋은 성능이 나온다.)
  7. Non-Local Neural Networks 보다 훨씬 좋은 성능이 나온다.
    • 이것을 보면, 버클리와 구글에서 이미지 처리에 가장 좋은 MHSA 구조를 사용하는 방법에 대해서 많은 실험을 해서 나온 결과가 BoTNet이라는 것을 짐작할 수 있다. MHSA를 그냥 사용하는 게 아니라, BottleNet구조로 바꿔고, BottleNet Transformer라는 새로운 Block을 만들고 이름까지 명명해버렸다. (이미지 처리를 위해서 가장 완벽하게 Transformer를 사용하는 구조를 많은 실험을 통해 최종적으로 찾아낸 BottleNet Transformer 이라고 말할 수도 있을 것 같다.)
  8. Image Classification on ImageNet
    image-20210325125140525


블로그 내용 정리

  • 블로그 링크 : https://sanghyeok.tistory.com/5

  • BoT와 vanilla transformer간의 차이

     transformerBoTNet
    Normalizationlayer normalizationBatch normalization (ResNet처럼 그대로)
    Non-LinearitiesFFN block에서 1개의 non-linearity3개의 non-linearities
    Output projectionoutput projection(?) 있음없음
    OptimizerAdamSGD with momentum
  • DETR과 BoTNet과의 차이점

     DETRBoTNet
     outside(after) the backbonebackbone내부에 Transformer같은 block 삽입/대체
     RPN그리고 NMS 제거를 목적으로 함recognition의 많은 task에서 적용가능
      visibly good gains on small objects (상대적 작은객체 탐지 더 좋음)
  • NL(Non-Local)Net과 BoTNet의 차이점

     NL(Non-Local)NetBoTNet
    channel reduction ration24
    Role네트워크에 추가로 삽입convolutional block을 대체
    또 다른 차이점 (1) multiple head(2) value projection(3) posutuib encodings
  • Method

    • ResNet의 가장 마지막 c5 stage에서 마지막 3개의 saptial convolution = conv2d을 모두 MHSA로 대체한다. 단, c5 stage는 stride 2가 적용된 conv연산이 있음으로, 똑같이 MHSA를 하기 전에 2x2 average pooling을 수행한다.
    • 2D relative position encoding 를 사용했다. figure4에서 확인 할 수 있다.
    • 논문에서는 ResNet구조를 바꾸는 것만 보여주지 않고, BoTNet의 영향력을 보여주고자 노력했다. Detection 또는 Segmentation에서도 좋은 성능을 확인할 수 있었다.
  • Experiments

    • 여러 논문에서 Vision Transformer에서 hard augmentation이 성능 향상에 도움을 준다고 이야기 하고 있다.
    • 여기서도 강한 multi-scale jitter기법을 적용해서 (적은 epoch으로) 더 빠른 성능 수렴 을 얻었다고 한다.
    • content-content interaction = self attentioncontent-position interaction = position encoding이 성능에 영향을 미치는 정도를 비교하였다. position encoding이 영향을 미치는 정도가 더 컸으며 둘을 함께 사용했을 때가 성능이 가장 좋았다.
    • absolute position encodingrelative encoding에 비해 성능이 좋지 않았다.

Code 참조

  1. absolute positional embeding

    class AbsPosEmb(nn.Module):
        def __init__(
            self,
            fmap_size,
            dim_head
        ):
            super().__init__()
            height, width = pair(fmap_size)
            scale = dim_head ** -0.5
            self.height = nn.Parameter(torch.randn(height, dim_head) * scale)
            self.width = nn.Parameter(torch.randn(width, dim_head) * scale)
       
        def forward(self, q):
            """
    		from einops import rearrange 
    		에 의해서 만들어진 rearragne 함수 어려워 보이지만 어렵지 않다. 
    		처음 원본의 shape -> 내가 바꾸고 싶은 shape 
    		로 쉽게 shape를 변형할 수 있다.
            """
            emb = rearrange(self.height, 'h d -> h () d') + rearrange(self.width, 'w d -> () w d')
            # 1*h +(element wise sume) 1*w = h*w ?! 브로드 케스팅에 의해서 연산된 결과이다 
            emb = rearrange(emb, ' h w d -> (h w) d')
            # from torch import nn, einsum = element wise sum (multiple은 그냥 * 곱 연산)
            logits = einsum('b h i d, j d -> b h i j', q, emb) 
            return logits
    
  2. relative positional embeding (stand-alone attention 논문에서 나오는 것이라 한다. 아직은 아래 코드가 무슨 행동을 하는지 이해 안 함 = 코드도 복잡하고 논문도 복잡하니 필요하면 그냥 가져와서 사용해야겠다. Axial deeplab에서 추천하는 논문들 (stand-alone, Position-Sensitivity 논문이 이에 관한 좋은 코드 정보로 제공해줄 것 같다.) ㄷ

    class RelPosEmb(nn.Module):
        def __init__(
            self,
            fmap_size,
            dim_head
        ):
            super().__init__()
            height, width = pair(fmap_size)
            scale = dim_head ** -0.5
            self.fmap_size = fmap_size
            self.rel_height = nn.Parameter(torch.randn(height * 2 - 1, dim_head) * scale)
            self.rel_width = nn.Parameter(torch.randn(width * 2 - 1, dim_head) * scale)
       
        def forward(self, q):
            h, w = self.fmap_size
       
            q = rearrange(q, 'b h (x y) d -> b h x y d', x = h, y = w)
            rel_logits_w = relative_logits_1d(q, self.rel_width)
            rel_logits_w = rearrange(rel_logits_w, 'b h x i y j-> b h (x y) (i j)')
       
            q = rearrange(q, 'b h x y d -> b h y x d')
            rel_logits_h = relative_logits_1d(q, self.rel_height)
            rel_logits_h = rearrange(rel_logits_h, 'b h x i y j -> b h (y x) (j i)')
            return rel_logits_w + rel_logits_h
    
    • 확실하게는 이해 안되지만,
      absolute positional embeding는 각 query(1xd)에 대해서 그냥 절대적인 하나의 1xd positional embeding을 element wise sum 해준것이다.
      relative positional embeding은 각 query(1xd)에 대해서, 각 query(1xd)가 전체 key에 대해서 상대적으로, 어디에 위치하는지에 대한 정보를 가지고(=input사이에 pair-wise relationship을 고려) positional embeding 값을 만드는 것 인것 같다. (아래 그림은 stand-alone attention 논문 참조)
      image-20210325123015842

【Se-Segmen】Rethinking Semantic Segmentation with Transformers

Rethinking Semantic Segmentation

1. Conclusion, Abstract

  • sequence-to-sequence prediction framework를 사용해서 Semantic Segmentation을 수행해 보았다.
  • 기존의 FCN들은
    • Encoder, Decoder 구조를 차용한다. CNN을 통과하면서 resolution을 줄이고 abstract/semantic visual concept을 추출한다.
    • receptive field를 넓히기 위해서 dilated convolutions and attention modules 를 사용했다.
  • 하지만 우리는 global context 를 학습하기 위해 (= receptive field를 넓히기 위해서) every stage of feature learning에서 Transformer 를 사용했다. pure transformer (without convolution and resolution reduction)
  • (Panoptic deeplab 처럼) 엄청나게 복잡한 구조를 사용하지 않고, decoder designs을 사용해서 강력한 segmentation models = SEgmentation TRansformer (SETR) 을 만들었다.
  • Dataset에 따른 결과 : ADE20K (50.28% mIoU), Pascal Context (55.83% mIoU), ADE20K test server(1 st, 44.42% mIoU)

3. Method

image-20210319132539937

  • 위의 이미지는 아래의 것에 대한 이미지 이다.
    • (맨왼쪽) Transformer layer
    • Image (transformer) Encoder
    • (오른쪽 위) 두번째 Decoder : SETR-PUP
    • (오른쪽 아래) 세번째 Decoder : SETR-MLA
    • 첫번쨰 Decoder인 Naive에 대한 이미지는 없다.

3.1. FCN-based semantic segmentation

  • About receptive field
    • typically 3×3 conv를 사용하는 layer를 deep하게 쌓으면서 linearly하게 receptive field를 증가시킨다.
    • 결과적으로, 높은 layer에서 더 큰 receptive fields를 가지게 되서 layer depth dependency가 생기게 된다.
    • 하지만 layer를 증가시킴으로써 얻는 benefits에는 한계가 있고, 특히 특정 layer이상으로 가면 그 benefits가 빠르게 감소하는 형상을 볼 수 있다.
    • 따라서, 제한적인 receptive fields (for context modeling)가 FCN의 본질적인 한계라고 할 수 있다.
  • Combination of FCN with attention mechanism
    • 하지만 이런 attention mechanism는 quadratic complexity 때문에 higher layers with smaller input sizes 를 가져야한다는 한계점이 존재한다.
    • 이로 인해, 전체 모델은 lower-level feature만이 가지고 있는 정보들을 learning하지 못하게 된다.
    • 이러한 한계점을 극복하게 위해서, 우리의 모델은 pure self-attention based encoder를 전적으로 사용하였다.

3.2. Segmentation transformers (SETR)

  • Image to sequence
    1. image sequentialization : flatten the image pixel -> 총 1D vector with size of 3HW 가 만들어진다.
    2. 하지만 a typical image가 480(H) × 480(W) × 3 = 691,200 차원의 1차원 백터이다. 이것은 너무 high-dimensional vector이므로 handle하기가 쉽지 않다. 따라서 transformer layer에 들어가기 전에, tokenizing (to every single pixel) 할 필요가 있다.
    3. FCN에서는 H×W×3 이미지를 FCN encoder에 통과시켜서, H/16 × W/16 ×C 의 feature map을 뽑아 낸다. 이와 같은 관점으로 우리도 transformer input으로는 H/16 × W/16 (백터 갯수) x C(백터 차원) 으로 사용하기로 했다.
    4. 우리는 FCN의 encoder를 사용하는게 아니라 fully connected layer (linear projection function)을 사용해서 tokenizing을 한다.
    5. 이미지를 가로 16등분, 세로 16등분을 해서 총 256개의 이미지 patchs를 얻어낸다. 그리고 이것을 flatten하면, HW/256 (백터 갯수) x C*(백터 차원) 를 얻을 수 있고, 이것을 linear projection function를 사용해서 HW/256 (=L: 백터 갯수) x C(백터 차원 < C*) 의 patch embeddings 결과를 뽑아 낸다.
    6. positional embeding : specific embedding p_i를 학습한다. i는 1~L개가 존재하고 차원은 C이다. 따라서 Transformer layer에 들어가기 전 final sequence input E = {e1 + p1, e2 + p2, · · · , eL + pL} 가 된다. 여기서 e는 patch embeding 결과 그리고 p는 positional emdeing 값이다.
  • Transformer
    • a pure transformer based encoder
      image-20210319140800325
    • 여기서 말하는 transformer layer는 위 이미지 가장 왼쪽의 Block 하나를 의미한다. 이것을 24개 쓴다.
    • 즉 Transformer layer를 통과하고 나온 output 하나하나가 Z_m 이다.

3.3. Decoder designs

  1. three different decoder를 사용했다. 1. Naive upsampling (Naive) 2. Progressive UPsampling (PUP) 3. Multi-Level feature Aggregation (MLA)
  2. 이 decoder의 목표는 pixel-level segmentation을 수행하는 것이다. Decoder에 들어가기 전에, HW/256(갯수) × C(차원) 의 feature를 H/16 × W/16 ×C로 reshape하는 과정은 필수적이다.
  3. ` Naive upsampling (Naive)`
    • simple 2-layer network (1 × 1 conv + sync batch norm (w/ ReLU) + 1 × 1 conv )를 사용해서 #class의 수를 가지는 channel로 만든다.
    • 그리고 간단하게 bilinearly upsample을 사용하여 가로세로 16배를 하여 full image resolution을 만들어 낸다.
    • 그리고 pixel-wise cross-entropy loss 를 사용해서 pixel-level classification을 수행한다.
  4. Progressive UPsampling (PUP)
    • 쵀대한 adversarial effect (어떤 작업을 해서 생기는 역효과) 를 방지하기 위해서, 한방에 16배를 하지 않는다.
    • 2배 upsampling 하는 작업을 4번을 수행한다.
    • 이 작업에 대한 그림은 Figure 1(b)에 있고, progressive(순차적인, 진보적인) upsampling 으로써 SETR-PUP 이라고 명명했다.
  5. Multi-Level feature Aggregation (MLA)
    • feature pyramid network와 비슷한 정신으로 적용하였다.
    • 물론 pyramid shape resolution을 가지는 것이 아니라, FPN와는 다르게 every SETR’s encoder transformer layer는 같은 resolution을 공유한다.
    • Figure 1(c) 와 같이, {Z_m} (m ∈ { L_e/M , 2*L_e/M , · · · , M*L_e/M }) 를 사용한다. 이미지에 나와있는 것과 같이, 다음의 과정을 수행한다. (1) reshape (2) ` top-down aggregation via element-wise addition (3) channel-wise concatenation`

4. Experiments

  • Dataset : Cityscapes, ADE20K, PASCAL Context
  • Implementation details
    1. public code-base mmsegmentation [40],
    2. data augmentation : random resize with ratio between 0.5 and 2, random cropping, random horizontal flipping
    3. training schedule : iteration to 160,000 and 80,000, batch size 8 and 16
    4. polynomial learning rate decay schedule [60, 이건뭔지 모르겠으니 필요하면 논문 참조], SGD as the optimizer
    5. Momentum and weight decay are set to 0.9 and 0
    6. learning rate 0.001 on ADE20K, and 0.01 on Cityscapes
  • Auxiliary loss
    1. auxiliary losses at different Transformer layers
    2. SETRNaive (Z_10, Z_15, Z_20)
    3. SETR-PUP (Z_10, Z_15, Z_20, Z_24)
    4. SETR-MLA (Z_6 , Z_12, Z_18, Z_24)
    5. 이렇게 각 layer에서 나오는output을 새로 만든 decoder에 넣고 나오는 결과와 GT를 비교해서 Auxiliary loss의 backpropagation를 수행한다.
    6. 당연히 이후의 각 dataset 당 사용하는 Evaluation metric을 사용해서 main loss heads에 대한 학습도 수행한다.
  • Baselines for fair comparison
    1. dilated FCN [37] and Semantic FPN [28]
  • Multi-scale test
    1. the default settings of mmsegmentation [40] 를 사용했다.
    2. 일단, uniform size 의 input Image를 사용한다.
    3. scaling factor (0.5, 0.75, 1.0, 1.25, 1.5, 1.75)를 이용하여, Multi-scale scaling and random horizontal flip 을 수행한다.
    4. 그리고 test를 위해서 Sliding window를 사용했다고 하는데, 이게 뭔소리인지 모르겠다. (?)
  • SETR variants
    1. encoder “T-Small” and “T-Large” with 12 and 24 layers respectively.
      image-20210319150947438
    2. SETR-Hybrid 는 ResNet-50 based FCN encoder 를 사용해서 뽑은 Feature map을 Transformer input으로 사용하는 모델이다. 이후에 언급하는 SETR-Hybrid는 ResNet50 and SETR-Naive-S 를 의미하는 것이다.
  • Pre-training
    1. the pre-trained weights provided by [17, ViT]
  • Evaluation metric
    1. cityscape : mIoU 사용
    2. ADE20K : additionally pixel-wise accuracy 까지 사용한 loss

5. Results

  • Ablation Studies
    image-20210319152013916

  • SOTA comparision
    image-20210319151946197

【Pa-Segmen】Axial-DeepLab - Stand-Alone Axial-Attention

Axial-DeepLab

1. Conclusion, Abstract

  • position-sensitive + axial attention, without cost이 Classification과 Segmentation에서 얼마나 효율적인지를 보여주었다.
  • Convolution은 global long range context를 놓치는 대신에 locality attention을 효율적으로 처리해왔다. 그래서 최근 work들은, local attention을 제한하고, fully attention, global relativity 을 추가하는 self-attention layer 사용해왔다.
  • 우리는 fully, stand-alone + axial attention은 2D self-attention을 1D self-attention x 2개로 분해하여 만들어 진 self-attention 모듈이다. 이로써 large & global receptive field를 획득하고, complexity를 낮추고, 높은 성능을 획득할 수 있었다.
  • introduction, Related Work는 일단 패스

3. Method

  • Key Order :
    1. stand-alone Axial-ResNet
    2. position-sensitive self-attention
    3. axial-attention
    4. Axial-DeepLab

3.1 Self-attention mechanism

image-20210316125155549

  1. 여기서 N은 모든 이미지 픽셀(HxW)
  2. 장점 : non-local context 를 보는것이 아니라, related context in the whole feature map 을 바라본다. conv가 local relations만을 capture하는 것과는 반대이다.
  3. 단점
    • (단점 1) extremely expensive to compute O(h^2*w^2 = hw(query) x hw(key))
    • (단점 2) (position embeding이 충분하지 않다) positional information를 사용하지 못한다. vision task에서 spatial structure(이게 이미지의 어느 위치 인지)를 capture하고 positional imformation 을 사용하는 것이 매우 중요하다.

3.2 stand-alone(독립형) self attention

image-20210316130754895

  1. 위의 문제점을 해결하기 위해, 개발되었다. 모든 Feature map pixel을 key로 가져가지말고, query 주변의 MxM개만을 key로 사용한다. 이로써. computation 복잡도를 O(hw(query갯수) x m^2(key갯수) ) 까지 줄일 수 있다.
  2. 추가적으로, relative positional encoding을 주었다. 즉 query에 positional 정보를 주는 term을 추가한 것이다. 각 pixel(query)들은 주변 MxM공간을 receptive field로써 확장된 정보를 가지게 되고, 이 덕분에 softmax이후에 dynamic prior를 생산해낼 수 있다.
  3. qr 항이 추가되어, key(p) location에서 query(o) location까지의 양립성(compatibility)에 대한 정보가 추가되었다. 특히 r인 positional encodings는 heads끼리 각 r에 해당하는 parameter를 공유해서 사용하기 때문에, cost 증가가 그렇게 크지는 않다고 한다.
  4. 위의 계산 식은 one-head-attention이다. multi-head attention 를 사용해서 혼합된 affinities (query에 대한 key들과의 애매하고 복잡한 관계로, 인해 발생하는, 다양한 선호도)를 capture할 수 있다.
  5. 지금까지 transformer 모델들은 one-head에서 나온 결과를 y_o1이라고 하고, y_o 1~y_o 8 까지 8개의 head로 인해 나오는 결과를 sum했는데, 여기서는 concat을 한다. 따라서 이런 식이 완성된다. z_o = concatn(y_o n).

3.3 Position-Sensitivity self attention

image-20210316132829625

  1. (파랑 A) 위에서 query에게만 positional embeding을 해주었다. 여기서 저자는 ‘그렇다면 key에게도 해줘야하는거 아닌가?’ 라는 생각을 했다고 한다. 따라서 key에게도 previous positional bias를 주기 위해 key-dependent positional bias term을 추가해줬다.
  2. (파랑 B) y_o 또한 precise location정보를 가지면 좋겠다. 특히나 stand-alone을 사용하면 MxM (HW보다는 상대적으로) 작은 receptive fields를 사용하게 된다. 그렇기에 더더욱 value또한 (내생각. 이 MxM이 전체 이미지에서 어디인지를 알려줄 수 있는) precise spatial structures를 제공해줘야한다. 이것이 retrieve relative positions = r 이라고 할 수 있다.
  3. 위의 A와 B의 positional embeding 또한 across heads 사이에 parameter를 share하기 때문에 큰 cost 증가는 없다.
  4. 이렇게 해서 1. captures long range interactions 2. with precise positional information 3. reasonable computation overhead를 모두 가진 position-sensitive self-attention를 만들어 내었다.

3.4 Axial-Attention

image-20210316133850876

  1. 어찌보면, Stand-alone은 MxM만을 고려하니까, 이러한 receptive field가 local constraint로써, 단점으로 작용할 수 있다. 물론 global connection (HW 모두를 key로 사용하는 것)보다는 computational costs를 줄일 수 있어서 좋았다.
  2. Axial-attention의 시간 복잡도는 O(hw(query갯수) x m^2(key갯수=H or W) ) 이다. m에 제곱에 비례한 시간 복잡도를 가지고 있다.
  3. axial-attention를 이용해서
    • (장점1) global connection(=capture global information) 을 사용하고
    • (장점2) 각 query에 HW를 모두 key로 사용하는 것 보다는, efficient computation 을 획득한다. 위 그림과 같이 width-axis, height-axis 방향으로 2번 적용한다.

3.5 Axial-ResNet

image-20210316134729275

  • 별거 없고, residual bottleneck block 내부의 일부 conv연산을 Axial atention으로 대체한다.
  • 사실 위의 Fig2가 conv연산을 대체하는 Axial atention의 모습이다. 확실히 Input과 ouput의 shape가 같으므로, 어디든 쉽게 붙이고 때며 적용할 수 있는 것을 확인할 수 있다.
  • Full Axial-ResNet : simply stack three axial-attention bottleneck blocks. 즉 residual block의 전체 conv를 Axial atention으로 대체하여 사용하는 것이다.

3.6 Axial-DeepLab:

  1. Panoptic-DeepLab이란? : 각 Final head는 (1) semantic segmentation (2) class-agnostic instance segmentation 결과를 생성해 내고, 이 결과들을 majority voting 기법을 이용해서 merge 하는 방법론이다. Panoptic-DeepLab논문 참조.
  2. DeepLab에서 stride를 변경하고 atrous rates를 사용해서 dense feature maps을 뽑아내었다. 우리는 axial-attention을 사용함으로써 충분한 global information을 뽑아내기 때문에, ‘atrous’ attention (?)을 사용하지 않았고, stride of the last stage (?)를 제거했다고 한다.
  3. 같은 이유로, global information은 충분하기 때문에, atrous spatial pyramid pooling module를 사용하지 않았다.
  4. extremely large inputs 에 대해서는 m = 65을 가지는 mxm주변의 영역에 대해서만 axial-attention blocks 을 적용했다. (? 정확하게 맞는지 모르겠다)

4. Experimental Results

  • 사실 이 이후로는 논문 안 읽었다. 필요하면 찾아 읽자.
  • image-20210316140108690


youtube 내용 정리

  1. Intro & Overview
    • transformer가 NLP에서 LSTM을 대체한 것 처럼, Image process에서도 convolution을 대체할 것이다. 이러한 방향으로 가는 step이 이 논문이라고 할 수 있다.
  2. From Convolution to Self-Attention for Images
    1. https://www.youtube.com/watch?v=hv3UO3G0Ofo&t=380s
  3. Learned Positional Embeddings
  4. Propagating Positional Embeddings through Layers
  5. Traditional vs Position-Augmented Attention
  6. Axial Attention
  7. Replacing Convolutions in ResNet
  8. Experimental Results & Examples

【Self】Self-training with Noisy Student improves ImageNet classification

Self-training with Noisy Student

1. Conclusion, Abstract

  1. 과거의 기법들이, ImageNet에서의 성능 향상을 위해서, 수십억장의 web-scale extra labeled images와 같은 많은 weakly labeled Instagram images 이 필요한 weakly-supervised learning 을 수행했었다.
  2. 하지만 우리는 unlabeled images을 사용함으로써, 상당한 성능향상을 얻어내었다. 즉 the student에게 Nosie를 추가해 줌으로써, 성능향상을 이루는, self-training = Noisy Student Training = semi-supervised learning 기법을 사용하였다.
  3. EfficientNet에 Noisy Student Training를 적용함으로써 accuracy improvement와 robustness boost를 획득했다.
  4. 전체 과정은 다음과 같다. (아래 그림과 함께 참조)
    1. 우선 Labeled Image를 가지고 EfficientNet Model(E)을 학습시킨다.
    2. E를 Teacher로 사용하여, 가지고 300M개의 unlabeled images에 대해서, Pseudo labels를 생성한다. (self-training 을 하고 있다고 볼 수 있고, Soft (a continuous distribution) or Hard (a one-hot distribution) 둘 다 될 수 있다.)
    3. larger EfficientNet를 student model로 간주하고, labeld + sseudo labeld images를 사용해 학습시킨다.
    4. student의 학습을 진행하는 동안, dropout[76], stochastic depth[37], RandAugment data augmentation[18] 와 같은 noise를 주입한다.
    5. teacher보다 더 똑똑한 student가 탄생한다!

image-20210313180644542


2. Noisy Student Training

[ 참고 블로그 내용 정리 ]

  1. Knowledge Distillation 기법과 차이점을 다시 고려해보면, Knowledge Distillation에서는 Teacher보다 작은 Size(complexity)의 Student Model을 학습시킨다. 그리고 Student에서도 Labeled dataset만 사용해 학습시킨다.
  2. Fix train-test resolution discrepancy 기법 : 이 기법은 먼저 첫 350 epoch 동안에는 이미지를 작은 resolution으로 학습시킨다. 그리고 1.5 epoch 동안, 큰 resolution을 가지는 unaugmented labeled images 를 가지고 학습시키며 fine-tuning을 진행한다. (이 방법을 제안한 논문과 마찬가지로) fine-tuning하는 동안에 shallow layer(input에 가까운 Layer)는 freeze하여 학습시켰다고 한다.
  3. Iterative Training : 위의 알고리즘을 한단어로 표현하면, 반복학습(iterative training)이라고 할 수 있다. 처음에 EfficientNet-B7을 Teacher로 사용하고, 더 큰 모델의 student 모델이 L0, L1, L2가 된다. 그 전체 과정과 모델의 [파라메터 수, width, depth, resolution]는 아래와 같다.
    image-20210313182400236
  4. 결과
    • Noisy Student (L2)은 SOTA를 달성했고, 기존 SOTA보다 적은 Parameter를 보유한다. 그리고 Extra Data가 label이 아닌 unlabel이며 그 크기도 적다.
    • 모델의 신빙성과 Robustness를 측정하기 위해 Dan Hendrycks에 의해 제안된, ImageNet-C, ImageNet-P(blurring, fogging, rotation, scaling과 같은 대표적인 Corruption과 Perturbation 이용), ImageNet-A(Natural Image=자연 그 상태에서 찍은 사진. 단색 배경이나, 큰 객체가 아니라) 데이터 셋이 있다.
    • 위와 같은 Robustness 테스트에서도 좋은 성능을 보여주고 있고, Adversarial Attack에 대해서 얼마나 강건한지에 대한 실험 그래프(Figure 3)를 보더라도 좋은 robustness를 가지는 것을 확인할 수 있다. Noise에 학습된 데이터라서 그런지 확실히 EfficientNet보다 좋은 robustness를 보인다.
  5. Noisy Student Training
    • self-training 의 향상된 버전이라고 할 수 있다.
    • (noise를 사용하지 않고, Smaller student를 만드는) Knowledge Distillation 과는 다르다. 우리의 방법은 Knowledge Expansion이라고 할 수 있다.
    • Pseudo code의 Algorithm 위의 이미지에서 참고
  6. Noising Student (명석한 분석)
    • input noise로써 RandAugment를 사용했고, model noise로써 dropout [76] and stochastic depth [37] 을 사용했다. 이런 noise를 통해서, stduent가 Invariances, robustness, consistency 를 획득하게 된다. (특히 Adversarial Attack에 대해서도)
    • (First) data augmentation : teacher은 clean image를 보고 high-quality pseudo label을 생성할 때, Student는 augmented image를 봐야한다. 이를 통해서 student 모델은 비교적 정확한 label을 기준으로, consistency를 가질 수 있게 된다.
    • (Second) dropout & stochastic depth : teacher은 ensemble 처럼 행동한다. student는 single model 처럼 행동한다. student는 powerful ensemble model을 모방하는 꼴이라고 할 수 있다.
  7. Other Techniques
    1. data filtering : 초반에 (지금까지 봐온 (labeled) 이미지와는 조금 많이 다른) out-of-domain image 때문에 teacher모델에서도 low confidence를 가지는 image를 필터링 한다. (나중에 차차 학습한다.)
    2. balancing : labeled images에서 class에 따른 이미지 수와, unlabeled images에서 class에 따른 이미지 수를 맞춘다. (내 생각으로, labeled image에 별로 업는 class가 unlabeld image에 많으면 teacher의 pseudo label 자체가 불안정하기 때문에. 이러한 작업을 수행해준다.)
    3. soft or hard pseudo labels : out-of-domain unlabeled data 에 대해서 soft pseudo label이 좀 더 student 모델에게 도움이 되는 것을 경험적으로 확인했다. (예를들어, confident가 충분히 높지 않으면 soft pseudo labels를 사용하여 student 모델을 학습시키는 방식. )
  8. Comparisons with Existing SSL(self-supervised learning) Methods
    • SSL은 특정한 teacher 모델이 없다. 그냥 자기 자신이 teacher이자 student일 뿐이다. 이전의 모델(teacher)이 low accuracy and high entropy를 가졌다면, 새로운 모델(student) 또한 (Noise 까지 받으며) high entropy predictions 을 하게 만들 뿐이다.

3. Experiments

3.1Experiment Details

  • Labeled dataset : ImageNet, 2012 ILSVRC
  • Unlabeled dataset : JFT dataset (300M images) public dataset YFCC100M
  • data filtering and balancing
    • confidence of the label higher than 0.3. 각 클래스에 대해서, 그 중에서 높은 confidence를 가지는 130K 이미지를 선택. 만약 130K 개가 안되면 이미지 복제를 해서라도 130K 맞추기
    • 최종적으로 each class can have 130K images 를 가지도록 만든다. (ImageNet 또한 class마다 비슷한 수의 이미지를 가지고 있다고 함)
  • Architecture
    • EfficientNet-B7에서 wider, deeper, lower resolution을 가지는 Network를 만들어서 최종적으로 EfficientNet-B7를 만들었다고 함.
    • 아래는 EfficientNet-B0 인데, 여기서 Block을 더 넣는 방식으로 더 깊게 만들고, channel을 인위적으로 늘린다.
    • 특히, lower resolution을 사용하는 이유는 2가지인데, (1) 파라메터 수를 너무 과다하지 않게 만들기 위해서 (2) 아래의 ` fix train-test resolution discrepancy` 기법을 사용하기 때문에
      image-20210317132704150
  • Training details
    • epochs : EfficientNet-B4보다 작은 모델은 350. EfficientNet-B4 보다 큰 모델은 700.
    • learning rate : labeled batch size 2048 를 학습시킬때, 0.128 로 시작하고, 위의 모델에 대해서 각각 2.4 epochs, 4.8 epochs마다 0.97씩 감소시켰다.
    • large batch size for unlabeled images : make full use of large quantities of unlabeled images.
    • 6 days on a Cloud TPU v3 Pod, which has 2048 cores, if the unlabeled batch size is 14x the labeled batch size
    • fix train-test resolution discrepancy 기법 [86] : 작은 해상도로 350 epochs 학습시키고, 마지막에 1.5 epochs만 larger resolution unaugmented labeled images 이미지로 학습시킴
  • Noise
    • the survival probability in stochastic depth : 가장 마지막 residual layer에 대해서 0.8 를 가지고, 초반 layer로 갈수록 점점 증가시킨다.
    • dropout rate : 가장 마지막 layer에 대해서 0.5 를 적용하고, 초반 layer로 갈수록 점점 증가시킨다.
    • RandAugment : 27 magnitiude

4. Details of Robustness Benchmarks

  1. ImageNet-A
    • 200 classes를 가지는 데이터셋
    • the original ImageNet classes are available online. (자연 그대로 상태의 이미지)
  2. ImageNet-C
    • mCE (mean corruption error) : the weighted average of error rate on different corruptions
    • Corruptions in ImageNet-C: Gaussian Noise, Shot Noise, Impulse Noise, Defocus Blur, Frosted Glass Blur, Motion Blur, Zoom Blur, Snow, Frost, Fog, Brightness, Contrast, Elastic, Pixelate, JPEG.
  3. ImageNet-P
    • mFR (mean flip rate) : the weighted average of flip probability on different perturbations
    • Gaussian Noise, Shot Noise, Motion Blur, Zoom Blur, Snow, Brightness, Translate, Rotate, Tilt, Scale
  4. RandAugment transformations
    • AutoContrast, Equalize, Invert, Rotate, Posterize, Solarize, Color, Contrast, Brightness, Sharpness, ShearX, ShearY, TranslateX and TranslateY.

3.2 ImageNet Results

image-20210313183547601

  • ImageNet-C의 평가에 사용된 mCE 지표와 ImageNet-P의 평가에 사용된 mFR 지표는 낮을수록 좋은 값이다.
  • 성능지표 표는 첨부하지 않겠다. 쨋든 다 성능이 향상한다.


Noise 기법 정리

  1. Dropout [2014]
    image-20210313170600697
    • overfitting 방지
    • hidden unit을 일정 확률로 0으로 만드는 regularization 기법이다.
    • 후속 연구로, connection(weight)를 끊어버리는 (unit은 다음층 다른 unit과 모두 연결되어 있는데, 이 중 일부만 끊어 버리는 것이다. dropout 보다는 조금 더 작은 regularization(규제)라고 할 수 있다. )
  2. stochastic depth [2016]
    • ResNet의 layer 개수를 overfitting 없이 크게 늘릴 수 있는 방법이다. ResNet1202 를 사용해도 정확도가 오히려 떨어지는 것을 막은 방법이다.
    • ResNet에 있어서 훈련할 때에 residual 모듈 내부를 랜덤하게 drop(제거)하는 모델이다. (모듈 내부가 제거되면 residual(=shortcut)만 수행되며, 그냥 모듈 이전의 Feature가 그대로 전달되는 효과가 발생한다.)
    • Test시에는 모든 block을 active하게 만든 full-length network를 사용한다.
    • p_l = 1 - l/2L
      • residual 모듈이 drop하지 않고 살아남을 확률이다.
      • L개의 residual 모듈에서 l번째 모듈을 의미한다.
      • input에 멀어질 수록, l은 커지고, p_l은 작아진다. 즉 drop 될 확률이 커진다.
    • p_l의 확률값에 의해서 b_l (0 or 1 = drop_active or Non_active)이 결정된다.
      image-20210313171503869
  3. RandAugment data augmentation [2019]
    • 간략하게 말하면, 기존에 다양한 Data Augmentation을 싹 정리해놓은 기법이다.
    • 아래와 같은 14가지 Augmetation 기법들을 모아놓고, 랜덤하게 N개를 뽑고, 얼마나 강하게 Transformation(distortion magnitude)를 줄 것인지 M (Magnitude)를 정해준다. (아래 왼쪽의 수도코드 참조)
    • 그렇다면 M을 얼마나 주어야 할까? (1) 매번 랜덤하게 주는 방법 (2) 학습이 진행될수록 키우는 방법 (3) 처음부터 끝까지 상수로 놔두는 방법 (4) 상한값 이내에서 랜덤하게 뽑되, 상한가를 점점 높히는 방법
    • 모두 실험해본 결과! 모두 같은 성능을 보였다. 따라서 가장 연산 효율이 좋은 (3)번을 사용하기로 했고, 상수 값 M을 몇으로 하는게 가장 좋은 성능을 내는지 실험해 보았다. (아래 오른쪽 그래프 참조) 그래프 분석에 따르면, 최적의 M은 10~15 정도인 것을 알 수 있다.
      image-20210313173515056

【Transformer+OD】Deformable DETR w/ advice

Deformable DETR

1. Conclusion, Abstract

  • 핵심은 “the (multi-scale) deformable attention modules” 이다. 이것은 image feature maps를 처리하는데 효율적인 Attention Mechanism 이다.
  • 아래의 Transformer attention modules 의 가장 큰 단점을 a small set of key sampling 를 사용함으로써 해결 했다.
    1. slow convergence
    2. limited feature spatial resolution
  • 장점으로 fast convergence, and computational and memory efficiency 를 가지고 있다.
  • two-stage Deformable DETR 를 만들기도 하였다. region proposal이 먼저 생성되고, 그것들을 Decoder에 넣는 방식으로 만들었다.

2. Revisiting Transformers and DETR

  • 특히 이 부분의 수학적 수식을 통해서, 지금까지 직관적으로만 이해했던 내용을 정확하게 이해할 수 있었다. 왜 NIPS에서 수학 수식을 그렇게 좋아하는지 알겠다. 정확하고 논리적이다.

2.1 Multi-Head Attention in Transformers

  1. z_q, query element : a target word in the output sentence (“이 단어에 대해서는 어떻게 생각해?” 질문용 단어) =
  2. x_k, key elements : source words in the input sentence (문장 안에 있는 모든 단어. 모든 단어들에게 위의 query에 대해 질문할 거다.)
  3. 특히 Encoder에서 z_q와 x_k는 element contents(word in 문장, patch in Image) 와 positional embeddings(sin, learnable) 의 concatenation or summation 결과이다.
  4. multi-head attention module : query-key pairs 에 대한 Attention(= compatibility, Softmax) 정도 를 파악해 그것을 attention weights 라고 하자. 이 attention weights와 각각의 the key와 융합하는 작업을 한다.
  5. multi-head : 단어와 단어끼리의 compatibility(상관성 그래프)를 한번만 그리기엔, 애매한 문장이 많다. 그래서 그 그래프를 여러개 그려서 단어와 단어사이의 관계를 다양하게 살펴봐야한다. 이것을 가능하게 해주는 것이 multi-head 이다. Different representation subspaces and different positions을 고려함으로써, 이 서로서로를 다양하게 집중하도록 만든다.
  6. multi-head에서 나온 값들도 learnable weights (W_m)를 통해서 linearly하게 결햅해주면 최종 결과가 나온다. 아래의 필기와 차원 정리를 통해서, 한방에 쉽게 Attention module과 MHA(multi head attention)에 대해서 명확히 알 수 있었다.
  7. 아래 필기 공부 순서 : 맨 아래 그림 -> 보라색 -> 파랑색 -> 대문자 알파벳 매칭 하기. 위의 보라색 필기는, Softmax 까지의 Attention weight를 구하는 과정을 설명한다. 파랑색 필기는 MHA의 전체과정을 설명한다.
    image-20210312172106021
  8. 하지만 이 방법에는 2가지 문제점이 존재한다.
    1. long training schedules : 학습 초기에 attention weight는 아래와 같은 식을 따른다. 만약 Key가 169개 있다면, 1/169 너무 작은 값에서 시작한다. 이렇게 작은 값은 ambiguous gradients (Gradient가 너무 작아서, 일단 가긴 가는데 이게 도움이 되는지 애매모호한 상황) 이 발생한다. 이로 인해서 오랜 학습을 거쳐야 해서, long training schedule and slow convergence가 발생한다.
    2. computational and memory complexity(복잡성, 오래걸림, FPS 낮음) : 위의 MHA의 시간 복잡도를 계산하면 아래와 같다. 만약 N_q가 100 or 169개, N_k가 169개 라면, N_q x N_k 에 의해서 quadratic(제곱) complexity growth with the feature map size 이 발생한다.
      image-20210312173306339

2.2 DETR

  1. input feature maps x ∈ R ^ (C=256×H=13×W=13) extracted by a CNN backbone
  2. 각 모듈의 시간복잡도
    • Encoder's MHA
      1. query and key는 모두 pixels in the feature maps 이다.
      2. 시간 복잡도는 O(H^2 * W^2 * C) 이다. 따라서 이것도 Feature Size 증가에 따른 quadratic(제곱) complexity 를 가진다.
    • query's Masked MHA
      1. self-attention modules
      2. Nq = Nk = N, and the complexity of the self-attention module
    • decoder's MHA
      1. cross-attention
      2. N_q = N=100, N_k = H × W (encoder에서 나온 차원이, (HxW) xC 라는 것을 증명한다!)
      3. 시간 복잡도 : O(H*W*C^2 + N*H*W*C)
  3. (anchor & NMS와 같은) many hand-designed components 의 필요성을 제거했다.
  4. 하지만 아래와 같은 2가지 문제점이 있다.
    1. Low performance in detecting small objects : 다른 모델들에서는 Multi Scale Feature (C_3 ~ C_5) 혹은 FPN (P_3 ~ P_5) 를 사용하는데 여기서는 그럴수 없다. 시간복잡도가 quadratic(제곱) complexity 로 증가하기 때문이다.
    2. many more training epochs to converge

4. Method

  1. DETR에서 Key를 all possible spatial locations 로 모두 가져간다. 하지만 deformable DETR에서는 only attends to a small set of key 로 Keys를 사용한다. 이를 통해서 우리는 원래 DETR의 가장 큰 문제점이었던, the issues of convergence 그리고 feature spatial resolution 을 키울 수 없는 상황을 해결할 수 있게 되었다.

  2. Deformable Attention Module 그리고 Multi-scale Deformable Attention Module 의 수식은 아래와 같다. 수식을 이해하는 것은 그리 어렵지 않지만, 실제로 어떻게 정확하게 사용하는지는 코드를 통해서 이해할 필요가 있다. 코드를 확인하자.

  3. (아래 내용을 추가 의견) BlendMask 또한 '모든' Feature Pixel에게 "RxR에 대해서 어떻게 생각해" 라고 물어본다. 이것을 '모든' 으로 하지말고, 일부만 (like small K set) 선택하는건 어떨까? 아니면 query를 RxR ROI 라고 치고 Transformer를 사용해보니는 것은 어떨까?

    image-20210313091224450

  4. Deformable Transformer Encoder

    • Input과 Output 모두 multi-scale feature maps with the same resolution(256 channel) 이 들어간다.
    • 특히 Input은 stages C3 through C5 in ResNet 의 Feature map을 선발 사용한다. 위 이미지 참고할 것. 그리고 FPN을 사용해서 P3~P5를 이용하지는 않는다. 사용해봤지만, 성능 향상이 거의 없기 때문이다.
    • query로 Feature map을 줄때, feature level each query pixel 에 대한 정보를 담기 위해서, e_i 라는 positional embeding을 추가했다. e_i은 L의 갯수 만큼 있으며, 초기에는 랜덤하게 initialize가 되고, Learnable parameter로 학습이 된다.
  5. Deformable Transformer Decoder

    • 2가지 모듈이 있다. cross attention modules : object-query와 Encoder의 출력값이 들어간다., self-attention modules : object-query 끼리 소통하여 N=100개의 output을 만들어내는 모듈이다.
    • we only replace each cross-attention module to be the multi-scale deformable attention module
    • 어차피 self-attention module은 HW개의 query가 들어가는게 아니라 key, value, query가 모두 100개 일 뿐이다.
    • multi-scale deformable attention module 은 reference point 주변에 image features를 추출하는 모듈이다. 따라서 decoder 마지막 FFN의 detection head가 그냥 BB의 좌표를 출력하는 것이 아니라, the bounding box as relative offsets을 출력하도록 만들었다. 이를 통해서 optimization difficulty를 줄이는 효과를 얻을 수 있었다. (slow converage) (reference point 를 BB center로써 사용했다고 하는데, BB center는 어디서 가져오는거지?)
  6. Additional Improvements and variants for deformable DETR

    • 많은 성능향상 방법을 실험해보았는데, 도움을 주었던 2가지 방법에 대해서만 소개한다. (추가 설명은 Appendix A.4 를 참고 하라.) (솔직히 아래의 내용만으로는 이해가 안됐다. 코드를 보기 전에 부록을 보면서 함께 공부하도록 하자. 아래의 그림은 설명을 보고 그럴듯하게 그려놓은 것이지, 정답이 아니다.)
      image-20210313094831220
    • Iterative Bounding Box Refinement : optical flow estimation (Teed & Deng, 2020) 에서 영감을 받아서 만들었다. 간단하고 효율적으로 각 decoder layer에서 나오는 detect BB결과를 다음 Layer에 넘겨서 다음 Layer는 이 BB를 기반으로 더 refine된 BB를 출력한다.
    • Two-Stage Deformable DETR :
      • 첫번째 stage에서는 region proposal과 objectness score를 예측하고 이 값을 다음 stage에 넘김으로써, 정확한 BB와 Class를 출력하는 2-stage Deformable DETR를 만들었다.
      • 시간과 메모리 복잡도가 너무 올라가는 것을 막위해서 encoder-only of Deformable DETR을 region proposal Network로 사용한다.(?)
      • 그리고 그 안의 each pixel is assigned as an object query. 그래서 시간, 메모리 복잡도가 급등하는 것을 막는다. (?)

5. Experiment

image-20210313095426894



Deformable DETR PPT

img01 img02 img02 img02 img02 img02 img02 img02 img02 img02 img02 img02 img02 img02 img02 img02 img02

【Detection】TridentNet - Scale-Aware Trident Networks for Object Detection

  • 논문 : Scale-Aware Trident Networks for Object Detection
  • 분류 : Scale-Aware Object Detection
  • 저자 : Yanghao Li, Yuntao Chen, Naiyan Wang, Zhaoxiang Zhang
  • PS
    1. COCO에서 Small, Medium, Large의 기준이 무엇인가? 참고 Page, (핵심 복붙 : In COCO, there are more small objects than large objects. Specifically: approximately 41% of objects are small (area < 322), 34% are medium (322 < area < 962), and 24% are large (area > 962). Area is measured as the number of pixels in the segmentation mask.)
    2. 전체적으로 약 파는 논문 같다. 비교도 자기의 모델(ablation) 비교가 대부분으고. 최근 기법들이랑 비교도 안하고…
    3. 파라메터 share하는 거 말고는, 앙상블이랑 뭐가 다른지. 모르겠고 왜 이게 논문이고 citation이 250이나 되는지 모르겠다. 속도보단 성능. 실용성보단 연구. 라는 느낌이 강해서 내맘에 들지 않는 논문이다.
  • 목차
    1. TridentNet Paper Review
    2. Code

TridentNet

1. Conclusion, Abstract, Introduction

  • 아래와 같은 Network를 설계하여, trident blocks 들이 다른 receptive field를 가지게 함으로써, scale-aware feature maps 을 생성한다.
    image-20210311185032430
  • our contributions 정리
    1. effect of the receptive field 에 대해서 조사해보았다.
    2. scale-specific feature maps을 생성하는 TridentNet를 소개한다.
    3. ` scale-aware training scheme` 를 사용해서 각각의 branch가 적절한 크기의 객체를 추출하는데 특화되도록 만든다.
    4. TridentNet Fast 를 소개한다.
    5. a parallel multi-branch architecture : 각 branch 들이 자신들의 transformation parameter를 공유하지만(trident-block 들이 서로의 weight를 sharing), 서로 다른 receptive fields를 가지도록 한다.
    6. mAP of 48.4 using a single model with ResNet-101 backbone

3. Investigation of Receptive Field

  • Architecture의 디자인 요소 중, Receptive feild에 대한 영향력 조사에 대한 논문은 없었다. 따라서 우리가 다른 Dilation rate를 사용함으로써 receptive field 에 대한 영향력을 조사해보았다.
  • dilation rate (d_s) 를 사용하면, network의 receptive field를 증가시키는 장점을 얻을 수 있다.
  • 아래와 같이 실험을 했고, 오른쪽 표가 실험의 결과이다.
  • 이를 통해서, receptive field가 객체 크기에 따른 검출 성능에 영향을 준다는 것을 파악했다.
  • 특히! 큰 객체에 대해서 더 검출을 잘하는 것을 파악할 수 있다. (이 논문 전체를 보면 small object의 성능 검출 보다는 보통 large object에 따른 성능 증가가 많은 편이었다.)
  • ResNet101을 사용했을 때 조차도, receptive field를 넓혀줬을 때, 성능이 향상되었다. 이론적인 receptive field 보다, [practical하고 실험적이고 effective한] receptive field는 더 작다는 것을 증명하는 사례이다.

image-20210311223956455


4. Trident Network

4.1. Network Structure

  • Multi-branch Block
    1. single scale input이 들어가고, 평행하게 각 branch가 scale-specific feature map을 만들어 낸다.
    2. TridentNets은 임이의 Network의 Conv연산을 trident blocks으로 바꿔서 만들어 낸다.
    3. (실제 이 논문의 목표는 어떤 전체 Architecture를 만든게 아니다. Faster-RCNN 그리고 RPN 혹은 ResNet backbone의 특정부분의 Conv연산을 trident block으로 대체하여 사용한게 전부이다. 어떻게 어느 부분을 바꾸었는지는 구체적으로 나와있지 않다.)
    4. Typically, we replace the blocks in the last stage of the backbone network with trident blocks / since larger strides lead to a larger difference in receptive fields as needed. 즉, ResNet 중에서도 Deep한 부분부터 trident block을 삽입해 사용했다고 한다. 뒤의 실험에서도 나오겠지만, Deep 한 곳에 적용해야 효과가 좋다. 왜냐하면, Deep한 곳의 각각의 Featrue Pixel들은 이미 큰 Receptive field를 가지는데, 거기다가 Trident Block을 적용해서 더! 큰 Receptive Field를 가지게 만드는 것이다.
    5. (이것을 코드로 구현하는 것은 어렵지 않을 것 같다. 일단 Faster-RCNN코드를 하나 가져온다. 그리고 그 코드에 있는 일부 nn.conv2d 에 Dilation rate를 추가해준다. 그럼 그게 하나의 branch이다. 그렇게 각각의 net=build_module()을 3개 만든다. net1, net2, net3. 그리고 이것들을 가지고 NMS해주면 끝. (NMS가 그냥 앙상블 수준이다.))
      image-20210311225603287
  • Weight sharing among branches
    1. 모든 Branch는 RPN and R-CNN heads의 일부 conv를 Trident Block으로 대체하여 사용한다.. 그리고 (서로 dilation rate만 다른) 각각의 Branch에 대해서, the same parameters를 공유한다.
    2. 그렇기 때문에 추가적인 파라미터가 필요하지 않다. (물론 연산은 3배로 해야하는 것은 맞다.)
    3. 학습 중에서도 파라메터가 공유되어 학습된다.
  • Scale-aware Training Scheme
    1. 위의 표를 보면 Small object에 대해서는 Large Receptive Field를 가지는 branch에서는 오히려 낮은 성능이 나오는 것을 확인할 수 있다.
    2. 이것을 objects of different scales, on different branches 즉 mismatched branches 라고 표현할 수 있다.
    3. 따라서 이러한 문제를 피하고자, 각각의 branch가 the scale awareness를 가지게 하도록 하는 a scale-aware training scheme을 수행했다.
    4. 어려운게 아니라, 각 Branch마다 담당하는 객체의 크기가 다르다. 위의 (1) 식과 같이 l_i와 u_i를 설정한다. 그리고 ROI 즉 이미지의 위에서 객체의 크기를 w, h 라고 했을 때, 일정 범위의 객체일 때만, 각 Branch가 Predict 해야하는 GT로 사용하도록 만든다.
  • Inference and Approximation
    1. 각각의 Branch에서 Detect 결과를 받아서 NMS 혹은 NMS를 사용해서 최종 결과로써 반환한다.
  • Fast Inference Approximation
    1. 연산을 3배로 해야하기 떄문에 속도가 매우 느리다. 그래서 inference하는 동안 좀더 좋은 속도를 얻고 싶다면, 중간 branch 만을 사용한다. (dilation rate = 2 )
    2. (아니 특별한 것도 아니고 겨우 이게 Fast inference 기법이란다. 무슨 약 파는 것도 아니고 어이가 없는 논문이다.)
    3. 확실히 performance drop 이 발생하지만, weight-sharing strategy을 사용하기 때문에 중간 성능에서는 좋은 성능을 보인다. (Figure2 확인)

5. Experiments

  • Table4 는 ResNet에서 trident blocks을 어디다 놓을지 정하는 실험이다. conv2,3,4가 의미하는 곳이 어딘지 모르겠으나, (논문에 안 나와 있음. ResNet논문 혹은 코드를 봐야함) conv4에서 사용하는게 좋다고 한다. 위에서 말했듯이 더 deep한 곳에서 사용해야 더 확실하게 receptive field를 크게 하는것에 도움을 받는다고 한다.

image-20210311230859944

【In-Segmen】BlendMask - Top-Down Meets Bottom-Up w/ my advice

  • 논문 : BlendMask: Top-Down Meets Bottom-Up for Instance Segmentation
  • 분류 : Real Time Instance Segmentation
  • 저자 : Hao Chen, Kunyang Sun, Zhi Tian, Chunhua Shen
  • 느낀점 :
    • 논문 필기 본은 C:\Users\sb020\OneDrive\21.1학기\논문읽기_21.1 참조하기.
    • 내 생각이 옳다고 200프로 생각하지 말자. 다른 사람의 말과 논리가 맞을 수 있다. 내 논리를 100프로 버리고 상대의 의견과 논리를 들어보자. 인간은 절대 정확할 수 없다. 상대방의 말을 들을 때는, 단어 하나를 곱 씹고 이해하려고 노력하자.
    • 확실히 Method를 보고 Conclusion, Abstract, Introduction 를 보면 이해가 훨씬 잘되고, 단어가 바뀌거나, 표현이 바뀌어도 확 이해가 된다. 따라서 제발 Method 부터 읽자. 괜히 깝치지 말고 Method부터 읽자. 왜 같은 실수를 계속 반복하는가? 초반 Conclusion, Abstract, Introduction에서 5분 이상 허비하지 말자.
  • 읽어야 하는 논문
    • FCIS [18]
  • 목차
    1. BlendMask Paper Review
    2. Code

BlendMask

1. Conclusion, Abstract, Introduction

  • 성능 : Mask R-CNN 보다 20% faster. BlendMask-RealTime achieves 34.2% mAP at 25 FPS evaluated on a single 1080Ti GPU
  • (뭔소리지?) effectively instancelevel information 와 semantic information 를 결합해서 사용했다. top-down과 bottom-up 방법을 아주 적절히 혼합해 사용했다. (hybridizing top-down and bottom-up approaches, FCIS [18] and YOLACT [3] )
  • BlendMask는 1번의 conv로 attention map을 학습하고, 이를 이용해 K=4개의 channel만으로 Instance segmentation 예측을 수행한다.
  • top-down approach 의 단점 (sementic -> instance) (일단 그래도 복붙. 논문 안 읽어서 뭔소린지 모름)
    1. DeepMask [23]
    2. local-coherence between features and masks is lost
    3. the feature representation is redundant because a mask is repeatedly encoded at each foreground feature
    4. position information is degraded after downsampling with strided convolutions
  • bottom-up approach의 단점 (box -> segmentation)
    1. heavy reliance on the dense prediction quality (ROI 결과에 너무 많이 의존된다.)
    2. 많은 수의 class가 담긴 복잡한 장면을 이해하는 능력의 일반화에 제한이 있다. (panoptic segmentation 힘듬)
    3. 복잡한 post-processing 절체가 필요하다.
  • 우리 모듈의 핵심 Blender module : BlendMask에서는 얕지만 디테일한 정보깊지만 의미론적인 정보를 융합해사용한다.
    1. 얕지만 디테일한 정보 : better location information, finer details, accurate dense pixel features. (Bottom Module)
    2. 깊지만 의미론적인 정보 : larger receptive field, rich instance-level information (Tower = Top layer)
    3. mask combination! = blender
  • FCOS에 simple framework 만 추가해서 BlendMask를 만들었다.

3. Our BlendMask

  • the decoder(Backbone) of DeepLabV3+ 을 사용했다.
  • 아래 그림과 필기 먼저 보기
  • M은 Mask prediction (R) 보다 작다. 왜냐면 attention에 대한 rough estimate 만을 모델에게 물어보는것 이기 떄문이다.
  • 저 과정을 통해, 어떤 Attention이 이뤄졌다는지 모르겠다. 아! “H_l x W_l 내부의 하나하나의 픽셀들이, R x R에 대해 어떻게 attention 할 필요가 있는가?” 라고 생각하면 되겠다!

SmartSelect_20210311-125649_Noteshelf.jpg

  • 수정본 (그림 중간에 MxM 에 엑스(X)가 처진것은, MxM ==> RxR 로 Interpolate가 되는 것을 의미한다.)

SmartSelect_20210311-143514_Noteshelf.jpg

  • 3.4 Semantics encoded in learned bases and attentions
    image-20210311170839067

4. Ablation Experiments

  • 많은 실험을 통해서, 어떤 알고리즘을 사용할지 선택한다.
    image-20210311171245648
  • 특히 Other improvements
    1. YOLACT에서 사용한, auxiliary semantic segmentation supervision 방법을 활용하여 성능향상을 많이 얻었다.
    2. 그 외는 필요하면 논문 참조
  • Fast NMS 을 사용해서 속도 향상을 했지만, 성능감소가 커서 Batched NMS in Detectron2 를 사용했다.
    image-20210311171300645

  • 잘못 필기한 그림 (혹시나 필요하면 참고하기)
    SmartSelect_20210311-125616_Noteshelf.jpg

w

【In-Segmen】Mask Scoring R-CNN & YOLACT++

  • 논문1 : Mask Scoring R-CNN
  • 논문2 : YOLACT++
  • 분류 : Real Time Instance Segmentation
  • 저자 : Zhaojin Huang, Lichao Huang / Daniel Bolya, Chong Zhou
  • 느낀점 :
    • 핵심만 캐치하고 넘어가자. 필요하면 그때, 다시 보자.
    • (PS) 논문 필기 본은 C:\Users\sb020\OneDrive\21.1학기\논문읽기_21.1 참조하기. 그리고 논문 필기 본을 보면 X 친 부분이 많듯이, 논문을 거의 안 읽었다. 핵심만 파악했다.
  • 목차
    1. Mask Scoring R-CNN Paper Review
    2. YOLACT++ Paper Review
    3. Code

A. Mask Scoring R-CNN

  • 그리고 논문의 영어문장 난이도도 높은 편이다. 모든 세세한 내용들이 다 적혀있는 게 아니므로, 코드를 찾아보고 확실히 알아보는 시간도 나중에 필요할 듯하다.

1. Conclusion, Abstract, Introduction

  • 현재 instance segmentation 의 score 문제점을 파악하고, 이를 해결하는 방법으로 Mask Scoring을 제안했다.
  • (마스크 예측을 얼마나 잘했는지) the quality of the predicted instance masks를 체크하는 MaskIOU head를 추가했다.
  • mask quality 와 mask score 를 명확하게 규정하고 정의하여, evaluation하는 동안에 더 정확한 Mask를 Prioritizing (우선 순위 지정)을 통해서 전체 성능을 향상시킨다.
  • 현재 Mask RCNN의 문제점을 파악해 보자.
    image-20210309134653066
  • very simple and effective (하지만, 논문의 결과들을 보면 MaskIOU head를 추가해서 속도와 파라메터의 증가가 얼마나 일어났는지는 나와있지 않다.)

2. Method

  • 3.1. Motivation
    image-20210309134918464
  • 3.2. Mask scoring in Mask R-CNN
    • Mask scoring = S_mask
      1. S_mask는 Mask head에서 binary segmenation을 얼마나 잘했는지 평가하는 수치이다. (내 생각으로, 이 값이 Final (class&mask) Confidence 인 듯하다. 이 S_mask를 구체적으로 어떻게 사용했는지는 코드를 통해서 확인해야 할 듯 하다. 논문 자체에서도 매우 애매하게 나와있다.)
      2. classification과 mask segmentation 모두에 도움이 될 수 있도록, S_mask = S_cls x S_iou 으로 정의해 사용했다. 여기서 S_cls는 Classification head에서 나온 classification score를 사용하고, S_iou는 MaskIoU head에서 나온 값을 사용한다.
      3. 이상적으로는 GT와 같은 Class의 Mask에 대해서 만 Positive value S_mask가 나와야 하고, 나머지 Mask의 S_mask는 0이 나와야 한다.
    • MaskIoU head
      image-20210309140843950
      1. 논문을 읽으면서 위와같이 필기했지만, 애매한 부분이 너무 많다. “Training 혹은 Inference 과정에서는 각각 어떻게 행동하는지?, GT는 무엇이고?, 전체를 사용하는지 해당 Class 값만 사용하는지?” 이런 나의 궁금증들은 논문으로 해결할 수 없었다. 코드를 봐야한다.
      2. 하지만 전체적인 그림과 핵심 파악은 위의 그림만으로도 파악이 가능하다.
      3. 위의 Max pooling은 kernel size of 2 and stride of 2 를 사용한다.
    • Training
      1. (Mask R-CNN 과정과 같이) GT BB와 Predicted BB의 IOU가 0.5이상을 가지는 것만 Training에 사용한다.
      2. (위 그림의 숫자 2번과정) target class 에 대해서만 channel을 뽑아오고, 0.5 thresholding을 통해서 binary predicted mask 결과를 찾아낸다.
      3. binary predicted mask 과 GT mask결과를 비교해서 MaskIoU를 계산한다. 이것을 GT MaskIoU로써 Mask Head의 최종값이 나와야 한다. 이때 Mask head의 최종결과 값 predicted MaskIOU값이 잘 나오도록 학습시키기 위해서, L_2 loss를 사용했다. (구체적 수식 없음)
    • Inference
      1. 지금까지 학습된 모델을 가지고, 이미지를 foward하여, Class confidence, box 좌표, binary mask, Predicted MaskIOU를 얻는다.
      2. Class confidence, box 좌표만을 가지고, SoftNMS를 사용해서 top-k (100)개의 BB를 추출한다.
      3. 이 100개의 BB를 MaskIOU head에 넣어준다. 그러면 100개에 대한 predicted MaskIOU를 얻을 수 있다.
      4. predicted MaskIOU x Class confidence 를 해서 Final Confidence를 획득한다.
      5. Final Confidence에서 다시 Thresholding을 거치면 정말 적절한 Box, Mask 결과 몇개만 추출 된다.

3. Experiments and Results

  • Experiments
    • resized to have 600px along the short axis and a maximum of 1000px along the long axis for training and testing
    • 18 epochs
    • (초기 learning rate는 안나와있다. 0.1 이겠지뭐..) decreasing the learning rate by a factor of 0.1 (10분의 1) after 14 epochs and 17 epochs
    • SGD with momentum 0.9
    • SoftNMS
  • Quantitative Results And Ablation Study
    image-20210309142550139

B. YOLACT++

image-20210309163534601

  • 위의 그림과 같이 그냥 YOLACT과 다른 점은 크게 3가지이다.
    1. efficient and fast mask rescoring network : mask quality를 고려해서, mask predictions에 대한 re-ranking을 한다.
    2. backbone network : deformable convolutions를 사용해서, instances검출을 위한 더 나은 feature sampling을 수행한다.
    3. anchors 종류를 새롭게 하였다.
  • Fast Mask Re-Scoring Network
    1. Mask Scoring RCNN의 방법을 채용했다.
    2. (Bounding box 영역 이외는 zero) crop이 된 이후를 input (YOLACT’s cropped mask prediction (before thresholding))으로 받은 FCN 을 통과해서, 마지막에 MaskIOU를 추론하는 모듈을 추가했다.
    3. 전체 모듈의 Architecture는 위와 같다. a 6-layer FCN with ReLU + final global pooling layer.
    4. 이 과정을 통해서 our ResNet-101 model에서, fps from 34.4 to 33 이 된다.
    5. 만약에 그냥 Mask Scoring RCNN의 방법을 그대로 사용하면, fps from 34.4 to 17.5이 된다.
    6. 여기선는 ROI align과 fc layers를 사용하지 않았기 때문에, efficient and fast 하다고 한다.
  • Deformable Convolution with Intervals
    1. Deformable Convolutional Networks : (1) 블로그 설명, (2) 동영상 설명
    2. Deformable Convolution Networks (DCNs)는 free-form sampling을 수행하며, 정말 필요한 Feature에만 집중해 sampling이 수행된다.
    3. a speed overhead of 8 ms 만으로 +1.8 mask mAP 성능향상을 이뤘다. 성능 향상의 이유를 추론해보면 다음과 같다.
      1. DCN는 different scales, rotations, and aspect ratios 의 객체를 다루는데 강할 만큼, 정말 Instance가 있는 부분을 sampling하는 능력을 가지고 있다.
      2. 2 stage detector는 RPN과 같은 proposal network가 없다. (does not have a re-sampling process = ROI pooling?) 따라서 처음부터 sampling을 잘하는게 필요한다. DCN이 이것을 도와준다.
    4. 하지만 이 DCN 과정 자체가 parameter를 더 많이 사용해야하기 때문에, DCN을 전체 신경망에 사용하기에는 속도 감소의 단점이 있다. 따라서 일정 layer 부분에만 DCN을 사용해야했고, 어느 부분에 사용하는게 가장 적절한 성능향상과 속도감소를 가져와 주었는지 아래와 같이 테스트 해보았다.
    5. 아래의 Table 7 을 참조해보자.
      • just DCN : 30 layers with deformable convolutions when using ResNet-101
      • speed up을 위해서 몇가지 실험을 해보았다. 여기서 가장 좋은 Trade-off 결과를 가져다 준 모델은 w/ DCN (interval=3) 이었다.
      • 아래의 각각의 method가 무엇인지 글로 설명이 되어 있지만, 정확한 이해는 힘들었다. 코드를 봐야한다. (내용 복붙 : (1) in the last 10 ResNet blocks, (2) in the last 13 ResNet blocks, (3) in the last 3 ResNet stages with an interval of 3 (i.e., skipping two ResNet blocks in between; total 11 deformable layers), and (4) in the last 3 ResNet stages with an interval of 4 (total 8 deformable layers). )
  • Optimized Prediction Head
    • 아래의 Table 3 참조.
    • 아무래도 YOLACT은 anchor-based 이다. 따라서 적절한 Anchor를 선택하는 것은 매우 중요했고, 몇가지 실험을 통해서 성능향상을 가장 많이 가져다 준 방법을 찾아 보았다.
    • 비율을 다르게 하거나 vs Anchor scale 을 다르게 하거나. 둘 다 실험해 본 결과, 후자가 더 좋은 성능 향상을 가져다 주었다고 한다.

image-20210309170334063

【In-Segmen】CenterMask - Real-Time Anchor-Free Instance Segmentation

CenterMask

1. Conclusion, Abstract, Introduction

  1. Real-time anchor-free one-stage
  2. VoVNetV2 backbone : (1) residual connection (2) effective Squeeze-Excitation (eSE, Squeeze and Excitation Block (M2Det, MobileNetV3, EfficientDet 참조))
  3. Spatial attention guided mask (=SAG-Mask) : Segmentation Mask를 예측한다. spatial attention을 사용함으로써 집중해야할 Informative Pixel에 집중하고, Noise를 Suppress한다.
  4. ResNet-101-FPN backbone / 35fps on Titan Xp
  5. (PS) Introduction은 읽을 필요 없는 것 같고, Relative Work는 아에 없다. Introduction에 Relative Work의 내용들이 가득해서 그런 것 같다.

2. CenterMask architecture

image-20210308210529882

  • 논문의 그림에서 P7~P3의 그림이 이상해서 내가 다시 표시했다. 내가 수정한게 더 맞는 것 같다.

2.3. Adaptive RoI Assignment Function

  1. 위 필기 갈색5번을 참조하면 ROI는 구했고, 그 ROI를 가져올 때, 어떤 Feature Level을 사용해야하는가?

    image-20210308212753869

  2. 위 Equation1 은 Mask rcnn에서 사용하던 방식이다. 하지만 이것을 그대로 사용하기에는 문제가 있다. 첫째로, 이 방식은 feature levels of P2 (stride of 2^2) to P5를 사용하는 2 stage detector에 더 적합하다. 우리는, P3 (2^3) to P7 (2^7)를 사용하는 one stage detector를 개발해야한다.

  3. 게다가 위의 224는 ImageNet Image size이다. 이것은 굉장히 Heuristic한 설정이고, 이와 같은 설정을 유지해서 계산을 해보면, 특정 wh에 따라 선택된 k 값은 상대적으로 작은 값이다. 다시 말해, 좀 더 큰 resolution의 Feature map에서 ROI feature를 가져와야 하는데, 작은 Resolution의 Feature map에서 ROI feature를 가져오므로 작은 객체 탐지를 어렵게 만든다.

  4. 따라서 우리는 Equation2를 새로운 Feature Level 설정 방법으로 사용한다. 몇가지 경우와 수를 고려해보면, Image area의 절반이상의 ROI area를 가지는 객체는 무조건 P7에서 Feature를 가져오고, 상대적으로 Equation 1보다 작은 k값의, P_k에서 feature를 가져와 small object detection에 도움을 준다.

  5. ablation study를 통해서 k_max to P5 and k_min to P3 를 사용하는게 가장 좋은 결과를 가져다 주었다고 한다.


2.4. Spatial Attention-Guided Mask

  1. 최근 attention methods은 Detector가 중요한 Feature에 집중하는데 도움을 준다. ‘what’을 강조해주는 channel attention과 ‘where’을 강조해주는 spaital attention이 있다. CBAM이 위의 2가지 방법을 적절히 잘 섞은 방법이다.
  2. 이 논문에서는 spaital attention를 사용해서, Mask head가 정말 의미있는 Pixel에 집중하고, 무의미한 Pixel은 억압되도록 만들었다.
  3. 그것이 SAG-Mask (a spatial attention-guided mask) 부분이고 위의 Architecture 그림에 잘 그려져 있다.
    image-20210308214326422

2.5. VoVNetV2 backbone

  1. VoVNet는 ‘computation + energy’ efficient backbone network 이다. 이 네트워크는 효율적으로 다양한 feature representation(map)들을 보존한다. VoVNetV1 또한 이 논문 저자가 발표한 논문의 방법이다.
  2. 이번 VoVNetV2에서는 특별하게 effective SE 모듈을 추가했다. effective SE 모듈은 기존의 SE 이 2번의 fc layer를 통과시키면서, dimension reduction 과정을 거치고 이 과정에서 정보의 손실이 생긴다고 주장한다. 따라서 1번의 fc layer만 통과시키는 effective SE 모듈를 주장한다.
  3. Architecture의 모습은 아래와 같다.
    image-20210308214521758

2.6. Implementation details

  1. mask scoring [15] 를 사용했다. 예측한 mask의 quality (e.g., mask IoU)를 고려하여, classification score를 재조정하는 방법이다. (이 방법을 어떻게 사용했는지 구체적인 방법에 대해서는 안 나와 있다. mask scoring [15] 논문을 봤다는 전제를 하는 것 같으므로 나중에 mask scoring [15] 논문을 꼭 읽어봐야겠다.)
  2. CenterMask-Lite : backbone, box head, and mask head 에 대해서, down-sizing을 하여 성능은 조금 낮아져도, 속도가 빨라지도록 만들었다. 구체적으로 어떻게 down-sizing 했는지는 논문에 간략히 적혀있으니 필요하면 참조.
  3. Training :
    • FCOS에서 나오는 100개의 박스를 SAG-mask branch에 fed한다.
    • Mask R-CNN과 같은 mask-target을 사용했다. 이 mask-target은 Mask-IOU를 이용해 정의 된다.
    • Loss_total = L_cls + L_center + L_box + L_mask
    • input image는 가로 세로 중 짧은 쪽이 800이 되도록 resize된다. 긴쪽은 1333이 되거나 1333보다 작은 pixel크기가 된다.
    • 90K iterations (∼12 epoch) with a mini-batch of 16 images
    • SGD, weight decay of 0.0001 and a momentum of 0.9
    • initial learning rate 0.01 which is decreased by a factor of 10 at 60K and 80K iterations, respectively
    • All backbone models 은 ImageNet pre-trained weights 를 사용했다.
  4. Inference :
    • FCOS에서 나오는 50개의 박스를 SAG-mask branch에 fed한다.
    • CenterMask/CenterMask-Lite use a single scale of 800/600 pixels for the shorter side

3. Results

image-20210308220227847

【Detection】FCOS - Fully Convolutional One-Stage Object Detection

FCOS

1. Conclusion, Abstract, Introduction

  1. anchor boxes와 관련된 hyper-parameter와 학습 중 Matching 및 IOU 계산에 대한 연산들을 모두 제거했다. Hyper-parametor를 제거함으로써 heuristics한 many trick들을 모두 없앴다. 그리고 Anchor와의 관계 연산을 하지 않으므로 Faster Training이 가능하다.
  2. Sementic Segmentation 처럼. per-pixel prediction fashion 을 수행한다.
  3. 우리의 FCOS를 two-stage Detector에서 RPN으로 사용해도 좋은 결과를 가져다 준다. RPN 또한 Anchor-based 인 것을 기억하자.
  4. NMS 를 사용한 후처리 과정은 필요하다. FCOS with ResNeXt-64x4d-101에서 SOTA 성능 44.7% AP를 획득했다. 우리 모델은 simple and fast 하다!
  5. 원래 Class confidence만 예측하는 head만 있으면, low-quality predicted bounding boxes 들이 너무 많이 생긴다. 그래서 우리는 해당 1x1 pixel 점이 객체의 center와 얼마나 떨어져있냐를 수치로 가지고 있는 center-ness 값이 추출되도록 head를 추가했다.

2. Our Approach

image-20210306155338457

  • Anchor라는 개념없이, 각 Pyramid Feature Level의 한 1x1 픽셀 공간이 가지면 괜찮을 Class와, 가장 적절히 일치하는 Instance에 대한 the box offset (t, b, r, l) 을 검출한다.
  • 헷갈리면, 이전 포스트 FSAF Architecture에서 Anchor based 부분까지 완전히 제거해 버렸다고 생각하면 좋다.

3.1 Fully Convolutional One-Stage Object Detector

  • 우선 전체 architecture와 필기 꼭 참고하기. 그리고 아래의 수식들 하나하나 읽기.

image-20210306160218840


3.2. Multi-level Prediction with FPN for FCOS

  • FPN을 사용해서 Recall을 증가시키고, Overlapped bounding box의 ambiguity (다중 객체가 겹치는 해당 Feature map pixel에서 어떤 BB를 예측할 것인가?) 를 해결했다.
  • FPN으로 적용되는 stride값은 P3, P4, P5, P6 and P7 에 대해서, 각각 8, 16, 32, 64 and 128 이다. 이 값은 위의 S 로 동작한다.
  • Anchor-based detector에서 각각의 P_l 은 자신만의 Anchor size를 가짐으로써, 각 Level에서 검출하는 Instance의 크기가 서로 다른다. 여기서도 이런 개념을 추가했다. the range of bounding box regression 를 할당했다. 그 과정은 이와 같다.
    • (1) 우선 모든 Feature level에 t* ( l* , t* , r* , b* ) 를 연산해놓는다. (Image에 대응하는 (l, t, r, b)를 S로 나눠주면 된다.)
    • (2) 만약 max( l* , t* , r* , b* ) > m_i or max( l* , t* , r* , b* )< m_(i−1) 즉 일정 범위를 벗어나면 negative sample이라고 파악하고, bounding box regression 학습에 사용하지 않는다.
    • (3) 여기서 m2, m3, m4, m5, m6 and m7 는 각각 0, 64, 128, 256, 512 and ∞ 으로 설정해 사용했다.
    • 이 과정을 통해서, Inference을 하는 동안에는 각각의 Pyramid Feature level들은 자신이 예측해야하는 적절한 크기의 Instance를 우선적으로 검출한다.
  • (필기참조) 하나의 Feature level Picel이 1개 이상의 GT BB를 할당하고 있다면, 단순하게 더 작은 area를 가진 GT BB를 Ground True로 설정해 예측하도록 한다.
  • 그리고 단순하게 Shared Heads Between Feature Levels 를 사용한다. 즉 위의 보라색 head는 모두 파라메터를 공유한다. parameter-efficient (파라메터가 효율적으로 적은) 모델을 만들고 성능도 높혀준다. 하지만 이런 작업이 각 Level이 찾으려고 하는 Instance의 크기가 다른 것을 고려할 때 그리 합리적인 방법은 아닐 수 있습니다.
  • (필기참조) 그래서 우리는 그냥 exp(x)를 사용하는 것 대신에, exp(s_i * x) 를 사용했다. (s_i 는 trainable scalar) 알아서 각 Level에 필요한 s_i 값을 주어줄 것이라고 예측했다.

3.3. Center-ness for FCOS

  • (위 그림 참조) 그냥 Class Score만을 사용해서 NMS를 적용하니, a lot of low-quality predicted bounding boxes 가 추출되는 것을 확인할 수 있었다. 그래서 Center-ness를 예측하는 branch를 새롭게 만들었다.
  • 그 branch에서는 normalized distance를 의미하는“center-ness”를 예측한다.
    image-20210307163927443
  • When testing, 위의 Architecture 그림 처럼, center-ness와 classification score를 곱해서 최종 Confidence로 사용한다. 그리고 NMS를 적용한다.
  • the center-ness를 사용하는 것 대신에, central portion (FSAF에서 Efficient Region (GT instance BB의 0.2 공간))을 사용하는 방법도 있다. 하지만 이것 조차 extra hyper-parameter를 사용하는 방법이라는 것에 명심해야한다.
  • FCOS_PLUS 에서는 위의 2가지 방법을 융합해서 성능을 높혔다고 한다.

image-20210308091956833


4. Experiments

  • Training Details
    • ResNet-50
    • the same hyper-parameters with RetinaNet
    • SGD, Weight decay and momentum are set as 0.0001 and 0.9
    • initial learning rate being 0.01, batch of 16 images, 10 at iteration 60K and 80K.
    • the input images are resized being 800.
  • Inference Details
    • the same post-processing hyperparameters of RetinaNe
  • 4.1. Ablation Study
    1. (FPN) Multi-level Prediction 을 사용함으로써, ‘Best Possible Recalls 획득’ 그리고 ‘Ambiguous Samples 제거’ 를 할 수 있다.
      image-20210308092142003
    2. Best Possible Recalls 은 다음과 같이 정의할 수 있다. 위의 파란 필기도 참조. the ratio of the number of ground-truth boxes, a detector can recall at the most, divided by all ground-truth boxes.
    3. Ambiguous Samples
      • 특히 위의 사진과 같이, 객체가 overlapping 될때 Ambiguous sampling (보통 FPN에서는 ‘다중’ 예측을 통한 후 NMS를 한다. 이때 ‘특정 한번’의 예측을 할 때, 보통 ‘특정 위치’에서 1개의 객체인식만 하면 되는데, 객체가 겹치는 경우에는, 이 ‘특정 위치’에서 어떤 객체를 우선적으로 예측해야하는지 애매모호한 경우가 발생한다. 이를 Ambiguous sampling 이라고 말하는 것 같다. )이 발생한다.
      • 논문에는 정확한 정의와 계산 수식을 제시하고 있지 않다. 그저, 논문에서 말하는 몇가지 내용에 대해서 아래에 정리한다. 아래의 내용 말고 추가적인 내용은 없다. 왜 있는지? 무슨 소리를 하고 싶은건지 이해가 힘들다.
      • Table2를 보면, FPN을 사용함으로써 Ambiguous sampling이 줄어든 것을 확인할 수 있다. 이 이유는 다음과 같다. 객체가 overlapping 하게 되는 보통의 경우에는 두 객체의 크기가 상대적으로 다르다. 따라서 FPN의 다른 Level에서 객체가 각각 검출되면 되기 때문에, Ambiguous sampling 의 발생 빈도를 상당히 줄일 수 있다.
      • Moreover, 저자가 말하기로 같은 Class의 객체가 겹치면, 상대적으로 overlapping으로 인한 Ambiguous sampling은 적다고 한다.(어차피 비슷한 Feature map이 겹치므로) 반대로 겹치는 객체의 Class가 다르면, overlapping으로 인한 Ambiguous sampling이 크게 발생한다. (다른 Featere map이 서로 엃겨 섞이게 되므로. classifier는 당항할 것이다.)
  • 4.2. With or Without Center-ness / FCOS vs. Anchor-based Detectors / Comparison with State-of-the-art Detectors
    image-20210308094302495


FCOS code

  • Github link : [https://github.com/tianzhi0549/FCOS]

  • 공부순서
    1. Readmd.md 읽기
    2. 패키지 전체 흐름 파악하기
    3. 핵심 코드 살펴보기
    4. demo/fcos_demo.py
    5. python tools/test_net.py
    6. train : python -m torch.distributed.launch
  • 위의 5번까지 살짝 1시간 정도 본 결과 느낀점

    1. 아래의 기반 코드를 완전히 뜯어 부셔버리고, fcos코드를 보면 좋을 듯 하다. 하지만 시간이 없다면, 핵심 코드만 봐도 좋겠다. 우선 지금은 공부할 때가 아니다. 공부할 때 라는 생각이 들 때, 바로 공부해보자. 아래의 내용들을 참고하면 좋은 공부의 시작이 될 수 있다.
    2. 기반 코드 : https://github.com/facebookresearch/maskrcnn-benchmark
    3. 논문 내용 이해에 도움을 주는 핵심 코드 : https://github.com/tianzhi0549/FCOS/blob/master/fcos_core/modeling/rpn/inference.py
    4. 내가 만약 신경망을 처음부터 구성한다면, 심플하게 만들기 위해 도움 받을 수 있을 코드 : https://github.com/yhenon/pytorch-retinanet/tree/master/retinanet
    5. Test를 하던 Training을 하던 이것을 시작으로 Model을 만들었다.
      image-20210308160135320
      image-20210308160207919
  • 그리고 전체적으로 살펴 본 결과, 코드 제작자가 직접 손수 손본 곳은 여기가 전부 인듯 하다. (처음에는 못 찾았는데, 검색으로 centerness를 검색함으로써 찾을 수 있었다.)
    image-20210308160926494

  • 특히 /modeling/rpn/fcos/fcos.py에서 아래의 코드를 유심히 보자.

    class FCOSModule(torch.nn.Module):
        """
        Module for FCOS computation. Takes feature maps from the backbone and
        FCOS outputs and losses. Only Test on FPN now.
        """
      
        def __init__(self, cfg, in_channels):
            # /modeling/rpn/fcos/fcos.py 에 정의되어 있다. 
            head = FCOSHead(cfg, in_channels)
    		# /modeling/rpn/fcos/inference.py 에 정의되어 있다. 이 객체는 딱 Test할 때만 사용하나 보다.
            box_selector_test = make_fcos_postprocessor(cfg)
    

Pagination


© All rights reserved By Junha Song.