오늘은 Real-Time Semantic Segmentation 분야의 논문인 BiSeNetV2: Bilateral Network with Guided Aggregation for Real-time Semantic Segmentation이라는 논문을 리뷰할 것이다.
Source: https://arxiv.org/abs/2004.02147
작은 영역에서의 디테일과 큰 영역에서의 의미론적 추론은 의미론적 분할 작업에서 필수적이다. 그러나 모델의 추론 속도를 높이기 위해서 현재의 대부분의 접근방식은 디테일을 희생하게 된다. 이것은 상당한 정확도 손실을 초래한다. 우리는 높은 정확도와 실시간 추론을 위해서 이러한 공간적 세부사항과 의미론적 분류작업을 구분적으로 다루는 것을 제안한다. 마지막에서 우리는 속도와 정확도를 절충하는 효과적이고 효율적인 아키텍처를 제안한다. 그리고 우리는 두가지 종류의 특징 표현들을 적절히 융합하기 위해 Guided Aggregation Layer를 추가로 디자인했다. 게다가 Booster Trainning Strategy 또한 디자인하여 추가 추론 비용없이 분할 성능을 향상 시켰다.
즉, 앞서 말한 모델들은 성능에 집중하게 되었고, 다양한 실시간 어플리케이션에서의 요구하는 추론 속도에는 만족하지 못하는 성능을 보여준다.
이러한 수요를 마주하며 현재 존재하는 방법론에서 주로 두가지 가속화 접근방법을 채택하게 된다.
설명에서 볼 수 있듯 이들은 속도를 확보하지만, 정확도면에서 엄청나게 손실을 보게된다.
저자들은 작은 영역에서의 세부사항과 넓은 영역에서의 문맥의미들이 의미론적 분할 작업에서 중요하다는 것을 발견했고 일반적인 상황에서 깊고 넓은 네트워크가 두가지 정보 (Details, Semantics)를 동시에 인코딩할 수 있다고 한다. 그래서 그들은 두가지 정보를 각각 다루어서 정확도와 속도 측면에서의 절충을 할 수 있다고 한다.
결국 저자들이 하고 싶은 말은 이것이었다.
우리의 구조는 Detail Branch, Semantic Branch 그리고 이 둘을 병합하는 Aggregation Layer로 구성되어 있다. 이 섹션에서 우리는 우리의 구조의 핵심 개념을 설명할 것이다.
Detail Branch는 low-level 정보인 공간적 세부사항들을 담당한다. 그래서 이 브랜치는 풍부한 세부 정보들을 인코딩 하기 위해서 많은 채널을 요구한다. 한편, Detail Branch는 단순히 낮은 수준의 세부 사항에 초점을 맞추기 때문에 이 브랜치에 대해 작은 보폭으로 얕은 구조를 설계할 수 있습니다.전체적으로 Detail Branch의 핵심 개념은 공간 디테일을 위해 넓은 채널과 얕은 레이어를 사용하는 것입니다. 게다가 이 브랜치의 특징 표현은 큰 공간 크기와 넓은 채널을 가지고 있습니다. 따라서 메모리 액세스 비용을 증가시키고 속도를 줄이는 Residual Connection을 채택하지 않는 것이 좋습니다.
->
Detail Branch에 병렬로 설계된 Semantic Branch는 고수준 의미를 포착하는 데 사용됩니다. 이 분기는 채널 용량이 낮지만 공간 세부 정보는 상세 분기에서 제공할 수 있습니다. 반면에, 우리의 실험에서는 의미 분기가 상세 분기의 채널 비율 λ(λ < 1)을 갖고 있으며, 이는 이 분기를 가벼운 것으로 만듭니다. 실제로 의미 분기는 어떤 가벼운 컨볼루션 모델이든 될 수 있습니다. 한편, 의미 분기는 특징 표현의 수준을 높이고 수용 영역을 빠르게 확장하기 위해 빠른 다운샘플링 전략을 채택합니다. 고수준 의미는 큰 수용 영역을 필요로 합니다. 따라서 의미 분기는 전역 평균 풀링을 사용하여 전역적인 맥락 응답을 임베딩합니다.
BiSeNet은 처음으로 두가지 branch로 나누어서 의미론적 분할 작업을 시도했다.
Detail Branch는 넓은 채널폭과 고해상도의 특징맵을 가지고,
Semantic Branch는 좁은 채널폭과 높은 수준의 의미론적 문맥 특징을 가진다고 한다.
또한 두 Branch를 하나로 통합하기 위해 Guided Aggregation Layer를 구성하고, 부스터 훈련 전략을 디자인하여 불필요한 추론 비용을 줄인다고 한다.

전체적인 BiSeNetV2의 구조는 이렇게 생겼다.

세부 구현사항은 다음과 같다.
여기서 Stem과 GE 무엇인지 알아보자.
먼저 Stem은 이렇게 설명하고 있다.

Stem의 구조는 다음과 같음

Conv연산이랑 그냥 MPooling연산을 더해준 것인데, 큰 연산없이 원본의 특징을 반영해주는 의미같이 느껴진다. 그 이후에 다시 Conv연산을 해서 짬뽕시켜준다.
다음은 GE에 대해 알아보자.

GE는 Gather-and-Expansion Layer인데, 이름에서 볼 수 있듯 정보를 모으고, 부풀리는 역할을 한다. 첫 Conv연산에서 정보를 모으고 DWConv는 Depth-wise Convolution을 뜻하는데, DWConv는 다음과 같은 특징이 있다.
1. 각 입력 태널에 대해 독립적인 컨볼루션 필터를 적용
2. 채널 간의 정보 교환 없이 각 채널의 특징만 추출
3. 파라미터 수와 연산량을 크게 줄여 모델 효율성을 높임
이로 얻을 수 있는 효과는
그래서 Real-Time을 생각하는 모델에 주요 기술인 것 같다. Semantic Branch에서는 GE를 이용해서 많은 특징을 수집하고 부풀려서 이를 활용하는 것으로 보인다.
DWConv는 여기서 조금 더 직관적인 설명을 해주는 것 같다. 기본 Conv 등
https://animatedai.github.io/
코드는 공식 Repo가 아직 없는 것 같아서(24.03.27) 다른 분이 구현하신걸 참고했다.
https://github.com/zh320/realtime-semantic-segmentation-pytorch/blob/main/models/bisenetv2.py
다음에는 같은 두개의 브랜치 구조를 사용하는 DDRNet을 읽고 리뷰하려고 한다. CNN기반 Real-Time기법을 정리하고나면 Transformer기반 Real-Time Segmentation모델 논문을 읽어보려 한다. SegFormer는 읽은 경험이 있어서 다른 최신 논문을 참고하려 한다.