Open gusdlf93 opened 1 year ago
이렇게 묶인 feature vector의 group들로 matrix를 만들 건데, 일반적으로 self attention matrix를 만들 수도 있지만, 서로 다른 vector 간에 상관관계를 표현할 때에는 bilinear pooling을 사용합니다. bilinear pooling이라는 것은 outer product와 유사한 연산입니다. 그런데 이렇게 만들어진 것의 크기가 너무 커지게 되면, 사용하기 힘들기 때문에, compact bilinear pooling이라는 것을 적용하기도 합니다.
그럼 다시 앞으로 돌아와서, 식을 살펴보게 되면, latent class를 서로 다른 해상도의 feature map들 간에 조합하기 위한 과정이라고 볼 수 있습니다.
ISDNet에서는 서로 다른 branch를 RAF로 효과적으로 결합했습니다. spatial 정보끼리보다는, Semantic정보와 Spatial 정보를 RAF 결합할 때, 성능이 더 높게 나온다는 것또한 실험으로 밝혔습니다.
고해상도 이미지를 처리할 때 대부분 문제로 여겨지는 것은 Computation과 memory입니다. 이러한 문제들을 해결하기 위해 기존의 방법들은 global - local refinement pipeline을 따르는데, 본 논문에서는 다른 논문들에서 신경 쓰지 않았던 inference speed 또한 신경을 쓰도록 하겠습니다. 큰 이미지를 작은 local image로 분할하는 파이프라인과는 달리, 전역 이미지를 직접 추론하는데 중점을 두겠습니다. 이러한 관점에서 shallow network와, deep network를 새로운 방식으로 통합한 ISDNet을 제안합니다. 이 코드는 현재 sota보다 172배 빠르며 좋은 mIoU를 보여줍니다.
Semantic Segmentation은 수십년간 연구되어온 분야입니다. 대규모의 입력 이미지에서 작은 객체와, 매우 미세한 경계들을 분류하는것은 쉽지 않습니다. 특히 수백만, 수십억 픽셀을 사용하는 remote sensing이나, autonomous driving, medical image에서는 특히 중요하죠. 그러나. 메모리와 계산의 한계로 인해 일반적으로는 초고해상도 이미지를 처리하기 힘듭니다.
그림 1을 통해서 예시를 들어 보겠습니다.![image](https://user-images.githubusercontent.com/89114114/180261802-c828a26d-3216-4eef-af73-9850d7e1b96c.png)
그림 1(d)를 보시면, Deep Neural Network에서는 성능이 매우 안 좋은 것을 볼 수 있는데, 이는 이미지를 down sample하는 과정에서 세부 정보가 삭제되서 성능이 저하된 것입니다. 그림 1(e)를 보시면 architecture 자체가 너무 간단하기 때문에, global context를 잘 학습하지 못하고, 높은 수준의 Semantic 정보를 학습하기도 어렵습니다.
이러한 단점을 해결하기 위해, 대부분의 네트워크들은 global-local refinement 방법을 사용합니다.
가장 먼저, 전체 이미지를 글로벌 네트워크에 입력한 다음 로컬 네트워크를 통해 불확실한 영역을 여러 번 정제하는 방법입니다. 이러한 방법은 일반적으로 더 적은 메모리와 계산량으로 높은 정확도를 도달하지만, 추론 속도는 매우 느린 편입니다. 예를 들어 2448 x 2448 해상도 이미지를 추론하는데는 8초가 필요하고, 5000x5000 이미지를 처리하는데는 26초가 걸립니다.
globa-local refinement 방법은 순차적이기 때문에 느리고, end-to-end 학습 방식이 아닙니다. ISDNet에서는 초고해상도 이미지를 end-to-end로 학습하고자 합니다. 경량화 segmentation 모델 아키텍처 중, bilateral architecture에서 영감을 받아, shallow network와 deep network를 효율적으로 통합할 수 있었습니다.
전형적인 bilateral model들이 shallow, deep branch를 combine할 때, 동일한 input값을 사용하는데, 우리는 shallow branch와, deep branch 각각에 다른 scale image로 넣어서 사용합니다. 게다가 우리는 경험적으로 찾았습니다. shallow branch와 deep branch에 이질적인 정보를 입력하고? auxiliary learning task를 추가해주는것이(ex : super resolution) 학습에 좋은 도움이 된다는 것입니다. 직관적인 비교를 위해 그림 2에서 세가지 방식에 따른 결과를 보여줍니다.
Fig2 (a)은 Real-time Model Design입니다. Shallow Model을 사용하지만, 성능이 좋지 않습니다. Fig2 (b)는 Global Local Refinement입니다. Image는 동일한 해상도로, Global, Branch에 들어가는데, Global branch의 경우에는 전역 이미지를 러프하게 보고, Local Branch에서는 잘려진 부분들을 세밀하게 봅니다. Fig2 (c)의 경우에는 본 논문에서 제안하는 방법으로, Shallow Branch에서는 전역 이미지를 러프하게 보고, Deep Branch에서는 Downsampling된 이미지를 입력으로 받아서, 학습을 진행합니다. (Crop이 아닌 downsample 방법이 효율적!)
본 논문의 contribution은 다음과 같습니다.
FCN은 초기 Segmentaiton Network로, 좋은 성능을 보여줬습니다. DeepLab의 경우에는 atrous convolution으로 receptive field를 늘렸습니다. PSPNet은 Pyramid Pooling을 사용해서 local, global 정보를 잘 캡처했지만, 속도가 느렸습니다. ICNet은 다중 해상도의 이미지를 사용하는데, Top Branch에서는 Semantic Part에 대한 정보를 얻고, Middle Branch와 Bottom Branch에서는 detail을 복원했습니다. 3가지 모델에서 서로 다른 해상도의 이미지를 입력으로 받아서, 서로 다른 역할을 학습했다고 보면 됩니다. BiSeNet에서는 Context정보와 Spatial 정보를 얻기 위한 2가지 경로의 Encoder를 사용했습니다. STDC는 빠른 속도와 높은 정확도를 달성하기 위해, low-latency backbone을 사용하며, boudary map을 학습하는 기능을 통해 가장자리를 잘 인식하고자 했습니다. 하지만, 이러한 방법들은 고해상도에서는 잘 작동되지 않았으므로 RAF를 제안합니다.
제안한 ISDNet은 다음 그림과 같습니다.![image](https://user-images.githubusercontent.com/89114114/180273523-e92fe8a2-2428-4772-a6e7-59af6e8bede0.png)
Deep Branch는 ResNet18을 Backbone으로 사용하는 DeepLabV3이고, Shallow Branch는 STDC 모델을 사용하였습니다.
Shallow Branch에서, Original Resolution의 이미지로부터, high-frequency 정보를 학습하도록 강제하기 위해서 Laplacian pyramid를 사용하였습니다. Laplacian pyramid는 다음과 같이 정의되는데,
I는 full scale image이고, g는 guasiian blur, i는 pyramid의 level입니다.
shallow branch(S)의 출력값은 2개의 feature map으로 원본 이미지의 1/8, 1/16사이즈로 줄어든 값입니다.
Deep branch D는 RGB이미지를 downsample해서 사용하는데, 원본 이미지의 1/32사이즈로 줄어든 값을 사용합니다.
학습 시 auxiliary segmentation head, super resolution head, structure distillation loss가 추가로 들어갑니다.
2개의 branch로부터 3개의 feature map이 추출되는데, 이들을 fusion해서 segmentation에 사용합니다.
보통 이런 여러가지 scale의 해상도를 합칠 때에는, add나 concat을 사용하는데, 본 논문에서는 RAF(. Relation-Aware feature Fusion)를 통해서 이들을 결합합니다.
RAF의 매커니즘은 생각보다 간단한데, weighted feature fusion에 transformer를 적용했다고 보면 됩니다.
shallow network와 deep network를 fusion할 때, concat을 하는 경우는 보통 concat시 channel별로, 혹은 resolution벼로 서로 다른 가중치를 주는 편입니다. add의 경우도 마찬가진데, 여기서는 add할 때, 서로 다른 해상도의 이미지가 동일한 기여를 하면 안되기 때문에, 각각의 가중치를 transformer로 학습한 것입니다. concat 대신 add를 사용한 이유는 concat이 add랑 성능 차이가 거의 안나는데, 속도나 memory 사용량 측면에서는 차이가 꽤 나기 때문입니다.
그럼 이제, 서로 다른 해상도의 이미지가 가진 기여도를 파악해야 하는데, 저희가 보통 channel간의 가중치를 파악할 때는 SE(squeeze and excitation)같은 걸 사용하죠. 그렇기 때문에 RAF에서도 중간까지는 SE와 동일한 연산을 사용한 후, 마지막에 attention matrix 하나만 추가해서, feature map들 간의 알수가 있습니다.
global vector : global vector는 전체 이미지의 통계를 나타냅니다. global vector를 나타내는 가장 간단한 방법은 feature map을 global average pooling한 것입니다. 여기서는 global vector를 mlp를 통해서 channel-wise하게 global vector들간의 가중치를 재조정하고, k개의 group으로 나눕니다. k개의 group으로 나누는 이유는 k개의 latent class로 나누기 위함인데, latent class라는 것은, 우리가 잠재적으로 이게 어떤 class라고 말하지는 못하지만, 이들이 데이터셋의 분포 내에서 가지고 있는 어떤 동질성의 특징 정보를 이용해서 이들을 그룹으로 묶는 것을 의미합니다.