이 논문은 SOLO 논문을 읽다가 알게 되었는데 깊이 생각해 보지 않은 문제에 대해 이슈 제기를 하고 해결법을 

제안해 정리 해 보고자 한다.  

본인이 생각하는 흐름의 자연스러움 때문에 논문의 흐름과는 다른 흐름으로 정리했다. 

 

paper: 

An intriguing failing of convolution neural networks and the CoordConv solution

 

An Intriguing Failing of Convolutional Neural Networks and the CoordConv Solution

Few ideas have enjoyed as large an impact on deep learning as convolution. For any problem involving pixels or spatial representations, common intuition holds that convolutional neural networks may be appropriate. In this paper we show a striking counterex

arxiv.org

 

문제 제기:

이 논문에서는 coordinate transform 라는 문제를 제기 하고 우리에게 친숙한 convolution이 태생적인 문제(= translation invariant)로

인해 coordinate transform문제에 굉장히 취약 하다는 것을 보였고 CoordConv라는 간단한 개념을 도임해 이를 해결할 수 있다고 주장한다. 

 

그럼 coordinate transform 이 뭘까 ?

이 논문은 우리가 암묵적으로 convolution을 이용해 굉장히 많이 풀고 있는 문제의 가장 기초적인 두 가지 문제를 convolution이 놀랍도록 못 푼다는 발견에서 시작 한다. 

 

위에서 말한 두 가지 문제는 coordinate classification, coodinate regressiong 이다. 말이 어려워 보일 수 있는데 위 그림 Figrue 1의 가장 위쪽 그림을 보면 이해가 정말 쉽다. 

 

coordinate classification 문제는 네트워크의 입력으로 (x,y) 좌표(cartesian coordinate)을 넣고 출력으로 해당 (x,y)좌표에 해당하는 pixel만 1의 값을 갖는( 예를 들어 1이라고 했는데 사실 이 숫자는 background와 구분되기만 하면 된다. class 라고 보면 된다.) 이미지를 출력하는 문제이다. 

좌표가 주어졌을때 해당 좌표에 흰색 점을 하나 찍은 이미지를 그려주는 문제가 coordinate classification이다. 

 

다음으로 coordinate regression 문제는 coordinate classification 문제와 입력과 출력이 바뀐 문제이다. 

입력으로 특정한 한 픽셀만 1의 값을 갖는 이미지를 입력으로 넣었을 때 해당 픽셀의 (x,y)좌표(cartesian coordiante)를 출력으로 내놓는 문제이다. (object detection 이 익순한 분들은 이 문제가 object detection의 bbox regreesion 문제나 key point estimation 문제와 같다는 걸 바로 알수 있을 거다.)

 

이 두 문제의 정의를 이해 했으면 아래 내용은 정말 간단히 쉽게 이해 할 수 있다.

(참고로 본래 논문에서는 GAN 의 mode collapse 문제도 다루고 figure 1의 가장 아래 그림도 이에 대한 내용인데 이 문제에 대한 설명은 이 포스팅에서는 최소화 하겠다.)

 

Convolution은 뭘 못하는가?

Figure 2. Data set 정의

Convolution이 뭘 못하는지 보기 전에 convolution의 무능을 입증하기 위해 어떤 데이터 셋을 사용 했는지 보자.

Figure 2의 (a)에는 총 9 개의 샘플 이미지가 있다. 각 이미지는  64 x 64 크기이고 단 1 픽셀을 제외한 모든 픽셀의 값이 0이다. 즉 64 x 64 사이즈의 이미지에서 오직 1픽셀만 target인 one-hot encoding 된 이미지라고 볼 수 있다. 

(구태여 부연 설명을 하자면 왜 one-hot encoding이냐면 64x64 = 4096으로 vector로 표시 할수 있다. 

4096 length의 vector에서 오직 한 element만 값이 1 이라고 생각해 보면 이게 one-hot encoding 이라는 걸 알수 있다. )

 

(a)를 이해 했으면 (b)를 보자.  Figure 2. (b)의 윗줄에 있는 두 그림은 (a)처럼 one-hot encoding된 이미지를 train set, test set으로 나누고 각 데이터 셋에 해당하는 이미지를 모두 합해 하나의 이미지에 나타낸 것이다. 말이 이해가 잘 안될 수 있으니 아래 그림 Figure 3을 보자.

 

Figure 3. one-hot encoding 이미지의 합

 Figure 3에서 화살표 왼쪽에 있는 그림을 3x3사이즈의 one-hot encoding 이미지라 하자.

이 이미지들을 다 더하고 나면 화살표 오른쪽의 결합 이미지가 된다. 

Figure 3의 화살표 왼쪽에 있는 이미지가 Figure 2의 (a)에 표시된 sample이미지에 대응 되고 화살표 오른 쪽에 있는 이미지가 Figure 2 (b)에 있는 합 이미지 이다. 

 

다시 Figure 2의 데이터 셋을 설명하면 논문의 저자는 train-test data set 을 두 가지 기준으로 분리했다. 

train-test data set pair 1, train-test data set pair 2를 만들고 각각의 train set을 이용해 학습 하고 test set으로 테스트 했을 때 어떤 결과가 나오는지 보였다. 

 

1. train-test data set pair 1: 1값을 가지는 pixel이 이미지의 아무 곳에나 위치 할 수 있게 하고 train과 test 셋을 uniform distribution 을 이용해 구분했다. Figure 2 (b)의 윗쪽 두 이미지가 각각  train, test data set을 하나의 이미지로 합친 그림이다. 

 

2. train-test data set pair 2:  image를 4개의 사분면으로 나누고 1,2,3 사분면에 값이 1인 pixel이 위치한 one-hot encoding 이미지는 train set으로 사용 하고 4 사분면에 pixel 값이 1인 point가 위치한 경우는 test 셋으로 사용 하는 경우이다. (이 경우 네트워크는 학습시 4사 분면에 위치한 sample을 본적이 없기 떄문에 4분면에 위치한 point에 대해 coordinate classification문제를 풀수 있을까?)

 

데이터 셋 설명이 장황해 졌는데 위 두 데이터 셋으로 coordinate classification 네트워크(일반 convolution 사용)를 학습해 보면 아래 Figure 4와 같은 결과가 나온다. 

 

Figure 4. (a) Train-test Accuracy graph (b) train-time accuracy graph

Figure 4의 (a) 그래프는 train-test accuracy 의 경향을 보여준다. 그래프의 좌상단을 보면 uniform ○, quadrant 이라는 걸 보수 있는데 

 

uniform 은 위에 설명한 train-test data set pair 1로 학습-테스트를 진행한 결과 이고

quadrant train-test data set pair 2로 학습-테스트를 진행한 결과 이다. 

(헷갈리면 반드시 위에 가서 train-test data set pair에 대한 설명을 다시 확인하고 올것.)

 

uniform 한 데이터 셋을 사용한 경우 학습과 테스트시 그나마 어느정도는 비슷한 accuracy 경향성을 보이지만 (사실 경향성이라고 말하기 힘들다) quadrant 한 데이터 셋을 사용 한 경우 train에 오버 피팅되는 것을 볼수 있다. 즉 quadrant 데이터 셋의 경우 학습 시 네트워크는 1,2,3 사 분면에 target이 위치한 경우만 볼수 있고 테스트시에 처음 4사분면에 잇는 target을 보면 정신을 못 차린다는 것이다. 

 

다음으로 Figure 4 (b)는 uniform 하게 train-test data set을 나누고 학습 했을때 학습시간에 따라 test accuracy를 도식화 한 그래프 인데 그 값이 86%를 넘어가지 않는다.

 

즉 여기서 우리가 알 수 있는건 (저자가 말하고자하는 바는) 기존의 convolution은 이 단순한 문제(coordinate classification, coordinate regression)를 정말 심각할 정도로 못푼다는 것이다. 

 

CoordConv:

바로 위에서 convolution이 뭘 못하는 지를 봤다. 이번엔 그 문제를 저자가 어떤 아이디어로 해결하는지를 보자. 정말 단순하고 간단하다. 

 

Figure 5. (좌) 일반 convolution, (우) CoordConv: 제안하는 방식

Figure 5의 왼쪽엔 기존의 convolution이 나와있다. 그리고 오른쪽엔 논문에서 제안하는 CoordConv이다. 

CoordConv의 아이디어는 Convolution이 translation invariant한 특성이 있으니 위치에 대한 정보를 알려줘서 신경 쓰게 하는 것이다. (solo 논문에서는 이걸 "coordinate aware" 라고 표현했다.)

 

이를 위해서 coordconv의 입력 tensor 크기에 대응 하는 좌표를 (-1,1)로 normalize해서 concat 하는 것이다. 이것도 말로 하면 어려운데 코드를 보면 직관적이다. 

x_range = torch.linspace(-1,1, inputTensor[1].shape[-1]) # inputTensor의 0번재 dimension은 batch
y_range = torch.linspace(-1,1, inputTensor[1].shape[-2]) # inputTensor의 0번재 dimension은 batch
y,x = torch.meshgrid(y_range, x_range)
y = y.expand([batchSize, 1,-1,-1]) # j coordinate in Figure 5
x = x.expand([batchSize, 1,-1,-1]) # i coordinate in Figure 5
normalized_coord = torch.cat([x,y],1)
new_feature = torch.cat([features_normalized_coord],1)

위 코드에서  y,x는 각각 Figure 5 오른 쪽의  i cooridnate, j coordinate에 대응 하는 것이고

new_feature는 Figure 5 의 CoordConv에서 concatenate Channels 바로 다음의 $ h \times w \times c+2 $ shape을 가지는 tensor에 해당한다. 

 

결과:

Figure 6. CoordConv 학습 결과

Figure 6는 Figure 4와 같은 이미지이다. 위의 "Convolution은 뭘 못하는가?"란에서 설명한 두 데이터 셋 

uniform(train-test data set pair 1), quadrant(train-test data set pair 2) 에 대해 CoordConv가 어떤 성능을 보이는 지 보자.

 

Figure 6의 왼쪽 아래 그림에서 보면 train accuracy와 test accuracy가 일치 하는것을 볼 수 있고 오른쪽 그래프를 보면 학습 시간이 25초만 되도 convolution과 달리 accuracy가 1까지 올라간다.

 

Figure 번호가 햇갈릴수 있음에도 불구하고 위 figure 7 은 원 논문의 caption을 같이 올렸다. (설명이 햇갈리시면 영문을 읽는게 더 쉬울수 있으므로..)

 

Figure 7의 왼쪽은 coordinate classification의 학습데이터(가장 왼쪽 줄)와 테스트 inference결과(붉은 색 박스 안쪽)를 보여준다. coordinate classification는 앞에서 설명 한것 처럼 (x,y)를 입력 했을때 이미지에 해당하는 pixel에 색을 칠하는 문제이다. 붉은 박스의 가운데 그림이 convolution으로 inference한 결과를 시각화 한건데 제일 윗줄에 있는 GT 이미지에 4사분면이 가득 차 있는 것과 달리 4사분면이 거의 비어있는 것을 볼 수 있다. 

반면 CoordConv는 4사분면에 있는 점들을 잘 그리고 있다

 

Figure 7의 오른쪽은 coordinate regression을 학습한 결과를 시각화 한것이다. (coordinate regression은 one-hot image를 입력으로 넣고 target pixel의 (x,y)를 출력하는 문제이다. 시각화 한건 출력인 (x,y)를 다시 이미지에 표시한 것이다.)

파란색 박스 안쪽을 보면 convolution은 train데이터에 대해서도 test데이터에 대해서도 추정한 결과가 울퉁불퉁 한 반면, CoordConv는 결과가 GT와 거의 일치 한다. 

 

정리:

Convolution이 어떤 취약점을 가지고 있는지 비교적 간단한 실험을 통해 알아 보고 이 문제를 해결하기 위한 방법 정리해봤다. 

 

내 입장에서 CoordConv가 효과를 발휘 할 수 있는 문제는 어떤 식으로든 image로 부터 좌표를 추측하는 문제 즉 object detection일거 같다. 논문의 결과에도 object detection에서 (mnist data셋 기준) 상당한 성능 향상을 보았다고 리포팅했다. 

 

CoordConv를 사용해도 효과가 없는 문제는 object의 위치와 관련 없는 문제 즉 classification문제 이다. 

 

위에서 언급은 안했지만 논문을 보면 저자는 mode collapse에 대한 이야기도 하지만 이 포스트에는 정리하지 않았다. 당장의 내 관심사와는 좀 거리가 있고 내 이해가 부족하기도 해서이다. 

 

오늘 정리할 논문은 one stage instance segmentation 네트워크 인 SOLO이다. 

Paper:

SOLO: Segmenting Objects by Locations

 

SOLO: Segmenting Objects by Locations

We present a new, embarrassingly simple approach to instance segmentation in images. Compared to many other dense prediction tasks, e.g., semantic segmentation, it is the arbitrary number of instances that have made instance segmentation much more challeng

arxiv.org

이 논문은 e2e로 학습도 가능 하고 instance를 구분 하는 방식이 매우 흥미 롭다.

 

SOLO의 접근 방식:

SOLO에서 해결하고자 하는 건 instance segmentation 이다. 

이미지 상에 존재하는 여러 물체를 각각 구분해 mask를 생성하는 문제이다. 

 

이를 위해 SOLO에서는 object center와 size정보를 이용한다. 

bbox 예측이나 post processing을 통한 instance pixel grouping없이 개별 object를 위 언급한 object center와 size를 이용해 정의한 center region와 해당 region에 대응 하는 mask로 직접 instance mask를 생성한다. 

 

간단히 기존 instance segmentation 네트워크의 전략을 살펴 보면 크게 top-down, bottom-up 방식으로 나눌 수 있다.

  • top-down 방식:  bbox 찾고 해당 bbox 안에 있는 object mask를 생성. 이 방식에서 instance의 구분은 bbox거의 전적으로 의존하게 된다. 
    대표적인 모델은 Mask-RCNN, PANet(mask-rcnn에서 feature representation을 강화한 방식, Mask-scroing rcnn(mask prediction의 품질을 평가하기 위한 mask-iou branch를 도입)
  • bottom up 방식: 이 방식의 네트워크 들은 대부분 각각의 object를 구분하기 위해 bbox를 사용하는 대신
    각 object를 구분할 수 있는 임의의 latent space에서 각 object를 나타내는 pixel embedding(의 형태는 다양 할 수 있다.)을 학습하고 post processing을 통해 grouping 한다. 
    대표적인 모델은 
    1. SGN: instance segmentation을 단계적인 sub-grouping문제로 정의. break point 라는 개념을 도입해 각 instance의 경계에 있는 point를 찾고 이 point를 line segment로 line segment를 instance를 grouping해 instance를 구성한다. 
    2. SSAP(single shot instance segmentation with affinity pyramid): pixel이 같은 인스턴스에 속하는 지를 pixel pair affinity라는 확률 값을 계산 하는 문제로 정의

SOLO는 bbox를 찾지도 pixel embedding을 학습해 후처리로 그룹핑 하지도 않고 mask 를 바로 생성하기 떄문에 

Direct mask prediction 이라고 할 수 있다. 

 

SOLO Architecture:

Fig 1. Solo framework. grid size=5 일 때

Fig 1. 은 매우 직관적으로 solo의 framework을 이해 할 수 있다. 

전체 흐름을 간단히 보면 입력 이미지를 SxS grid로 나타내고 어떤 object의 center가 특정 grid cell에 위치하면

그 cell이 sementic category와 instance mask를 예측하는 책임을 진다. 

 

Sementic Category:

sementic category는 object의 class를 예측하는 branch이다.

Object class 가 c개 있다면 category branch는 $ S \times S \times C$ 형태의 tensor를 생성한다.  이때 grid cell (i,j)에 있는 길이 c의 vector는 해당 cell에 object center가 존재하는 객채가 어떤 class에 속할지 에 대한 확률값 벡터이다. 

 

Instance mask:

Instance mask head의 output shape은 $ H \times W \times S^2 $  이다.

채널이 $ S^2 $ 인 이유는 grid cell (i,j) 각각에 대응 하는 채널이 하나씩 있기 때문이다. 

즉 Intance mask의 각 채널은 category branch의 grid cell (i,j)와 1:1 매핑 되는 관계이다.

예를 들어 임의의 객체 A의 center가 grid cell (i,j)에 위치 한다면 이 객체의 segmentation mask는 

$ mask channel = i \times S + j$ intance mask 에 생성되게 끔 네트워크를 학습한다. 

 

Fig 1.의 input image와 category branch 를 보면 왼쪽 얼룩말의 센터는 grid cell에서 붉은 색$(i_{1}, j_{1})$으로, 오른쪽 얼룩 말의 센터는 grid cell에서 파란색$(i_{2}, j_{2})$으로 표시 된다. 그리고 이 두 얼룩말의 마스크는 각 grid cell에 대응 하는 intance mask channel $ i_{1} \times S + j_{1}$, $ i_{2} \times S + j_{2}$에 각각 생성되는 식이다. 

 

이렇게 grid cell 위치와 instance mask 채널이 서로 연관되어 있기 때문에 SOLO는 "coordinate aware" convolution을 사용 했다고 한다.(기존 convolution은 translation invarian한 특성을 가지고 있기 떄문에 이와는 구분된다.)

그리고 이를 위해 CoordConv라는 convolution을 사용 했다. 

CoordConv는 instance mask branch의 입력과 같은 spatial size를 갖는 $ H \times W \tmes 2$ 크기의 텐서에 coordinate을  [-1,1]로 normalize하고 backbone의 output에  concat해서 instance mask branch에서 사용 한다. 

 

Fig 2의 Mask branch에서 input channel이 (256+2)인 이유가 바로 이 coordinate 정보를 concat했기 때문 이다. 

 

아래 코드를 보면 쉽게 이해가 된다. 

$코드 입력$

 

Fig 2. SOLO category and Mask branch

FPN:

SOLO는 feature pyramid layer(FPN)의 output이 각 category branch와 mask branch의 입력으로 사용되어 서로 다른 크기의 object를 찾는 효율을 높였다. 

 

학습:

GT 생성: 

 intance mask를 category classification grid cell위치에 대응 하는 instance mask channel에 binary mask 형태로 생성한다. 따라서 학습시 instance mask를 이에 대응 하는 형태로 만들어야 한다.

 

 앞서 object center가 (i, j) grid cell에 위치한다고 할때 해당 cell 이 object의 class와 mask생성을 담당한다고 했다. 이때, object size에 따라 여러 cell이 한 object의 class와 mask생성을 담당할 수도 있다. object center 좌표는 object mask gt 의 centre of mass로 정의하고 object 크기를 고려해 center sampling을 하기 위해 center region은 $ (C_{x}, C_{y}, \epsilon W, \epsilon H) \epsilon=0.2$ 로 정의한다. 

 

 이렇게 center region을 정하고 나면 category grid cell 상에 아래와 같이 center region이 형성될 수 있는데 이때 각 cell 위치에 해당하는 instance mask channel의 binary mask가 똑같이 들어간다. 

 

Fig 3은 이해를 돕기 위해 그린 그림이다. 붉은 색영역은 임의의 object에 대한 center region 이고 이에 대응 하는 mask gt가 intance mask gt에 어떻게 저장되는지 보여 준다. 

Fig 3. center region 과 instance mask gt 예시

LOSS:

$$ total loss = L_{category} + \lambdaL_{masks} $$

Category classification($L_{category}): 

solo는 category classification을 위해 focal loss를 사용 했다. (굳이 식을 설명하지 않아도 될정도로 많이 사용되니 식은 생략한다.)

 

Segmentation Mask($L_{masks}$):

Dice loss:

$ L_{mask}= \frac{1}{N_{pos}} \sum I(p_{i,j} >0) d_{mask}(m_{k},m_{k}^{*}) $

$ d_{mask}=1-\frac{2\sum_{x,y}(p_{x,y},q_{x,y}}{\sum_{x,y}p_{x,y}^{2}+\sum_{x,y}q_{x,y}^{2}} $

 

$p_{i.j}$ 는 category target으로 i,j는 grid cell 상의 좌표.

$m_{k}^{*}$는 mask gt

$d_{mask}$에서 $p_{x,y}$는 mask prediction 에서 x,y위치의 pixel value, $q_{x,y}$는 gt mask의 pixel value이다. 

 

 

Inference:

inference 시 category score threshold는 0.1을 사용해 낮은 score를 필터링 하고 score상위 500개에 대응되는 mask에 NMS를 적용한다. 

최종 score를 계산하기 위해선 maskness를 category score에 곱해 주는데 maskness란 $\frac{1}{N_{f}\sum p_{i}}$로 표현되고 $p_{i}$는 prediction mask의 pixel value 다. 

(mask ness 를 곱해주는 의미는 maskness점수가 높다는게 곧 해당 object의 형태를 잘 찾았다는 것일 태니 그걸 최종 score에 반영하는 것 같다. )

 

결과:

Fig 4. COCO 데이터셋에 대한 solo 학습 결과

Fig 4.에서 볼 수 있듯이 SOLO는 Mask R-CNN과 비슷 하거나 더 좋은 결과를 보여 준다. one stage instance segmenation이 two stage보다 좋아 질 수 있다는 충분한 가능성을 보여주는 예시 인거 같다. 

가장 좋은 성능을 보인것은 Resnet 101 backbone+ deformable convolution+ FPN을 사용 한 모델이다. 

 

 

Fig 5. SOLO behavior 설명

Fig 5에서는 SOLO가 어떻게 동작 하는지를 볼 수 있는데 아랫 줄의 보라색은 category branch 의 grid 가 12 x12일때

대응 되는 instance mask branch의 각 채널이 어떤 prediction결과를 가지는 지 보여준다. 

 instance mask branch output의 각 채널은 하나의 object에 대응 하는 mask를 생성하는 것을 볼 수 있는데 이 mask는 해당 채널과 대응 하는 category branch의 grid cell에 center가 위치하는 객채의 마스크 이다. 

 

객체의 크기에 따라 center region 이 여러 cell을 포함 할 수 있기때문에 대응 되는 intance mask channel도 여러개 일수 있어서 한  object의 mask가 여러개 생성되는 모습을 볼 수 있는데 NMS를 이용해 같은 객체의 mask를 하나로 합친다. 

 

 

Fig 6. FPN grid size의 영향성

Fig 6은 category branch의 grid size에 따른 AP 결과를 보여 준다. grid number 12,24,36은 단일 grid size를 사용 했을 경우를 말하고 Pyramid는 FPN을 사용해 여러 grid size를 사용해 결과를 추정 했을때를 말한다. 

단일 size이 grid를 사용할 경우 grid size가 클수록 AP가 높게 나왔고 FPN을 사용해 여러 grid size를 고려 하는게 가장 높은 결과를 모여준다. FPN의 경우 다양한 object 크기를 고려 할 수 있으니 당연한 결과로 생각된다. 

Fig 7. CoordConv 영향성

Fig 7은 coordinate aware convolution 이 결과에 어떤 영향을 미치는지에 대한 테스트 이다. 

Coordconv 를 사용 하지 않을 경우 Fig 7 테이블의 가장 윗줄의 AP =32.2가 coorconv를 사용했을 때보다 최소 3.6point가 낮은 결과를 보여 준다. 비슷 하게 coordconv를 2회 이상 사용하는 것은 성능에 영향을 거의 미치지 않는 것을 볼 수 있기 때문에 논문에서는 2회만 사용 했다. 

 

논문에서는 좀더 많은 ablation experiment를 진행했지만 이정도만 정리해도 충분할거 같다. 

 

coordConv의 내용이 좀 흥미로워서 이 논문을 한번 읽어봐야겠다.

 

 

오늘은 리뷰할 논문은 FCOS: fully convolution one-stage detection 이다. 

 

제목에서 알 수 있듯이 one-stage detector 이다. 

 

Title: FCOS: Fully Convolution One-Stage Detection

link: https://arxiv.org/abs/1904.01355

 

FCOS: Fully Convolutional One-Stage Object Detection

We propose a fully convolutional one-stage object detector (FCOS) to solve object detection in a per-pixel prediction fashion, analogue to semantic segmentation. Almost all state-of-the-art object detectors such as RetinaNet, SSD, YOLOv3, and Faster R-CNN

arxiv.org

 

 

요약:

자세히 살펴 보기전에 FCOS의 컨셉을 간단히 요약 하자면 저자는 anchor-based one stage는 training 할때 anchor box overlab의 해결하는데 시간이 오래 걸리므로 anchor-box free한 detector를 제안한다. Anchor box를 제거한 detector에서는 low recall rate, ambiguous sample 문제가 발생할 수 있는데 이런 문제를 해결할 수 있는 구조를 제안하고 해당 구조에 대한 효율성을 실험을 통해 입증했다. (문제를 해결하는데 사용한 개념은 FPN(feature pyramid network, per-pixel estimation, center-ness 등으로 아래에서 자세히 살펴 본다.)

 

Contribution:

1. Detection 문제를 segmentation 문제 처럼 per-pixel prediction 문제로 정의 하고이에 대한 구조를 제안함

2.  FCN(fully convolution network)을 사용해 문제를 해결함으로서 다양한 테크닉을 segmentation에서 사양하는 다양한 테크닉을 공유 해서 사용할 수 있다(고 주장함)

3. proposal free, anchor free 하게 문제를 정의 함으로써 hyper paramter의 개수를 줄임(사람에 대한 의존성을 줄인것이므로 이건 확실한 기여점이라고 개인적으로 생각한다.)

4. anchor box와 관련된 연산 감소(anchor box-GT box간의 매칭등에 소요 되는 연산량 감소)

5. One-stage로서 SOTA(state-of-the-art) performance를 이뤘고 2 stage detector에서 RPN으로 사용해도 anchor-based RPN보다 성능이 좋다. 

6. 확장 가능한 모델이다.(이 논문에서는 Detection 문제가 타겠이었지만 instance segmentation, key-point detection 등으로 쉽게 확장 가능 하다(고 주장한다.). FCN base 이므로 이 말을 맞는 말일거 같다.)

 

Anchor-based detector의 문제 점들

Anchor-based detector가 가지는 문제는 크게 hyper parameter에 관련된 문제, negative-positive sample의 imbalance에 대한 문제, computation(연산량) 문제로 나눠 생각 할수 있다. 

1. hyper parameter 관련 문제

  • anchor의 수, 사이즈, aspect ratio등은 predefined되어 있는데 이에 따라 성능에 영향을 쉽게 받는다.(수작업으로 튜닝 해야 하는 파라미터의 개수가 많다)
  • box scale과 aspect ratio가 고정이라서 다양한 모양을 가지는 small object에는 태생적으로 비효율 적이다. 

2. sample imbalance 문제

  • High recall rate을 달성하기 위해선 anchor box를 dense하게 배치 해야 하는데 이경우 많은 anchor box가 negative sample로 label되고 이는 학습 중 negative-positive sample 불균형을 악화 시킨다. 

3. 연산량 문제

  • anchor box는 IOU계산을 위해 predicted box-GT box간에 매칭을 해야 하는데 이때 발생하는 연산량이 비효율 적으로 많다.

 

기존 Anchor free detector들이 가지고 있던 문제 점들 

1. YOLO1낮은 recall rate을 보여 주는데 이건 object center 근처에 있는 몇몇 points들만 bbox 예측에 이용했기 때문이다. (object를 감싸는 bbox내에는 굉장히 많은 point가 있는데 그중 center 근처의 몇몇 개만 이용하는게 문제라고 주장함)

 

2. CornerNet에서는 같은 instance에 속한 left-top, right-bottom corner pair를 찾기 위한 추가 metric을 학습하고 post processing을 이용해 이들을 grouping 하므로 연산량이 많아져 비효율 적이다.

 

3. Dense Box 기반의 모델들은 overlapping bbox, 낮은 recall rate등의 문제로 인해 일반적인 object detection task에 부적합 하다고 여겨졌다.

 

FCOS의 전략

본 논문에서는 위에서 언급된 anchor free detector들이 가지고 있는 문제들을 per-pixel prediction과 FPN을 이용해 해결하고, 제안하는 구조에서 발생한 low quality bbox prediction문제를 해결하기 위해 center-ness score layer를 도입했다. 

 

1. Per-Pixel prediction

 - Anchor-based detector 들은 feature map의 각 픽셀 위치를 object center라고 가정하고 미리 정한 size의 box를 regression 한다. 이중 IoU가 낮은 bbox들은 negative sample이므로 실질적으로 학습과정에서 object의 위치를 추정하는데 사용되는 픽셀은 object center 근처에 있는 픽셀들이 전부라고 할 수 있다. 

저자는 이게 문제라고 생각하고 FCOS에서는 feature map의 모든 픽셀 위치에서 해당 픽셀이 특정 object에 속한 픽셀인지 아닌지, object에 속한 픽셀이라면 해당 픽셀에서 예상한 bbox는 무엇인지를 계산하는 방식이다. 

 

예를 들어 아래 그림이 feature map이라고 한면 이 논문이 제안하는 방식은 p1,p2,p3 및 노란박스 영역에 속한 모든 pixel들은 노란박스가 나타내는 object에 해당 하는 픽셀이므로 해당 픽셀들 각각에 대해 (마치 sementic segmentation과 같이)픽셀이 속한 class label을 예측하고, 각 위치에서 object bbox를 regression한다. 

Fig1. Per-pixel predicton의 개념

이런 방식으로 feature map의 모든 픽셀에 대해(Fig1에서는 $p_{1},p_{2},...,p_{n}$ 전부에 대해) 해당 픽셀이 속한 class $c^{(i)}$, bbox 추측을 위한 4개의 값 $(l^{*},t^{*}, r^{*}, b^{*})$을 추정하도록 네트워크를 구성했다. 그러니까 한 픽셀당 $ (l,t,r,b,c)$ 5개의 값을 예측 하는 것이다. 

 

이때 feature map 상의 픽셀 $(x,y)$가 라벨이 $c^{*}$인 object bbox 내부에 있는 픽셀이면  target label은 $c^{*}$로 정의 하고 positive sample이라고 보며 object bbox내부에 있는 픽셀이 아니라면 target label $c^{*} =0$ 이 되어 negative sample 로 정의 한다. 

 

bbox 예측에 사용되는 target $(l^{*},t^{*}, r^{*}, b^{*})$ 각각은 feature map상의 위치 $(x,y)$에 대해 해당 픽셀이 포함된 object bbox의 $(좌측 면, 위쪽 면, 오른쪽 면, 아래쪽 면)$  까지의 거리(단위pixel)에 해당하는 값으로 각각은 GT bbox 정보로 부터 아래와 같이 계산된다. 

 

$$ l^{*}=x-x_{0}^{(i)}, t^{*}=y-y_{0}^{(i)}, r^{*}=x_{1}^{(i)}-x, b^{*}=y_{1}^{(i)}-y             Eq(1)$$

위 식에서 $(x,y)$는 feature map 상의 위치, $(x_{0}^{(i)},y_{0}^{(i)})$는 object bbox의 left-top corner 좌표,  $(x_{1}^{(i)},y_{1}^{(i)})$는 object bbox의 right-bottom corner 좌표를 의미 한다.

 

$(l,t, r, b)$를 network에서 예측 한 후 IoU를 계한 하기 위한 $(x_{0}^{(i)},y_{0}^{(i)},x_{1}^{(i)},y_{1}^{(i)})$복원은 $Eq(1)$이용해 쉽게 가능하다. 

각 기호에 대한 정확한 의미는 아래 그림(Fig2.)를 참조 하면 더 직관적이다. 

Fig2.  왼쪽:  Bounding box를 encoding 한 (l,t,r,b)의  의미 .  오른쪽: ambiguous region(overlapped region) 의 예

특이하다고 생각 한 점은 각 픽셀의 class label $c$를 추측 하기 위해 multi class classification 컨셉을 사용 하지 않고 각 object class별로 binary classification으로 학습했다는 것이다. 

무슨 말이냐면 예를 들어 MS coco data 의 경우 object 카테고리가 80개 있다고 하면 class inference를 위한 network output은 총 80개의 channel로 구성될 것이다. 이때 channel 0은 vehicle, channel 1은 pedestrian, channel 2는 의자 등등이라면  임의의 $(x,y)$ 픽셀이 class 0 일 확률, class 1일 확률, class 2 일 확률을 채널축을 softmax를 취해 구하는 방식이 아니고, 각 channel을 별개로 보고 channel 0 에서는 vehicle에 속한 pixel과 그렇지 않은 pixel, channel 1 에서는 pedestrian에 속한 픽셀과 그렇지 않은 픽셀등을 각 채널 마다 binary classification loss를 구했다는 얘기이다. 

 

참조: bbox regression을 할떄 네트워크에서 추측한 $(l,t, r, b)$는 target 인 $(l^{*},t^{*}, r^{*}, b^{*})$ 을 regression 하는데 바로 사용되지 않고  실제로 $exp^{(s_{i}l)}$로 사용 되는데 이는 network에서 나오는 $(l,t,r,b)$이 큰 값을 갖게 하고 싶지 않아서 사용 하는 테크닉으로 $(l,t,r,b)$가 상대적으로 작은 값이어도 $exp^{(s_{i}l)}$은 큰 값이 되서 비교적 scale이 큰 $l^{*}$을 추정 할수 있기 때문이라고 한다. 

 

Loss function:

Fig3. Loss function

$L_{cls}$는 $focal loss$, $L_{reg})는 $IoU$ loss를 사용 했다.  $N_{pos}$는 positive sample 수이다.

본 논문에서 $\lambda=1$로 세팅했다.  

 

2. Multi-level Prediction with FPN 

이 논문에서 제안하는 FPN의 구조는 아래와 같다. 

Fig4. FCOS architecture. 가장 왼쪽의 숫자는 featuremap의 크기(Hxw)/output stride이다. P3,P4,P5,P6,P7은 feature pyramid이고 각 feature pyramid를 공용 head의 input으로 사용해 loss를 계산한다.

FPN(feature pyramid network)은 아래와 같은 FCOS의 weak point를 개선한다. 

 

weak point 1: final feature map 이 큰 output stride를 가질때, 작은 물체들은 해당 feature map에서 표현이 안될 수 있어서 찾는게 불가능 하므로 recall을 낮게 만드는 원인이 된다. 

weak point2: GT bbox 가 겹칠 경우 (Fig2. 오른쪽 overlapped region 참조) "overlap된 구간에있는 pixel들은 어떤 겹쳐진 두 bbox에 둘다 속하는데 어느 object의 bbox와 class를 타겟으로 학습해야 하는가?" 에 대한 문제가 생김

 

FPN을 이용 하면 서로 다른 size의 feature map을 만들 수 있는데 각 feature map에서 서로 다른 크기의 물체를 찾으면 위 약점들을 해결할 수 있다. 

 

weak point 1 해결되는 이유: FPN에서 생성되는 feature map은 서로 다른 output stride를 가지므로 작은 output stride를 가지는 feature map에서 작은 물체를 찾고, 큰 output stride를 가지는 feature map에서

큰 물체를 찾으면 해결가능

weak point 2 해결되는 이유: 저자의 관찰에 따르면 overlap은 대부분 bbox의 크기 차이가 상당한 object들간에 발생하는 경우가 대부분이라고 한다. 따라서 overlap을 생성하는 겹쳐진 물체는 서로 다른 feature map에서 찾게 끔 되므로 overlap 문제를 상당부분 해결 할 수 있다. (예를 들면 Fig2. 오른 쪽에서 사람은 feature map P3에서 찾게 끔 할당되고 테니스 라켓을 P5에서 찾게 끔 할당되게 된다는 의미이다.)

 

 정리하자면 Fig. 4 의 feature map $P_{3},P_{4},P_{5},P_{6},P_{7}$ 각각에서 찾아야 하는 object의 크기를 제안해 놓고 각 feature map에서 찾아야 하는 크기에 해당하는 object만 해당 feature map에서 detection된 object의 positive sample로 사용 하는 것이다. 

 

이걸 정리하자면 $i ={ 3,4,5,6,7}$ 이 feature map $P_{i}$의 레벨을 표현할때 각  $P_{i}$에서는 아래 조건에 해당하는 크기의 object를 positive sample로 학습하도록 한 것이다.  

$$m_{i-1} \leq max(l^{*},t^{*},r^{*},b^{*}) \leq m_{i}$$

 

논문에서 실제로 사용한 $m$ 값은 $\{m_{2},m_{3},m_{4},m_{5},m_{6},m_{7}\} =\{0,64,128,256,512, \infty\}$ 이다. 

 

3. Center-ness

FPN을 이용하고도 FCOS는 anchor based detector들 보다 성능이 떨어졌는데 이 원인은 object center에서 멀리 떨어진 location에서 bbox prediction이 좋지 않아서 였다. 예를 들자면 아래 Fig.5 에서 붉은 점 위치의 pixel에서 검은색에 해당 하는 bbox를 regression 할때 그 예측값 $(l,t,r,b)$가 썩 좋지 않다는 것이다. 

 

Fig5. low quality bbox의 원인

이런 문제를 해결하기 위해 object의 bbox를 결정할때 object center에서 멀리 떨어진 위치에서 예측된 값들의 영향성을 줄이기 위해 아래와 같이 center-ness 를 예측하는 layer를 추가해 이문제를 해결했다. 

center-ness는 Fig4에서 보면 알수 있듯이 classification output과 같은 head에서 계산된다. 

$$ center-ness^{*} = \sqrt{\frac{min(l^{*},r^{*})}{max(l^{*},r^{*})} \times \frac{min(t^{*},b^{*})}{max(t^{*},b^{*})}} $$

이렇게 계산된 center-ness의 heatmap은 아래와 같다. 

Fig6. centerness heatmap

 

실험:

Setting:

backbone: resnet-50

weight initialization: pretrained with imagenet (newly added layer: same as RetinaNet)

batch:16

optimizer: SGD

initial learning rate: 0.01, 0.001, 0.0001( 0.001, 0.0001은 각각 60k, 80k iteration에서 적용함)

input image size: $max(h,w) \leq 1333$, $min(h,w) \leq 800$

 

Fig7. BPR 및 ambiguous sample accuracy

BPR성능:

Anchor based detector에 비해 BPR(best possible recall)이 낮을 것이라는 예상과 다르게 FCOS는 Fig7.의  table 1에 보이듯 $P_{4}$feature map 만 사용 한경우에서 조차 95.55%의 recall rate을 보여준다. 

FPN을 사용 하면 98.4%로 $IoU \geq 0.4$ 인 경우만 고려했을 경우 Anchor base detector인 RetinaNet(with FPN)보다 훨씬 높고 모든 예측된 bbox를 다사용 한 RetinaNet(99.23%)비견될만 하다. 

 

Ambiguous Samples 에 대한 성능:

Fig7의 Table 2에서 보면 minival에서 FPN을 사용 하지 않고 feature map $P_{4}$만 사용 할 경우 $ \frac{ambiguous samples}{all positive sample} = 23.16%$이지만 FPN을 사용할 경우 \frac{ambiguous samples}{all positive sample} =7.14%$로 줄어든다(개인 적인 생각은 FPN이 FCOS에서 효과적으로 ambiguous samples문제를 해결한다는 것을 보여주기에 이결과만으로 충분하다고 생각한다..)

 

이 결과는 저자의 관찰결과(= 대부분의 overlap은 크기 차이가 상단한 object들 사이에 발생하므로 FPN을 사용해 서로 다른 level의 feature map에서 찾게 하면 해결이 가능하다)가 설득력 있다는 근거가 될수 있다.

 

 저자의 주장에 따르면 overlap이 같은 category에 속한 object들 사이에 일어나는 경우는 ambiguous location에 속한 픽셀(receptive field라고 생각하는게 더 정확할거 같다..)들은 어차피 class label이 같아  overlap에 관여하는 object중 어떤 object를 추정해도 성능 하락에 영향이 없으니 이런 경우를 배제 하면 $ \frac{ambiguous samples}{all positive sample} $은 Fig7의 Table 2의 Amb. samples(diff)(%)의 결과를 얻을 수 있다.(배제 한다는 것은 overlap이 서로 다른 category에 속한 object들에 의해 만들어지는 경우만 고려한다는 뜻이다.)

 

 이럴 경우 FPN사용시 \frac{ambiguous samples}{all positive sample} =3.75%$ 까지 하락한다.

(추가 적으로 실제 inference할때 ambiguous location에서 생성된 bbox의 비율을 살펴 보면 2.5%의 bbox만이 이 overlapped location에서 생성되었고 그중 서로 다른 category가 overlap된 경우는 1.5%였다고 한다. 즉, 저자가 말하고자 하는 위와 같은 자신의 주장은 타당하나는 것....)

 

Centerness 의 효용성:

 

Fig 8. Centerness의 효용성

Fig 8 은 centerness를 사용할 때와 그렇지 않을때 의 성능을 보여준다. 직관적으로 알 수 있듯이 결론은 사용하는게 성능 향상에 더 좋다. 다만 $center-ness^{+}$의 경우 center-ness를 Fig 4의 Regression branch 에서 학습 시켰을 경우의 결과 이고, $center-ness$ 는 Fig 4에서 처럼 classification branch에서 학습 시켰을 경우의 결과 이다. 

 

 

FCOS vs Anchor based detector:

Fig 9. FCOS vs Anchor based detector. Improvements FCOS performance result

Fig 9 은 anchor based detector 인 RetinaNet과의 비교이다. 위표는 FCOS와 RetinaNet과의 차이를 최대한 배제한 상태의 실험 결과이다.(FCOS를 설계 할때 기존 RetinaNet에서 사용 하지 않은 Group Normalization(GN)을 사용 하고, FPN을 생성할때 Fig 4에서 $P_{5}$를 사용했는데 RetinaNet에서는 $C_{5}$를 사용해 $P_{6}, P_{7}$을 만들었다는 차이가 있는데 위의 실험 결과는 FCOS에서 GN사용 배제, $P_{6}, P_{7}$ 생성시  $C_{5}$사용등 조건을 최대한 똑같이 맞췄다는 것이다.)

 

결과는 보는데로 비등하거나 FCOS가 더 좋다. Improvement는 논문 제출 이후 개선한 버전에 대한 결과 값이다. 

 

 참고로 위 결과를 얻기 위해 FCOS는 RetinaNet을 학습할때 사용했던 Hyperparameter를 그대로 사용했다고 하는데 Hyperparameter는 해당 model에 최적화 해서 사용 하므로 FCOS에 더 잘맞는 hyperparameter를 사용할 경우 성능은 더욱 좋아 질 수 있을 거라고 한다.

 

(원래 논문에는 region proposal에 사용했을 때 어떤지에 대한 실험도 있는데... 그건 나중에 정리하도록 하자...)

오랜만의 포스팅이다...

읽은 모든 논문에 대해 정리를 하려고 시작했는데..

습관이 덜되고 일에 치이다 보니.. 다시 열심히 해봐야지..

 

 

누군가 이 리뷰에서 잘못된 부분을 발견한다면 또는 글쓴이가 잘못 이해하고 있는 부분이 있다고 생각한다면...

주저 없이 댓글을 남겨 준다면 많은 도움이 될거같다.

 

오늘 리뷰할 논문은 AttendNets이라는 논문으로 DarwinAI 와 Waterloo 대학에서

제안한 내용으로 2020년 9월 archive에 올라왔다.

Title: AttendNets: Tiny Deep Image Recognition Neural Networks for the Edge via Visual Attention Condensers

paper link: https://arxiv.org/pdf/2009.14385.pdf

 

특징 및 Contribution:

1. 단말 기기에서 image recognition을 수행하기 위한 AttendNets이라는 모델을 제안

 

2. 단말 기기란 스마트 폰과 같은 기기를 말하며 제안된 모델은 서버의 도움없이 on-device에서 동작할 수 있는 모델이다.

-> 이를 위해 모델 개발시 low-pricision(정확히 말하자면 8bit pricision)이라는 제한 사항을 두었다.

 

3. Visual Attendtion Condenser(VAC)라는 모듈을 사용하는데 이 모듈은 spatial-channel selective attention을 향상시킨 attention condenser이다. (attention condenser라는 개념이 햇갈렸는데 아래에 이해한대로 열심히 정리해놨다.)

 

4. 이 모델은 machine-driven design 되었는데 내가 이해한 바가 맞다면 AutoML로 모델 개발했다는 말이다.

 

구조:

이 모델의 특징적 구조는 visual attention condenser라는 모듈인데 self attention machanism을 사용한 모듈이다.

 

1. VAC

Visual Attention condenser(VAC) 구조

위 그림은 이 논문에서 주로 사용 되는 self- attention을 위한 구조이다.

이전 까지 타 논문에서 제안되고 사용된 self-attention는 주로 network의 accuracy 향상을 위해 channel-wise attention과 local attention을 분리하고 합쳤던데 반해 이 논문에서는 self-attention machanism을 network 의 효율성 향상을 위한 방향으로 탐구했다.

 

논문의 필자가 주장하는 바에 따르면 제안된 VAC는 낮은 차원수(reduced dimensionality)의 통합된 embedding을 학습하고 생성 할 수 있는데 생성된 embedding은 channel공간과 spatial 공간의 activation관계를 잘 나타내는 특징을 가진 다고 한다.

 

VAC는 다음과 같은 하위 컴포넌트로 구성되어있다.

 

1. Down mixing layer : V'=M(V)

역할: channel reduction

구현 method: point wise convolution

 

2. Condensation layer: Q=C(V')

역할: 공간도메인에서의 차원 축소(featurea의size축소라고 해석해도 될거 같다) 및 강한 activation결과를 가지는 관심영역(ROI)간의 거리 축소를 통해 spatial attention 응집

구현 method: Max pooling

 

3. Embedding structure: K=E(Q)

역할: spatial-channel activation 관계의 특징을 내포하는 embedding K 생성

->spatial-channel activation relationship을 characterzing했다고 하는 이유는 down-mixing layer에서 channel 간의

activation 관계를 모델링 하고 condensation layer에서 spatial domain의 activation관계를 모델링 했기 때문인거 같다.

구현 method: grouped convolution, point wise convolution

 

4. Expansion layer: A=X(K)

역할 : V'에서 관심 영역을 boosting 하기 위한 self-attention value 생성을 위한 spatial domain dimensionality 확대

구현 method: unpooling

 

5. Selective attention mechanism: V''=F(V', A,S), where S is scale factor

역할: selective attention

구현 method: element wise multiplication

 

6. Upmixing layer: V'''=M'(V'')

역할: VAC 모듈의 output이 input V와 같은 channel dimensionality를 같게 하기 위한 channel dimensionality 확대

구현 method: point wise convolution

 

이를 종합해 보면 제안된 VAC모듈의 코드 형태는 다음과 같다고 생각해 볼수 있다.

(어디까지나 수도 코드이다)

down_mixing = torch.nn.Conv2d(in_ch, out_ch,kernel_size=(1,1)) # in_ch > out_ch
condensation_layer =torch.nn.MaxPool2d()
embedding_structure = torch.nn.Sequential(torch.nn.Conv2d(out_ch, out_ch2, kernel_size=(k,k), groups=n),\
        torch.nn.Conv2d(out_ch2, out_ch3, kernel_size=(1,1))) # where k>1, n>1
expansion_layer = torch.nn.MaxUnpool2d()
upmixing_layer = torch.nn.Conv2d(out_ch3, out_ch4, kernel_size=(1,1)) #where out_ch4> out_ch3

V' = down_mixing(V)
Q = condensation_layer(V')
K = embedding_structure(Q)
A = expansion_layer(K)
V'' =V'*A*S #where S is scale factor
V''' = upmixing_layer(V'')

 

2. Machine-driven Design

논문의 실험에 사용된 모델 구조는 식을 통해 machine-driven된 구조이다.

간단하게 생각하자면 디자인 하고자 하는 모델의 제한사항을 정의한 하고 그 제한 사항을 만족하는 모델을 iterative solving process같은 방식으로 찾는 것이다.

 

식에서 G(s)는 모델의 생성자이다. 생성된 모델 중 성능평가 함수 U()를 최대화 하면서 동작조건 $l_r(G)=1$ 을 만족하는 모델이 찾고자 하는 모델이다.

 

$l_r(G)$은 생성된 모델 G가 아래 두 조건을 만족하는지 판단한다.

1. $imagenet_{50}$에 대해 top-1 validation accuracy 가 71% 크거나 같다.

2. 8-bit weight pricision

 

본 논문에서는 prototype 모델에 대해 아래와 같은 기본적인 정의만 한 상태에서 구체적인 모델의 디자인은 위 수식을 통해 생성한다.

1. input channel=3

2. output logits은 average pooling, fully connected, softmax를 순서대로 거쳐 생성한다.

 

 

이렇게 생성된 모델은 아래와 같은 모습이다.

AttendNets achitecture-각 모듈을 나타내는 사각형 심볼안의 숫자는 각 layer의 output channel수를 의미하고 VAC 심볼 안의 숫자는 각각 down-mixing layer, first and second layer of embedding structure, up-mixing layer의 output channel 수를 의미한다. PEPE 모듈의 심볼안에 있는 숫자들은 각각 first projection layer, first expansion layer, second projection layer, second expansion layer의 output channel 수이다.

AttendNet-A와 B에서 공통적으로 보이는 특징은 VAC(visual attention condenser)모듈이 모델의 초반부에 집중적으로 사용되고 PEPE(projection-expansion-projection-expansion)모듈이 모델 후반부에 집중적으로 사용된다는 것이다.

PEPE모듈은 machine-driven exploration을 통해 발견한 구조이다.

 

VAC모듈이 모델 초반부에 많이 사용되는 것은 visual selective attention이 low-mid level visual feature extraction 단계에서 중요한 역할을 한다고 해석 할 수 있다.

 

AttendNets-A와 B의 구조적 차이는 효율성과 정확성의 균형을 이루며 특정 테스크를 수행하는데 필요한 모델을 찾기 위한 machine-driven exploration의 결이다.

 

논문의 필자는 이러한 구조적 차이를 macroarchitecture 와 microarchitecture 의 다양성이라고 표현했는데

macroarchitecture의 다양성이란 VAC, PEPE, spatial convolution, point wise convolution등이 서로 다르게 섞여있는 것이고

microarchitecture의 다양성이란VAC, PEPE 모듈 내부의 layer들이 서로 다른 channel수를 갖도록 configuration된것에서 알 수 있다고 주장한다.

 

(의문은 microarchitecture에 대한 주장은 이해가 가는데, macroarchitecture의 다양성에 대한 주장은 이해가 가지 않는다.

논문에서는 At macroarchitecture level, there is a heterogeneous mix of visual attention condensers, PEPE modules, spatial and pointwise convolutions, and fully-connected layers.

라고 표현했는데 모델 구조를 나타낸 그림에서 AttendNets-A와 B 에서 macroarchitecture level의 차이는 보이지 않는다. 내가 잘못 이해 하고 있는 걸까? )

 

결과

위 테이블은 $imageNet_{50}$에 대한 대조군과 제안된 AttendNets 의 실험 결과를 보여준다.

AttendNets은 대조군들에 비해 낮은 8-bits weight pricision과 적은 MACs을 가짐에도 불구하고

대조군들과 유사하거나 높은 Top-1 accuracy를 보여준다.

목표했던 단말에서 on-device로 동작 가능한 model을 제안한다는 주장에 힘을 실어 주는 결과로 보인다.

빠른 구조의 네트워크를 찾던 중 아래 논문을 보게 되어 정리하고자 한다.

centernet 이란 이름의 논문이 두개 있어서 헷갈릴 수 있는데 여기서 리뷰하는 논문은 아래 논문이다.

 

title: Objects as points (2019년 아카이브에 올라왔다.)

paper link: arxiv.org/pdf/1904.07850.pdf

code link: github.com/xingyizhou/CenterNet

 

xingyizhou/CenterNet

Object detection, 3D detection, and pose estimation using center point detection: - xingyizhou/CenterNet

github.com

centernet의 특징

  • One-stage detector
    어찌 보면 당연하게도 centernet은 YOLO, SSD 등과 같은 one-stage detector이다.
    다만, YOLO나 SSD가 미리 정해진 anchor에서 bounding box의 overlap을 기준으로 삼는것과 달리
    centernet은 각 object에 대해 단 하나의 중심점을 key point estimation방식으로 추정한다.

  • Object detection 문제를 key point estimation문제로 정의해 풀었다.
    바로 위의 설명과 겹치는 부분이 많지만 기존 one-stage detector 들은 각 anchor 위치에서 정해진 비율의 bbox들에 대해

    overlap 정도를 기준으로 학습하지만 centernet은 feature map으로 부터 각 object의 center 위치를 확률 맵으로 나타내어 학습한다. center 위치를 key point로 정의하고 문제를 푼 것이다. 

기존 one-stage detector와 centernet의 차이(objects as points 논문에서 발췌)

  • 구조가 매우 단순해 이해 하기 쉽고 orientation, pose, 3d bbox 추정으로 쉽게 확장 가능 할 것같다.

구조

수치는 input: 3x256x512, output stride: 4 기준이다. 

centernet 구조

  • 위 centernet 구조 그림에서 처럼 centernet은 feature를 생성하는 backbone과 3개의 header로 이루어져 있다.

  • 해더는 각각 center heatmap, center offset, width and height 를 출력한다. 

  • center heatmap은 channel index가 각 object category에 해당한다. 예를 들어 사람의 object id=0 이면
    centerHeatmap[0,:,:]에는 사람의 center 위치에 해당하는 pixel의 값이 1에 가까울 것이다. 
    (그림에서 center heatmap 위의 ncls x 64 X128은 출력 텐서의 모양이고 ncls는 number of classes의 약자이다.)

  • center offset은 output stride때문에 발생하는 discretization error를 보상하기 위해 추정하는 것으로 각 object center 위치를
    input image scale로 해석할때 오차를 보상하기 위한 값이다. 예를 들어 input image에서 A 라는 object의 center가 (146, 133)에 
    위치한다면 출력 center heatmap 텐서에서 해당 object의 위치는 (36,33)이다. 하지만 실제 (146/4, 133/4)=(36.5, 33.25)이므로
    (0.5, 0.25)의 오차가 발생한다. 이 오차가 output stride에 의해 발생하는 discretization error 이고 이를 보상해 주기 위해 추정한다.
  • 마지막으로 width and height 텐서는 object의 width, height를 추정 하는 텐서이다. 예를 들어 object id =0 인 물체에의 width, height는 widthAndHeight[0:2, x,y] 위치의 값이고 object id=4인 물체의 width, height는 widthAndHeight[8:10,x,y] 위치에 저장된다.

Loss

  • center heatmap loss

center heatmap loss: focal loss

$Y_{xyc}$=1은 object center 위치의 GT 값이다. 학습 초반 $\hat{Y}_{xyc}$의 값이 작다면 $(1-\hat{Y}_{xyc})^{\alpha}$ 의 값이 상대적으로 커서 loss 가 커지고 학습 후반으로 갈록 $\hat{Y}_{xyc}$의 값이 0에 가까워 지면 $(1-\hat{Y}_{xyc})^{\alpha}$ 의 값이 기하 급수적으로 작아져 loss에 거의 영향을 미치지 않는다. 

반대로 center point가 아닌 위치에서 학습 초반에 $\hat{Y}_{xyc}$ 의 값이 크다면 $(1- Y_{xyc})^{\beta} (\hat{Y}_{xyc})^{\alpha}$의 값이 상대적으로 커서 loss에 영향을 크게 미치지만 학습 후반 부로 갈수록 이 값이 기하 급수적으로 작아져 loss가 줄어 든다.

 

  • center offset loss 

center offset loss

구조 설명에서 언급한것 처럼 output stride로 인해 발생하는 discretization error를 보상하기 위해 추정하는 offset값이다. 

$\frac{p}{R}-\tilde{p}$ 부분이 의미하는 것이 discretization error 이고 여기서 R은 output stride를 의미한다. 

p는 input image scale에서 object center의 x 또는 y 좌표 이고 $\tilde{p}$ 는 소수를 버림한 $\frac{p}{R}$ 값이다.

 

이 loss는 위와 같이 단순히 L1 loss를 이용한다.

 

  • width and height loss

width and height loss

width 와 height loss는 단순히 L1 loss 를 이용 하여 위와 같이 구한다. 

 

  • total loss

total loss는 위와 같고 논문에서는 $\lambda_{size}$ =0.1 , $\lambda_{off}$=1 로 설정했다.

 

 

이 정리만 봐선 내용 파악이 힘들것 같아 근시일 내에 GT 만드는 내용도 추가해서 정리 해야 할것 같다.....

+ Recent posts