반응형

 

 

논문 링크입니다.

https://arxiv.org/abs/1908.07919

 

Deep High-Resolution Representation Learning for Visual Recognition

High-resolution representations are essential for position-sensitive vision problems, such as human pose estimation, semantic segmentation, and object detection. Existing state-of-the-art frameworks first encode the input image as a low-resolution represen

arxiv.org

 

2020년 발행

 

 

0. Title


Deep High-Resolution Representation Learning for Visual Recognition

-> 고해상도의 표현을 학습하는 모델인가보다..

 

1. Abstract


위치가 중요한 휴먼 pose estimation이나 semantic segmentation, object detection과 같은 시각적 문제에는 고해상도 표현이 필수적이다. 

현존하는 sota 구조들은 인풋 이미지를 저해상도로 인코딩하고, 다시 고해상도로 회복시킨다.

우리의 모델(HRNet)은 모든 과정에서 고해상도를 유지한다. 여기에는 두가지 특징이 있다.

1) high-to-low resolution convolution이 평행으로 연결된다는 것이다.

2) 반복적으로 정보를 교환한다.

 

이로 인한 장점은, 결과적인 표현이 시맨틱하게 더 풍부하고 정확하다는 것이다. 

우리의 모델은 human pose estimation, semantic segmentation, and object detection과 같은 다양한 application에서 

우월성을 보여주었다.

 

 

2. Conclusion


이 논문을 통해, 우리는 시각 인식 문제를 위한 고해상도 네트워크를 발표하였다.

여기에는 기존 모델들과 다른 세 가지 근본적인 차이가 있다.

1) 고해상도와 저해상도의 컨볼루션을 평행하게 연결하였다는 것. (일렬로가 아니라)

2) 전체과정에서 고해상도를 유지하였다는 것

3) position sensitivity를 가지고 multi-resolution representation을 반복적으로 녹였다는 것

 

가장 우수한 결과는 HRNet이 컴퓨터 비전 문제의 백본으로서 강력하다는 것이다.

우리의 연구는 특정 비전 문제에 대한 네트워크 아키텍처를 구축하기 위한 연구도 장려하였다.

 

Discussion

여기에는 잘못된 이해가 있다: 해상도가 높을수록 HRNet의 메모리 비용이 많이 들 것이다. 라는

사실, HRNet을 세가지 application(pose estim, object detect, semantic seg)에 적용한 메모리 비용은 이전 SOTA와 유사하다.

게다가, 우리는  파이토치 1.0에서 runtime cost 비교를 요약했다

1) segmentation HRNet에서의 inference time은 훨씬 적다.

2) pose estimation HRNet에서의 training time은 조금 많이 든다.

우리는 semantic segmentation the inference cost 가 PSPNet and DeepLabv3 보다 상당히 적다는 것이다. 

 

 

Future and Followup works

semantic segmentation and instance segmentation를 위한 HRNet의 combination을 연구할 것이다.

현재로써는, mIOU의 결과가 있지만, OCR과 결합함으로써 더 해상도를 증가시켜볼 것이다.

 

 

 

Introduction


DCNN(Deep Convolution Neural Network)은 많은 컴퓨터비전 태스크에서 state-of-the-art한 결과를 내었다.

DCNN의 강점은 더 풍부한 표현을 할 수 있다는 것이다. (더 고해상도)

가장 최근에 개발된 classification network(AlexNet, VGGNet, etc)은 LeNet-5의 디자인 규칙을 따른다.

Fig. 1. The structure of recovering high resolution from low resolution. (a) A low-resolution representation learning subnetwork (such as VGGNet [126], ResNet [54]), which is formed by connecting high-to-low convolutions in series. (b) A high-resolution representation recovering subnetwork, which is formed by connecting low-to-high convolutions in series. Representative examples include SegNet [3], DeconvNet [107], U-Net [119] and Hourglass [105], encoder-decoder [112], and SimpleBaseline [152].

(a)는 점진적으로 feature map의 공간적 크기를 줄이고, 고해상도에서 저해상도로 일렬로 연결한다. 그리고 저해상도로 귀결한다.(b)는 

 

High-resolution representations는 위치가 중요한 태스크들에 필요하다.

그래서 이전의 SOTA 모델들은 resolution을 올리기 위해

(b) classification에 의해 나온 low-resolution 결과에 high-resolution recovery process를 거쳤다. 

게다가, 확장된 컨볼루션은 downsample된 layer를 줄이는 데 사용되고

이에 따라 medium-resolution representation을 얻게 된다.

 

우리는 새로운 아키텍처를 제안한다. 이름하여 HRNet High-Resolution Representations.

이는 전체 과정에서 고해상도를 유지할 수 있다.

우리는 고해상도 컨폴루션 stream으로 시작해서, 점진적으로 high-to-low resolution convolution stream을 one by one으로 추가하고, multi-resolution streams을 평행으로 연결한다.

Fig. 2. An example of a high-resolution network. Only the main body is illustrated, and the stem (two stride-2 3 × 3 convolutions) is not included. There are four stages. The 1st stage consists of high-resolution convolutions. The 2nd (3rd, 4th) stage repeats two-resolution (three-resolution, four-resolution) blocks. The detail is given in Section 3

 

HRNet은 semantically 강한 것 뿐만 아니라, 공간적으로도 정밀하다.

1) 우리의 모델 개념은  high-to-low resolution convolution stream을 직선이 아닌, 평행으로 연결하기 때문이다.

따라서, 고해상도를 유지할 수 있다. 저해상도에서 고해상도로 회복시킨 것이 아니기 때문에 공간적으로도 정밀할 수 있다.

2) multi-resolution fusion을 반복함으로써 고해상도 representation을 상승시켰다.

반대로, 다른 fusion scheme들은 대부분 low-level high-resolution과 high-level이지만, low-resolution에서 upsampling한 것을 합치는 방식이다.

따라서, 모든 high-to-low resolution representations은 시맨틱하게 강하다.

 

 

우리는 두 버전의 HRNet 모델을 출시하였다.

첫번째는,  high-resolution convolution stream으로부터 계산된 high-resolution representation 만을 결과로 내뱉는다. 

-> pose estimation에 적용

두번째는, 모든 high-to-low resolution parallel streams으로부터의 representation을 결합한다.

-> semantic segmentation에 적용

 

우리의 모델은 

detection 성능과 작은 물체를 잡는 데에서 좋은 성능을 보여주었다.

 

 

 

 

 

 

반응형
반응형

 

복습


 

 

 

Gradient Descent


 

 

Computational Graphs


 

backpropagation


거꾸로 미분하면서 간다

computational graph를 따라서 gradients를 계산하면서 chain rule을 적용하는 반복적인 과정(input,parameters,intermediates)

 

 

local gradient를 사용하여 계산 진행 

 

 

Another example of backprop


1) df/d(variable) 를 구함 -> f 어떤거?

2) local gradient와 upstream gradient를 사용하여 계산

 

 

 

sigmoid function


grouping nodes -> activation

 

 

patterns in backward flow


??

 

 

Vectorized operations


 

-> 너무 크니까 mini-batch로 뽑아서 할것임

-> 어떤 input이 어떤 output에 영향을 주는지? diagonal matrix(대각행렬), element-wise

gradient값은 output에 얼마나 영향을 주는지를 나타냄

 

 

 

 

 

 

 

 

 

Neural Network


h 는 함수와 같은 것

 

 

 

 

반응형
반응형

 

 

논문 링크입니다.

https://arxiv.org/abs/1511.03339

 

Attention to Scale: Scale-aware Semantic Image Segmentation

Incorporating multi-scale features in fully convolutional neural networks (FCNs) has been a key element to achieving state-of-the-art performance on semantic image segmentation. One common way to extract multi-scale features is to feed multiple resized inp

arxiv.org

 

 

 

0. Title


Attention to Scale: Scale-aware Semantic Image Segmentation

-> 어텐션에서 스케일로.. 스케일을 아는 시맨틱 이미지 세그먼테이션

이 논문의 핵심은 어텐션 매커니즘과 스케일로 예측된다.

 

 

1. Abstract


FCN(Fully Convolutional Network)에 multi-scale feature을 적용한 것은 

시맨틱 세그먼테이션에서 SOTA 성능을 달성하는데 핵심이 되었다.

 

multi-scale feature를 뽑는 데 일반적으로 사용되는 방법은

공유되는 deep network에 다수의 resize된 이미지를 먹이는 것이다.

그리고 나온 결과를 픽셀 단위로 합치는 것이다.

 

우리는 어텐션 매커니즘을 제안한다.

이는 각 픽셀 위치에서 다중 스케일 기능에 부드럽게 가중치를 부여하는 방법을 학습하는 메커니즘이다.

우리는 state-of-the-art segmentation model을 채택하였고, 여기에 우리의 어텐션 모델과 multi-scale input image를 학습하였다.

 

어텐션 모델은 average pooling 과 max pooling 의 성능을 능가할 뿐만 아니라,

다양한 위치와 스케일에서의 feature의 중요성을 진단적으로 시각화할 수 있게 하였다.

 

게다가, multi-scale features를 병합할 때 좋은 성과를 내려면

각 스케일의 output에 대한 추가적인 감독이 필요함을 보여준다.

 

우리의 모델의 효과성을 PASCAL-Person-Part, PASCAL VOC 2012 and a subset of MS-COCO 2014에서

입증하였다.

 

 

2. Conclusion


이 논문에서는 multi-scale input을 활용하기 위해 DeepLab-LargeFOV 모델을 사용하였다. 

세가지 데이터셋에 실험해봄으로써 우리가 알아낸 것이다.

1) multi-scale inputs가 single-scale inputs 보다 더 좋은 성능을 냄

2) 어텐션 모델에 multi-scale features를 적용한 것은 average pooling과 max pooling보다 뛰어날 뿐만 아니라,

다른 위치와 스케일에 따른 features의 중요성을 진단적으로 시각화할 수 있다.

3) 각각의 스케일에 마지막 결과에 추가적인 감독이 있다면 훌륭한 결과가 있을 것이다.

 

 

Figure 8. Qualitative segmentation results on PASCAL-Person-Part validation set.

 

 

3. Introduction


Semantic image segmentation는 각각의 모든 픽셀에 semantic label을 할당하는 태스크이다.

최근에는 FCN 을 기반으로 한 다양한 방식들이  놀라운 성과를 내었다.

성공적인 Semantic image segmentation의 요소 중 한가지는 "multi-scale features"의 사용이다.

 

FCN에는 multi-scale features를 활용하는 두 가지 타입의 네트워크 구조가 있다.

. Different network structures for extracting multi-scale features:

첫 번째는 skip-net이다.

아주 큰 receptive field sizes 때문에 skip-net의 feature는 본질적으로 multi-scale이다.

학습 시간동안 skip-net은 두 가지 프로세스를 거치는데,

딥러닝 백본을 학습하고,  multi-scale feature extraction 과정에서 fine tuning하는 것이다.

이 전략의 문제점은 학습과 feature extraction 과정이 분리되어 있기 때문에 학습 과정이 이상적이지 못 하다는 것이다.

 

두 번째는 share-net이다.

인풋 이미지를 여러 사이즈로 리사이즈하고, 공유된 딥 뉴럴 네트워크로 통과하는 것이다.

그런 다음 다중 스케일 피쳐들을 기반으로 최종 예측값을 계산한다.

 

 

최근, attention model은 컴퓨터 비전과 자연어 처리에서 엄청난 성공을 하였다.

전체 이미지와 시퀀스들을  압축하는 것이 아니라, 어텐션은 가장 유용하고 관련있는 피쳐에 집중한다.

이전의 2D 대상으로한 어텐션 모델들과 다르게, 우리는 scale dimension에서의 효과를 입증해보고자 한다.

 

우리는 sota 모델에 share-net를 적용하였고,

average pooling과 max pooling을 generalize하기 위해 soft attention model을 적용하였다.

attention model illustration

어텐션 모델은 이미지에 나타나 있는 물체의 크기에 따라 

multi-scale feature들에 가중치를 부여하는 방법을 학습힌다.

(예를 들어, 모델은 거칠고 큰 물체에는 큰 가중치를 부여한다.)

각각의 스케일에서, 어텐션 모델은 weight map을 뱉어내는데, 이것은 픽셀 바이 픽셀로 가중치를 구한 것이다.

그리고 FCN에서 생성한 score map의 가중치 합을 뱉어낸다.

 

각각의 스케일마다 추가적인 감독을 소개한다. 성능 개선에 필수적인

우리는 어텐션 모델과 멀티스케일 네트워크를 공동으로 학습시킨다.

 

어텐션 컴포넌트는 average pooling과 max pooling에 비해 상당한 개선을 제공한다.

게다가 diagnostic visualization이 가능하다. 모든 이미지 포지션에서 각각의 스케일의 각각의 피쳐들의 중요성을 시각화함으로써 블랙박스를 벗겨내었다. 

 

 

 

4. Model


1) Review of DeepLab

FCN이 semantic segmentation에서 성공적인 효과를 거두었으므로

FCN의 변형인 DeepLab 모델을 리뷰해보고자 한다.

 

DeepLab은 VGG를 참고하여 16개의 레이어 구조를 채택하였다.

해당 네트워크에 dense feature map을 가져다주는 fully convolution으로 주입하였다.

자세하게는, 마지막 VGG의 fully connected layer가 fully convolutional layer로 변경되었다. (마지막 레이어는 커널 사이즈 1x1)

원래의 VGG-16의 spatial decimation은 32이다. 5개의 stride 2를 가진 max pooling을 사용하였기 때문이다.

 

DeepLab은 atrous 알고리즘을 사용하여 이를 8로 줄였다.

또한 linear interpolation을 사용하여 최종 레이어의 스코어 맵을 원본 이미지 해상도에 매핑한다.

우리는 DeepLab의 여러가지 변형 중, DeepLab-LargeFOV에 초점을 맞춘다.

 

 

2) Attention model for scales

(a) Merging score maps (i.e., last layer output before SoftMax) for two scales. (b) Our proposed attention model makes use of features from FCNs and produces weight maps, reflecting how to do a weighted merge of the FCN-produced score maps at different scales and at different positions.

 

어텐션 모델은 각각의 다른 스케일과 position으로 부터 FCN이 생성한 스코어맵의

가중 합을 어떻게 할지를 반영하는 weight map을 만든다.

즉, multi-scale features를 가중치를 어떻게 할지 학습한다.

 

share-net을 기반으로, 인풋 이미지는 여러 스케일로 리사이즈 된다.

각각의 스케일은 DeepLab을 통과하며 score map을 만든다. (fully convolutional layer)

score map은 bilinear interpolation을 통해 동일한 해상도를 갖도록 리사이즈된다.

 

f : score map

w : importance of feature at position i and scale s

g : weighted sum of score map

 

w를 시각화하면 스케일별로 어텐션을 시각화할 수 있다.

 

 

 

5. Result


Table 1. Results on PASCAL-Person-Part validation set. E-Supv: extra supervision
Table 2. Per-part results on PASCAL-Person-Part validation set with our attention model.

 

Table 3. Results on PASCAL VOC 2012 validation set, pretrained with ImageNet. E-Supv: extra supervision
Table 4. Labeling IOU on the PASCAL VOC 2012 test set.

 

Table 5. Results on PASCAL VOC 2012 validation set, pretrained with MS-COCO. E-Supv: extra supervision.

반응형
반응형

 

 

W는 Input의 해당 픽셀이 얼마나 특정 클래스에 영향을 미치는 지에 대한 값이다.

W의 사이즈 = (클래스 개수) x (인풋 이미지의 픽셀 개수) 

W를 계산해낸 이 loss function은 score 를 보고 W가 얼마나 양적으로 나쁜지 알려주는 척도이다.

이 강의에서 여러가지 loss function을 소개할 것이다.

가장 적게 나쁜 W를 찾아가는 과정이 "최적화" 과정이다.

 

 

 

 

 

Loss function : multi-label SVM


image classification 에서 많이 쓰는 것 -> multi-label SVM

sj = 틀린 함수값, syi = 맞는 합수값

만약 맞는 클래스의 score가 틀린 클래스의 score보다 월등히 크다면, Loss는 0으로 설정한다.

그렇지 않다면, 맞는 클래스의 score에서 틀린 클래스의 score을 빼는 방식으로 Loss를 계산한다.

Hinge Loss 라고도 부른다. x축은 맞는 클래스의 score이고, y축은 loss이다.

맞는 클래스 score이 높아지면, loss는 감소한다.

loss가 0이 되면 잘 분류한 것으로 보면 된다.

 

from builtins import range
import numpy as np
from random import shuffle
from past.builtins import xrange


def svm_loss_naive(W, X, y, reg):
    """
    Structured SVM loss function, naive implementation (with loops).

    Inputs have dimension D, there are C classes, and we operate on minibatches
    of N examples.

    Inputs:
    - W: A numpy array of shape (D, C) containing weights.
    - X: A numpy array of shape (N, D) containing a minibatch of data.
    - y: A numpy array of shape (N,) containing training labels; y[i] = c means
      that X[i] has label c, where 0 <= c < C.
    - reg: (float) regularization strength

    Returns a tuple of:
    - loss as single float
    - gradient with respect to weights W; an array of same shape as W
    """
    dW = np.zeros(W.shape)  # initialize the gradient as zero

    # compute the loss and the gradient
    num_classes = W.shape[1]
    num_train = X.shape[0]
    loss = 0.0

    for i in xrange(num_train):
        scores = X[i].dot(W)
        correct_class_score = scores[y[i]]
        loss_contributors_count = 0
        for j in xrange(num_classes):
            if j == y[i]:
                continue
            margin = scores[j] - correct_class_score + 1  
            if margin > 0:
                loss += margin
                dW[:, j] += X[i] # [GD] 틀린 애
                loss_contributors_count += 1
        dW[:, y[i]] += (-1) * loss_contributors_count * X[i] # [GD] 맞는 애 

    loss /= num_train
    dW /= num_train

	# [Regularization]
    loss += reg * np.sum(W * W)
    dW += 2 * reg * W  

    #############################################################################
    # TODO:                                                                     #
    # Compute the gradient of the loss function and store it dW.                #
    # Rather that first computing the loss and then computing the derivative,   #
    # it may be simpler to compute the derivative at the same time that the     #
    # loss is being computed. As a result you may need to modify some of the    #
    # code above to compute the gradient.                                       #
    #############################################################################
    # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****


    # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

    return loss, dW


def svm_loss_vectorized(W, X, y, reg):
    """
    Structured SVM loss function, vectorized implementation.

    Inputs and outputs are the same as svm_loss_naive.
    """
    loss = 0.0
    dW = np.zeros(W.shape)  # initialize the gradient as zero

    #############################################################################
    # TODO:                                                                     #
    # Implement a vectorized version of the structured SVM loss, storing the    #
    # result in loss.                                                           #
    #############################################################################
    # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

    num_train = X.shape[0]
    s = X.dot(W)

    correct_score = s[list(range(num_train)), y]
    correct_score = correct_score.reshape(num_train, -1)

    s += 1 - correct_score
    s[list(range(num_train)), y] = 0
    loss = np.sum(np.fmax(s, 0)) / num_train
    loss += reg * np.sum(W * W)

    # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

    #############################################################################
    # TODO:                                                                     #
    # Implement a vectorized version of the gradient for the structured SVM     #
    # loss, storing the result in dW.                                           #
    #                                                                           #
    # Hint: Instead of computing the gradient from scratch, it may be easier    #
    # to reuse some of the intermediate values that you used to compute the     #
    # loss.                                                                     #
    #############################################################################
    # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

    X_mask = np.zeros(s.shape)
    X_mask[s > 0] = 1
    X_mask[np.arange(num_train), y] = -np.sum(X_mask, axis=1)
    dW = X.T.dot(X_mask)
    dW /= num_train
    dW += 2 * reg * W

    # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

    return loss, dW

 

ex)

Q. 어떻게 +1을 정한거죠?

score의 절대적인 값이 아니라 score들 간의 상대적인 차이가 의미가 있는 것이고,

correct score이 incorrect score보다 상당히 높아야 하기 때문에 +1을 한 것이다.

1이라는 숫자는 미분 계산을 통해 씻겨 나가기 때문에 영향이 거의 없어서 괜찮다.

 

 

loss값은 상대적인 값임.

Q. 만약 car의 score가 조금 바뀐다면, loss 값도 변할까?

A. No, 이미 다른 틀린 score보다 1이상 크기 때문에 score가 조금 바뀌어도 loss에는 영향이 없다.

 

Q. multiclass SVM loss의 최소, 최대값은?

A. 최소 : 0, 최대 : 무한대

 

Q. correct score과 incorrect score의 차이가 거의 없다면 multiclass SVM loss는 어떻게 될까?

A. (class의 개수) - 1

=> 좋은 디버깅 툴임.

 

Q. multiclass SVM loss에서 max를 mean으로 변경하면?

A. 차이가 없다. loss값의 상대적인 차이가 의미가 있는 것이므로 max든 mean으로 하든간에 차이가 없다.

 

Q.multiclass SVM loss에서 제곱을 추가한다면?

A. 차이가 있다. 차이가 큰 값의 차이를 더 키우는 것이기 때문에 다른 의미가 된다.

 

Q. L = 0으로 만드는 W가 있다면, 이 값 하나 뿐일까?

A. 아니다.

 

 

Loss function은 어떤 타입의 에러를 더 고려하느냐를 결정하는 것.

 

 

loss가 0인 W가 두배가 된다고 하더라도 loss는 still 0

 

 

모델과 loss function은 training이아니라 test dataset에서 잘 작동해야한다.

training set에만 너무 fit하지 않고 제너럴한 모델을 만들기 위해서

우리는 regularization이라는 방법을 사용한다.

람다는 하이퍼파라미터인데, 굉장히 중요한 요소이다.

 

 

 Regularization


 

L2 regularization은 w2를 선호할 것이다. norm 이 더 작기 때문에. L2는 값이 골고루 spread 되어 있는 것이 덜 복잡하다고 판단한다.

L1 regularization은 w1를 선호할 것이다. 값은 같지만, L1은 직관적으로 sparse solution(대부분이 0이고 소수만 non-zero인)을 선호하기 때문이다. L1의 complexity 측정 방식은 non-zero값의 개수일 것이다.

 

L2 Loss 는 직관적으로 오차의 제곱을 더하기 때문에 Outlier 에 더 큰 영향을 받는다.

L1 Loss 가 L2 Loss 에 비해 Outlier 에 대하여 더 Robust(덜 민감 혹은 둔감) 하다.

 

L2 Loss 는 모든 데이터에서 score가 고르게 분포할 것을 유도.

 

모델과 태스크에 따라 L1, L2 정규화 방식을 선택할 것!

 

 

 

 

Softmax Classifier(Multinomial Logistic Regression)


SVM에서는 점수에 어떠한 해석을 하지 못했다.

하지만 softmax classifier에서는 점수에 대한 해석을 할 수 있다.

softmax는 0~1의 확률 분포를 뱉어낸다.

 

정답 확률을 모든 확률의 합으로 나눈 것에 -Log를 취한다. (KL divergence)

만약, 정답 확률이 높아서 거의 1에 가깝다면, loss는 정답 확률에 negative log를 취한 것이 될 것이다.

즉, 정답 확률이 높을수록 loss는 감소한다.

 

def softmax_loss_naive(W, X, y, reg):
    """
    Softmax loss function, naive implementation (with loops)

    Inputs have dimension D, there are C classes, and we operate on minibatches
    of N examples.

    Inputs:
    - W: A numpy array of shape (D, C) containing weights.
    - X: A numpy array of shape (N, D) containing a minibatch of data.
    - y: A numpy array of shape (N,) containing training labels; y[i] = c means
      that X[i] has label c, where 0 <= c < C.
    - reg: (float) regularization strength

    Returns a tuple of:
    - loss as single float
    - gradient with respect to weights W; an array of same shape as W
    """
    # Initialize the loss and gradient to zero.
    loss = 0.0
    dW = np.zeros_like(W)

    #############################################################################
    # TODO: Compute the softmax loss and its gradient using explicit loops.     #
    # Store the loss in loss and the gradient in dW. If you are not careful     #
    # here, it is easy to run into numeric instability. Don't forget the        #
    # regularization!                                                           #
    #############################################################################
    # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

    num_classes = W.shape[1]
    num_train = X.shape[0]

    for i in xrange(num_train):

        scores = X[i].dot(W)
        scores -= scores.max()
        scores_expsum = np.sum(np.exp(scores))
        cor_ex = np.exp(scores[y[i]])
        loss += - np.log( cor_ex / scores_expsum)

        dW[:, y[i]] += (-1) * (scores_expsum - cor_ex) / scores_expsum * X[i] # [gd] 맞은 애
        for j in xrange(num_classes):
            if j == y[i]:
                continue
            dW[:, j] += np.exp(scores[j]) / scores_expsum * X[i] # [gd] 틀린 애

    loss /= num_train
    dW /= num_train
    
    # [regulation]
    loss += reg * np.sum(W * W)
    dW += 2 * reg * W


    # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

    return loss, dW

 

Q. softmax의 최소, 최대값은?

A. 최소값 : 0, 최대값 : 무한대(정답 확률이 마이너스 무한대일 때)

 

Q. 모든 s가 거의 0에 가까울 때 loss는?

A. -log(1/C) = logC

=> senity check? => 좋은 디버깅 툴임.

 

correct label의 score과 incorrect label의 score의 값이 매우 차이가 나면,

SVM은 correct score가 조금 바뀌어도 loss 값에 영향이 없지만,

softmax loss값은 바뀐다.

 

loss function은 GT보다 얼마나 다른지 알려주는 지표가 된다. 

loss를 최소화하는 W를 선택한다. -> 딥러닝 학습 과정

 

 

 

 

어떻게 W를 변경하며 최적 값을 찾을까?

optimization function

optimization function #1 random search


bad idea

 

optimization function #2 follow the slope


work well

slope -> derivative of a function 미분값

gradient -> the vector of partial derivative along each dimension

h만큼의 어떤 방향으로든 이동한다고 가정하면 기울기를 반환한다.

 

[ numeric gradient ] 

모든 W값의 값의 미분값을 구한다. -> 매우 시간이 많이 걸림.

 

하지만, 다행히도 이 과정을 할 필요가 없다.

loss가 그 자체로 W의 함수이기 때문에, loss function에 w로 편미분을 하면 된다.

[ analytic gradient ]

 

 

Gradient Descent


W를 랜덤으로 초기화하고

weight를 계속 gradient의 반대 방향으로 업데이트한다.

gradient는 높은 지점을 향해서 가기 때문에, 반대 방향으로 마이너스를 붙여서 업데이트 한다. 

step size = learning rate => 하이퍼 파라미터

빨간색이 loss 최소 지점

 

 

SGD


샘플된 미니배치를 사용함으로써 계산 속도를 빠르게 하는 방법. 

 

 

 

Image Features representation 여러 방식


 

 

 

Image features vs ConvNets


 

 

Q. 궁금한 점 \ 알아볼 점


- penalizing이 무슨 뜻인지?

오버피팅을 막고 일반화한다는 것인가? 아니면 학습한다는 것인가?

- numeric gradient -> analytic gradient?

- 과제에서 dw는 어떻게 구하는 건지??

반응형
반응형

 

 

이번 수업에서는 알고리즘이 실제로 어떻게 작동하는지 볼 것이다.

What is Classification?


Classification 태스크는 input을 넣으면 어떤 물체인지의 category를 예측한다.

사람에게는 쉽지만, 기계에게는 굉장히 어려운 일이다.

 

 

Problem : Semantic Gap


이미지는 예를 들어 800(w) x 600(h) x 3(RGB)개의 0부터 255의 값으로 이루어진 픽셀로 이루어져 있다.

 

이 이미지 정보는 semantic label을 제공하는 것 -> 하지만, 하나하나의 픽셀로 고양이 시맨틱 이미지를 인식하기는 매우 어렵다.

Challenge : 카메라의 각도가 달라짐 /  빛이 어두워지거나 / 고양이가 다른 포즈를 하거나 / 다른 물체에 숨겨져 있으면 더 어려워진다.

모든 상황을 고려하여 이미지를 분류하여야 하므로 기계에게는 매우 어려운 일이다.

 

 

여러가지 시도들 


1) 모든 엣지와 코너를 찾아서 그린다.

-> not worked, 다루기 힘들고 고양이가 아닌 다른 물체는 인식 못한다.

 

 

 

2) Data-driven approach

- 이미지와 카테고리를 가진 데이터를 수집한다.

- 분류기를 학습하기 위해 머신러닝을 이용한다.

- 새로운 이미지에 분류기를 평가한다.

train & predict 두 과정으로 나뉜다.

-> 데이터 드리븐 방식이 딥러닝보다는 좀 더 일반적이고, 간단한 분류기를 사용할 수 있다는 점에서 좋다.

 

 

 

 

2) - a) First classifier : Nearest classifier


Nearest classifier : 학습된 데이터에서 가장 비슷한 이미지를 찾아 예측하는 알고리즘

성능이 아주 좋지는 않다.

 

CIFAR10 으로 테스트 해볼 것이다. 10 classes, 50000 training images, 10000 testing images

테스트 예시)

 

 

비슷한 이미지인지 아닌지는 어떤 기준으로 계산할까?

Distance Function 1 : L1 distance


 

 

 

학습 시에는 x와 y를 지정해주기만 하면 된다.

예측 시에는 모든 학습 이미지를 살펴 보면서 테스트 이미지와 가장 L1 or L2 distance가 작은 학습 이미지를 찾아서 

그 학습 이미지의 레이블을 반환한다.

Q. how fast are training and prediction?

A. train : O(1), predict : O(N)

-> this is bad, 학습이 느리고 예측 과정은 빨라야 실제로 사용할 수 있기 때문에

 

결과는 어떻게 보일까?

-> 초록색 안에 노란색이 들어가 있거나

-> 초록색 영역이 파란색 영역에 침입한 것은 노이즈임

 

 

 

2) - b) Second classifier : K - Nearest classifier


K - Nearest classifier : top K 중에 가장 많은 투표를 받은 레이블로 선택하는 알고리즘

* X.shape = (500, 3072)

* self.X_train.shape = (5000, 3072)

# Test your implementation:
dists = classifier.compute_distances_two_loops(X_test)
print(dists.shape)
def compute_distances_two_loops(self, X):
    num_test = X.shape[0]
    num_train = self.X_train.shape[0]
    dists = np.zeros((num_test, num_train))

    for i in range(num_test):
        for j in range(num_train):
            #####################################################################
            # TODO:                                                             #
            # Compute the l2 distance between the ith test point and the jth    #
            # training point, and store the result in dists[i, j]. You should   #
            # not use a loop over dimension, nor use np.linalg.norm().          #
            #####################################################################
            # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

            dists[i][j] = math.sqrt(sum((X[i] - self.X_train[j]) ** 2))

            # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

    return dists
def compute_distances_one_loop(self, X):

    num_test = X.shape[0]
    num_train = self.X_train.shape[0]
    dists = np.zeros((num_test, num_train))
    for i in range(num_test):
        #######################################################################
        # TODO:                                                               #
        # Compute the l2 distance between the ith test point and all training #
        # points, and store the result in dists[i, :].                        #
        # Do not use np.linalg.norm().                                        #
        #######################################################################
        # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

        sum_matrix = (self.X_train - X[i]) ** 2
        dists[i, :] = np.sqrt(sum_matrix.sum(axis=1)).T

        # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****
    return dists
def compute_distances_no_loops(self, X):

    num_test = X.shape[0]
    num_train = self.X_train.shape[0]
    dists = np.zeros((num_test, num_train))
    #########################################################################
    # TODO:                                                                 #
    # Compute the l2 distance between all test points and all training      #
    # points without using any explicit loops, and store the result in      #
    # dists.                                                                #
    #                                                                       #
    # You should implement this function using only basic array operations; #
    # in particular you should not use functions from scipy,                #
    # nor use np.linalg.norm().                                             #
    #                                                                       #
    # HINT: Try to formulate the l2 distance using matrix multiplication    #
    #       and two broadcast sums.                                         #
    #########################################################################
    # *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

    sx = np.sum(X**2, axis=1, keepdims=True)
    sy = np.sum(self.X_train**2, axis=1, keepdims=True)
    dists = np.sqrt(-2 * X.dot(self.X_train.T) + sx + sy.T)

    # *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****
    return dists

 

 

 

 

Distance Function 2 : L2 distance (=유클리디안 거리)


 

L1 distance는 좌표계에 따르고,

L2 distance는 좌표계에 상관없는 숫자가 되기 때문데 좀 더 매끄러운 라인을 그리는 것을 알 수 있다.

distance function을 변경함으로써 원하는 방식으로 데이터들간의 차이를 정의할 수 있다.

어떤 타입의 데이터든 일반적으로 적용할 수 있기 때문에 처음에 다가가기에 적합한 개념이다.

 

 

Hyperparameter


모델에 의해 계산되는 값이 아니라, 사람이 직접 설정해줘야 하는 파라미터

ex) K, distance function

 

 

How to set hyperparameter?


Idea #1) 가장 좋은 성능을 가져다주는 하이퍼파라미터 선택 -> Bad Idea

Idea #2) split into train and test data, test 데이터에서 성능이 좋은 하이퍼파라미터 선택 -> Bad Idea -> 새로운 데이터는 어떤게 올지 모르기 때문에

Idea #3) train, val, test 데이터로 나누기 -> Good Idea -> 새로운 데이터에도 적용될 수 있어서

* training set에는 Label을 알려주고 학습하는 거지만, validation set은 label 없고 예측하는 것임

 

 

 

Idae #4) cross-validation -> small dataset일 때 많이씀, deep learning x

num_folds = 5
k_choices = [1, 3, 5, 8, 10, 12, 15, 20, 50, 100]

X_train_folds = []
y_train_folds = []
################################################################################
# TODO:                                                                        #
# Split up the training data into folds. After splitting, X_train_folds and    #
# y_train_folds should each be lists of length num_folds, where                #
# y_train_folds[i] is the label vector for the points in X_train_folds[i].     #
# Hint: Look up the numpy array_split function.                                #
################################################################################
# *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

X_train_folds = np.array_split(X_train, num_folds)
y_train_folds = np.array_split(y_train, num_folds)

X_train_cv = np.concatenate([X_train_folds[0], X_train_folds[1]])

# *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

# A dictionary holding the accuracies for different values of k that we find
# when running cross-validation. After running cross-validation,
# k_to_accuracies[k] should be a list of length num_folds giving the different
# accuracy values that we found when using that value of k.
k_to_accuracies = {}


################################################################################
# TODO:                                                                        #
# Perform k-fold cross validation to find the best value of k. For each        #
# possible value of k, run the k-nearest-neighbor algorithm num_folds times,   #
# where in each case you use all but one of the folds as training data and the #
# last fold as a validation set. Store the accuracies for all fold and all     #
# values of k in the k_to_accuracies dictionary.                               #
################################################################################
# *****START OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

num_valid = len(X_train) / num_folds
for kSelected in k_choices:
    accuracies = []
    for validIdx in range(num_folds):
        X_train_cv = []
        y_train_cv = []
        for idx in range(num_folds):
            if idx == validIdx:
                X_valid_cv = X_train_folds[idx]
                y_valid_cv = y_train_folds[idx]
            else:
                if len(X_train_cv) == 0:
                    X_train_cv = X_train_folds[idx]
                else:
                    X_train_cv = np.concatenate([X_train_cv, X_train_folds[idx]])
                
                if len(y_train_cv) == 0:
                    y_train_cv = y_train_folds[idx]
                else:
                    y_train_cv = np.concatenate([y_train_cv, y_train_folds[idx]])

        classifier.train(X_train_cv, y_train_cv)
        dists_valid = classifier.compute_distances_no_loops(X_valid_cv)

        y_valid_pred = classifier.predict_labels(dists_valid, k=kSelected)
        num_correct = np.sum(y_valid_pred == y_valid_cv)
        accuracy = float(num_correct) / num_valid
        accuracies.append(accuracy)

    k_to_accuracies[kSelected] = accuracies

# *****END OF YOUR CODE (DO NOT DELETE/MODIFY THIS LINE)*****

# Print out the computed accuracies
for k in sorted(k_to_accuracies):
    for accuracy in k_to_accuracies[k]:
        print('k = %d, accuracy = %f' % (k, accuracy))

 

- K-nearest classifier on images는 사용되지 않는다.

1) test time 너무 오래걸림

2) distance metrics는 이미지 데이터에 적합하지 않음

3) dimensionality 문제 

 

 

 

 

Linear Classification : score function f(x, W) = Wx + b


deep learning은 레고 같은 것이고, linear classification은 가장 기본 뼈대 블럭같은 것이다.

 

 

3) Paramatic Approach


input(x), W(weight)

K-nearest는 테스트할 때 전체 이미지를 사용하지만,

Paramatic approach에서는 input 이미지를 요약하여 W라는 파라미터에 저장하고 요약본을 사용하여 테스트한다.

 

 

함수 f는 어떻게 설정할 것인가? : Linear classifier


f(x, W) = Wx

10 x 1 = (10 x 3072) x (3072 x 1)

W 사이즈의 의미는 10 categories와 3072 input pixels가 있다는 것이다.

3027라는 픽셀의 수는 width * height * 3(RGB)이다.

 

ex) w의 width는 카테고리 수, height 인풋의 픽셀 수이다.

 

 

linear classifier의 한계


1) 카테고리당 하나의 template만 인식한다는 것

 

 

2) 선형으로 표현하기에는 한계가 있다는 것

 

 

 

 

다음 수업 내용


W를 찾는 데 어떤 알고리즘을 사용할 것인가?

- loss function

- optimization

- Convnets

 

 

Q. 궁금한 점 & 더 알아볼 점


- dimensionality 문제란?

- 카테고리당 하나의 template만 인식한다는 것이 어떤 의미인지?

반응형
반응형

 

논문 링크입니다.

https://paperswithcode.com/paper/hierarchical-multi-scale-attention-for

 

Papers with Code - Hierarchical Multi-Scale Attention for Semantic Segmentation

7 code implementations in PyTorch and TensorFlow. Multi-scale inference is commonly used to improve the results of semantic segmentation. Multiple images scales are passed through a network and then the results are combined with averaging or max pooling. I

paperswithcode.com

 

 

0. Title


HIERARCHICAL MULTI-SCALE ATTENTION FOR SEMANTIC SEGMENTATION

-> semantic segmentation을 위한 계층적 multi-scale 어텐션

즉 이 논문의 핵심은, 계층적이고 + multi-scale이고 + attention을 활용한 것이지 않을까 싶다.

 

 

1. ABSTRACT


multi scale 추론은 semantic segmentation의 성능을 올리기 위해 자주 사용되는 기법이다.

다중 이미지 scale들이 네트워크를 통과하고, 그 결과물은 average pooling이나 max pooling으로 결합된다.

이 논문에서는 multi-scale 예측결과에 attention-based 접근법을 적용하였다.

우리의 attention mechanism은 계층적이다. 다른 최근의 접근법들보다 약 4배의 메모리 효율을 향상시킬 수 있다.

 

게다가 더 큰 crop-size를 이용해서 학습시킬 수 있게 한다. 이는 곧 더 높은 모델 정확도를 가질 수 있다는 의미이다.

우리는 두 가지의 데이터셋에 적용해 보았다.

1) Cityscapes -> generalization을 위해 leverage auto-labeling 기법 사용

2) Mapillary Vistas

-> 두 가지의 데이터셋에서 모두 state-of-the-art한 결과를 낼 수 있었다.

 

 

 

2. Conclusion


우리는 semantic segmentation에 계층적 multi-scale attention 기법을 적용하였다.

우리는 segmentation accuracy을 향상시켰다. 메모리와 계산을 효율적으로 처리함과 동시에,

 

 

 

 

3. Result (Data 훑기)


1) implementation protocol

우리의 implementation protocol을 자세하게 설명할 것이다.

 

- Training Detail

Pytorch와 Nvidia DGX 서버(8 GPU) with *mixed precision

*mixed precision은 모델 학습시 FP16, FP32 부동 소수점 유형을 상황에 따라 유연하게 사용하여 학습을 더 빠르게 실행하고 메모리를 적게 사용하는 방법이다

: Semantic and attention predictions at every scale level for two different scenes

왼쪽 사진은 디테일한 문제 -> 2x scale에서 가장 잘 예측, attention도 2x에서 가장 잘 attend함

오른쪽 사진은 큰 영역 세그먼테이션 문제 -> 0.5 scale에서 가장 잘 예측, attention도 가장 성공적으로 집중한 것이 0.5였을 때임

 

white color for attention이 높은 값을 가졌음(거의 1.0)

모든 scale의 attention 합은 1.0임

 

Auto-generated coarse labels은 GT(Original coarse label)보다 더 디테일하게 레이블링되었음

더 정교한 레이블링은 레이블들의 분포를 향상시켰다. 작고 큰 아이템들이 모두 표시되었기 때문이다. 기존에 큰 오브젝트만 있던 것과는 다르게

 

 

Table 2 : Ablation study on Cityscapes validation set.

베이스라인은 HRNet-OCR을 뼈대로 썼다. 

MS attention이 우리가 제안한 multi-scale attention method이다.

Auto-labeling은 학습시에, 자동적으로 생성된 coarse label을 사용하였는지, 아니면 ground truth coarse label을 사용하였는지를 나타낸다.

두가지의 조합이 가장 좋은 성능을 나타내었다.

 

 

- 학습 세팅

optimizer로는 SGD, GPU당 1 batch size, momentum = 0.9, *weight decay = 5e(-4)

*Weight decay는 모델의 weight의 제곱합을 패널티 텀으로 주어 (=제약을 걸어) loss를 최소화 하는 것을 말한다. overfittin을 줄이기 위해 사용

“polynomial” learning rate policy 사용

첫번째 loss function으로 RMI 사용

auxiliary loss function으로 cross-entropy 사용

 

Cityscapes 데이터셋에 2.0 poly exponent

초기 learning rate = 0.02

200 에포크 for 4 DGX nodes

class uniform sampling in data loader -> 클래스별로 비슷하게 뽑기 위해서 -> 클래스별 데이터 분포가 불균형할 때 좋음

 

- Data augmentation

gaussian blur, color augmentation, random horizontal flip and random scaling (0.5x - 2.0x) on the input images

crop size of 2048x1024 for Cityscapes and 1856x1024 for Mapillary

 

 

2) Results on Cityscape

뼈대로써 HRNet-OCR을 사용하였고, multi-scale attention method를 주로 사용하였다.

RMI을 main segmentation head로 사용.

auxiliary segmentation head에는 cross entropy 사용. 왜냐하면 RMI가 학습이 깊어질수록 학습 정확도를 떨어트리는 것을 확인했기 때문이다.

 

더 큰 Mapillary dataset을 먼저 학습시키고, pre-trained model을 Cityscapes에 다시 학습시켰다.

Mapillary dataset에는 attention을 학습시키지 않았다.

우리의 Cityscapes의 SOTA 레시피는 train + val images / auto-labelled coarse images로 달성하였다.

50%는 train + val images 에서 샘플을 뽑았고, 나머지는 auto-labelled coarse images에서 뽑았다.

inference time에서 {0.5, 1.0, 2.0} 의 scale과 image flipping을 사용하였다.

TABLE2 : Ablation study on Cityscapes validation set.

MS Attention은 0.5% IoU +

Auto-labeling은 1.1% IoU +

Both 1.4% IoU +

 

Table 3: Comparison vs other methods on the Cityscapes test set

Cityscapes test set score에서 best score로 85.1을 달성하였다. 3가지 클래스를 빼고 모든 클래스에서 가장 우수하였음.

 

3) Results on Mapillary Vistas

Mapillary Vistas은 굉장히 큰 데이터셋으로, 25,000개의 높은 해상도 이미지와 66개의 object categories로 구성됨.

HRNet-OCR을 줄기로 썼고, multi-scale attention method를 사용하였다.

Mapillary images에는 다양한 해상도가 있기 떄문에 long edge를 2177로 하여 resize 했다.

 

ImageNet classification에서 미리 학습한 HRNet weight를 사용하였다.

Mapillary에는 더 큰 메모리가 필요했기 때문에, crop size를 1856 x 1024로 줄였다.

Table 4: Comparison of results on Mapillary validation set.

두번째로 높은 IOU를 가진 Panoptic Deeplab보다 2.4 더 높은 성능 달성.

 

 

 

 

Introduction


semantic segmentation은 모든 픽셀을 N개의 클래스 중 하나로 label하는 태스크이다.

이 태스크에는 trade-off 관계가 있는데,

특정 유형의 예측은 lower inference resolution에서 가장 잘 처리되지만,

어떤 예측은 higher inference resolution에서 잘 처리된다는 것이다.

 

디테일한 부분은 확대된 이미지 사이즈에서 더 잘 예측됩니다.

global context가 필요한 큰 구조는 축소된 이미지 사이즈에서 더 좋다.

왜냐하면, network의 receptive field가 더 필요한 부분을 볼 수 있게 하기 때문이다.

이를 "class confusion"이라고 부른다.

Illustration of common failures modes for semantic segmentation as they relate to inference scale.

첫번째 행에서 2.0x scale (high resolution)일 때 디테일한 사람의 형상을 더 잘 잡아내는 것을 볼 수 있다.

두번째 행에서는 커다란 도로와 나눠진 영역을 0.5x scale (low resolution)일 때 더 잘 segment되는 것을 볼 수 있다.

 

 

multi-scale inference를 사용하는 것은 이 trade-off를 다루기 위해 자주 사용되는 방식이다.

예측은 다양한 규모로 이루어지고, 결과는 averaging or max pooling으로 합쳐진다.

averaging을 사용하는 것은 일반적으로 성능을 향상시키지만, 가장 좋은 결과를 가장 나쁜 결과와 결합한다는 단점이 있다.

반대로, max pooling은 픽셀당 가장 좋은 하나의 scale 결과를 선택할 수 있다. (weighted combination으로)

 

이러한 문제를 해결하기 위해 attention method를 채택하였다. 픽셀 레벨에서 multi-scale predictions을 어떻게 조합할지 예측하기 위해.

네트워크가 인접 척도간의 상대적 가중치를 예측하는 계층적 attention method를 제안한다. 

계층적이라는 성질 때문에, training pipeline에서만 하나의 추가 scale로 augment할 수 있었다.

예를 들어, 타겟 inference scale이 {0.5, 1.0, 2.0}이면, 다른 어텐션 방식들은 모든 스케일로 학습시키길 요구한다. 4.25x (0.5^2 + 2.0^2 )의 학습 비용을 발생시키면서

우리의 방식은 학습시 , 오직 추가 0.5x 스케일만 추가하였다. 0.25x (0.5^2 ) 의 학습 비용 발생시키면서

게다가, 우리의 계층적 매커니즘은 inference time에서 유연성을 부여할 수 있다.이전의 방식보다(only use training scales during inference)

 

Cityscapes에서 SOTA를 달성하기 위해 auto-labelling을 시행하였다. 데이터셋의 다양성을 부여하기 위해 

이로인해 일반화 효과가 있었다.

 

 

요약


- hierarchical multi-scale attention mechanism으로 class confusion와 fine detail 문제를 개선하였다. 다수의 scale을 사용함으로써

- hard-threshold based auto-labelling strategyunlabelled image를 활용하고, IOU를 높였다.

- Cityscapes (85.1 IOU)와 Mapillary Vistas (61.1 IOU)에서 SOTA를 달성하였다.

 

 

 

Related Work


1) Multi-scale context methods

우리의 SOTA는 low output stride를 사용하였다. (input image size와 output size의 비율로, 높을수록 축소)

이것은 fine detail 문제를 더 잘 해결할 수 있게 하였고, receptive field가 줄어드는 효과가 있었다.

 

다만, 이렇게 줄어든 receptive field는 이미지에서 커다란 물체를 인식하기에 어려움이 있다.

Pyramid pooling은 multi-scale context를 합침으로써 줄어든 receptive field 문제를 보완할 수 있다.

PSPNet은 spatial pyramid pooling을 사용함으로써 multiple scale로부터 feature들을 병합하였다. (pooling의 순서와 convolution operation을 이용해)

DeepLab은 다양한 레벨의 dilation을 적용한 astrous convolutions를 사용하는 Astrous Spatial Pyramid Pooling을 이용하였다. 이로인해, PSPNet보다 더 밀집한 feature를 생성해 낼 수 있었다.

 

2) Relational context methods

일반적으로, pyramid pooling은 고정적이고 사각형의 영역을 가지고 수행한다. pooling과 dilation이 일반적으로 대칭적인 패션을 이루고 있기 때문이다.  

게다가 그러한 기법은 정적이고 학습되지 않는 경향이 있다.

그러나, relational context method는 픽셀간의 관계로 문맥을 파악하고, 사각형 영역에 국한되지 않는다.

relational context method는 이미지 구성을 기반으로 형성된다.

따라서 non-square한 semantic regions에 적절하다. OCRNet, DANET, CFNet, OCNet도 Relational context methods를 사용한다.

 

3) Multi-scale inference

relation과 multi-scale 모두 multi-scale evaluation을 쓴다.

multi-scale에서 prediction을 조합하는 데에 두가지 접근법이 있다. 

average pooling과 max pooliing이다. (average pooling이 더 일반적이다)

 

하지만, average pooling은 모든 결과를 동일한 가중치로 합치기 때문에 최적이 아닐 수 있다.

 

 

우리의 hierarchical based attention mechanism는 추론 시간이 scale 개수에 구애받지 않는다.

게다가, 우리의 모델은 average-pooling보다 더 좋은 성능을 냄과 동시에, 클래스별/장면별 다양한 스케일의 중요성을 시각화하였다.

또한, 하나의 스케일을 사용하는 다른 모델들보다 뛰어나고, 고해상도 예측을 생성하는데에 multi-level feature를 사용하여 더 좋은 attention을 실현시킴

 

4) Auto-labelling

 

 

Hierarchical multi-scale attention


우리의 attention 매커니즘은 [1] Liang-Chieh Chen, Yi Yang, Jiang Wang, Wei Xu, and Alan L. Yuille. Attention to scale: Scale-aware semantic image segmentation, 2015.과 매우 닮아있다. dense mask가 각각의 스케일마다 학습되어지는것과 multi-scalse prediction들이 pixel-wise summation으로 mask들 사이에서 결합된다는 것이다. Chen의 모델을 Explicit method, 우리 모델을 Hierarchical mothod라고 하자.

우리는 모든 attention mask를 학습시키는 것 대신에, 인접한 스케일 사이의 상대적인 attention mask를 학습하였다.

장점 1) 유연하게 스케일을 선택할 수 있다. 추론에서 0.25x나 2.0x scale을 0.5x와 1.0x로 학습된 모델에 계층적으로 추가하는 것이 가능하다. 이전의 모델들은 학습시와 동일한 스케일만 사용할 수 있었다.

장점 2) training efficiency를 향상시킬 수 있다. explicit model에서는 0.5, 1.0, 2.0 스케일을 사용하면, the training cost is 0.5^2 + 1.0^2 + 2.0^2 = 5.25 였다. 하지만 계층적 모델은 0.5^2 + 1.0^2 = 1.25 이면 된다.

 

 

 

Architecture


Backbone : HRNet-OCR

Semantic Head : (3x3 conv) → (BN) → (ReLU) → (3x3 conv) → (BN) → (ReLU) → (1x1 conv)

Attention Head : semantic head와 구조적으로 동일, 마지막 convolutional output만 single channel

semantic and attention heads는 OCR block에서 가져온 feature들을 먹였다. 

auxiliary semantic head : OCR하기 전에 HRNet trunk로부터 직접 feature를 가져오는 부분, (1x1 conv) → (BN) → (ReLU) → (1x1 conv)

 

attention이 semantic logits에 모두 적용되고 나서, 예측 결과는 target image size로 upsampling 된다.(bilinear upsampling)

 

Analysis


Table 1: Comparison of our hierarchical multi-scale attention method vs. other approaches on Mapillary validation set

 

 baseline averaging approach (49.4) or the explicit approach (51.4)보다 더 좋은 성능(51.6) 을 내었다.

Unlike the explicit method 0.25x scale 을 추가하였다. 0.25x scale을 추가하니 re-training을 할 필요가 없어졌다.

flexibility at inference time가 우리의 최대 장점이다. 학습은 한번 할 수 있지만, inference는 다양한 스케일을 선택하여 유연하게 할 수 있다.

 

한 가지 더, average pooling 방식에 0.25x 스케일을 추가하면 해로운 영향(-0.7 IOU)이 있는 것으로 나왔다.

반면, 우리의 계층적 모델은 0.6 IOU가 향상되었다.

baseline averaging method에서는 0.25x 스케일 데이터가 다른 스케일들과 합쳐질 때 너무 거친 나머지 여러 클래스들에서 1.5 IOU의 감소가 이루어 졌다. 

예측의 거친 정도는 엣지와 fine detail에 해롭다.

하지만, 우리의 모델에서는 0.25x 스케일을 가장 적절한 방식으로 적용하였기 때문에 0.25x scale 결과는 가장자리에는 적용하지 않았음

 

 

 

 

Question


- RMI

 

반응형

+ Recent posts