[논문 리뷰] Denoising DETR(DN-DETR)
참조
들어가며
기존 DETR은 Transformer 구조를 Object Detection에 적용하며 많은 관심을 끌었습니다. 하지만 500 Epochs정도를 돌아야 한다는 제한점이 존재하였고, 이러한 낮은 수렴 속도를 극복하기 위한 후속 연구가 많이 진행되고 있었습니다.
후속 연구의 대부분은 Transformer Decoder에서 객체에 대한 위치 정보가 명확하지 않아 수렴 속도가 느리며 이 위치 정보를 삽입해 주는 방식으로 위 제한점을 해결하였습니다.
하지만, 본 논문에서는 다른 문제점을 지적합니다. Transformer Decoder에서 모든 Attention 연산이 끝나고, 최종적으로 Class와 BBox를 예측한 후, 각 쿼리와 GT 간 높은 스코어에 대해 이분 매칭을 진행하는데 이 과정이 매 Epoch마다 일관되지 않다는 것입니다.
위와 같은 식으로 각 쿼리들이 일정하게 한 객체를 참조하는 것이 아닌, 계속해서 다른 객체를 참조하는 것을 볼 수 있습니다. 이렇게 이분 매칭의 불안정성이 느린 수렴 속도를 초래한다고 지적합니다.
이러한 문제점을 개선하기 위해 기존 이분 매칭 손실 함수에 추가적으로 디노이지 손실 함수를 추가합니다. 기존 이분 매칭손실 함수는 객체 쿼리를 생성하고, Transformer Decoder를 통과시켜 최종적으로 객체와 이분 매칭하는 것이였습니다. 디노이지 손실 함수는 이 과정과 병렬적으로 진행되는데, GT Bounding Box(BBOX)와 GT Class를 노이즈 시킨 쿼리들을, Transformer Decoder를 통과시켜 다시 이 GT 객체들을 Reconstruction 하는 것입니다.
제안하는 디노이지 과정의 노이즈는 작은 값으로 설정하여 최적화가 그리 어렵지 않다고 합니다. 또한, 매 Epoch의 불안정성에 대한 평가 지표에서 다른 모델들보다 차별적인 결과를 가져왔습니다. 아울러 이분 매칭할 때 쿼리와 GT 간의 거리도 기존과 비교해서 줄어들었으며, 이는 GT 근처의 쿼리는 좀 더 가까이 예측할 것이고, 상반되는 쿼리는 멀리할 것이라고 주장합니다.
이러한 과정으로 이분 매칭의 안정성을 도와줄 수 있다고 합니다. 아울러 이 디노이징 손실 함수는 다른 모델에 손쉽게 플러그인이 가능하다고 합니다. 본 논문에서는 DAB-DETR에 플러그인하였지만, 다른 Object Detection, Semantic segmentation과 같은 모델에도 플러그인이 가능하다고 하고, 이것은 실험으로 증명되었습니다.
그럼 이 디노이징의 세부 구조를 살펴보겠습니다.
DN-DETR
본 논문은 DAB-DETR에 디노이지 손실 함수를 플러그인 하였을 때를 예시로 들었습니다. 아래는 기존 DAB-DETR과 디노이징을 적용한 DN-DETR의 Transformer decoder에서 Cross-attention 연산을 적용할 때의 세부 구조입니다.
왼쪽의 DAB-DETR를 보면 디코더 임베딩과 앵커(x, y, w, h) 임베딩으로 구성되어 있고, 이 두 가지 임베딩이 Cross-Attention을 거치고 최종적으로 이분 매칭을 합니다. DN-DETR에서도 동일하게 두 가지 임베딩으로 구성되어 있지만 이분 매칭과 더불어 디노이징의 작업도 이루어져야 해서 두 임베딩에 약간의 변형이 가해집니다.
위 디코더 임베딩 부분의 변형을 설명하기 전에, Class와 BBox에 대한 디노이징 과정이 어떻게 이루어지는지 살펴보겠습니다.
Denoising(BBox)
노이즈 된 BBox는 좌표(\( \Delta x, \Delta y \))에 대한 것과 크기( \( \Delta w, \Delta h \) )에 대한 것으로 나뉩니다. 먼저, 좌표에 대한 것은 사전 정의한 작은 값 \( \lambda_1 \in (0, 1) \)을 설정하고, 아래의 범위 내에서 랜덤 하게 샘플링합니다.
위와 같은 값을 설정함으로써, 좌표는 GT BBox 범위 내에 벗어나지 않게 됩니다.
이어서, 크기에 대한 것도 마찬가지로 사전 정의한 작은 값 \( \lambda_2 \in (0, 1) \)을 설정하고, 아래의 범위 내에서 랜덤 하게 샘플링합니다.
위의 노이즈된 BBox를 Transformer Decoder를 통과하고 GT BBox와의 Reconstruction loss는 \( l_1 \) loss와 GIOU loss를 사용합니다.
Denoising(Class)
Class에 대한 노이즈는 \( \gamma \)를 사전정의하고, 이 비율만큼 GT Class를 다른 Class로 Flip 합니다. 예컨대 한 이미지 내에 고양이 클래스가 5개이고 \( \gamma \)가 0.4라면, 2개의 객체만 강아지 클래스로 Flip 합니다.
위의 노이즈된 Class의 Reconstruction loss는 focal loss를 사용합니다.
임베딩의 변형
본 논문은 위에서 구성한 노이즈 된 Class와 BBox를 여러 그룹으로 나누어 진행합니다.
위 그림에서 M은 그룹의 개수입니다. 보통 5 정도로 설정하고, 한 그룹에 대한 것을 수식으로 나타내면 아래와 같습니다.
그리고 이 그룹들을 모아둔, 전체 디노이징에 대한 쿼리를 수식으로 나타내면 아래와 같습니다.
이렇게 노이즈화된 각 쿼리의 Class와 BBox는 각각 scalar와 4D 좌표입니다. 본 논문에서는 이 디노이징 부분과 매칭 부분을 결합하여 한 번에 Transformer Decoder로 입력하였습니다. 그런데 여기서 의문이 어떻게 결합하는지에 대한 것입니다.
Noised BBox의 경우 앵커 임베딩과 동일하게 4D 좌표로 구성되어 있기 때문에 결합하면 되지만, Scalar 값인 Noised Class는 2차원으로 구성된 디코더 임베딩에 바로 결합할 수가 없습니다. 그렇기 때문에 위 네트워크 구조 그림의 Class Label Embeddings와 같이, Class에 대한 2차원 임베딩을 추가로 생성해 주고, 이 임베딩에 Noised Class 인덱스의 값을 추출하여, 디코더 임베딩에 결합해 주는 것입니다. 차원의 수는 COCO의 경우 80개의 클래스로 구성되어 있기 때문에 백그라운드를 포함하여 81개로 구성하여, 총 (81, 임베딩 차원)으로 구성됩니다.
아울러, 디노이징 파트와 매칭 파트가 학습할 때 서로 중첩되면 안 되니, Indicator라는 구분자로 임베딩 차원 마지막에 구분을 해줍니다. 디노이징 파트면 1, 매칭 파트면 0으로 합니다.
먼저 Class Label Embedding을 생성해 주고, 코드를 까 봤을 때는 마지막 Background를 반복하여 Decoder Embedding을 생성합니다(왜 이렇게 하는지는 잘 모르겠습니다). 후에, 노이즈화 된 Class 값들이 Class Label Embedding의 index에 접근하여 Noised Class Embedding을 구성하고, 각각 Indicator를 삽입해 주어 Concat 합니다. 마찬가지로, Anchor Embedding과 Noised BBox도 동일하게 Concat 해줍니다.
Attention Mask
위와 같이 디노이징 파트와 매칭 파트를 결합하였고, 이제 Transformer Decoder로 입력할 준비를 마쳤습니다. 하지만 그대로 입력하여 Attention 연산을 진행하면, 각각의 디노이징 그룹들 및 매칭 파트가 공유될 것이고, GT를 쉽게 예측하는 과적합이 이루어져 성능이 급격하게 저하된다고 합니다. 실제로 성능이 반토막 났습니다. 그러므로 디노이지 파트와 이분 매칭 파트가 서로 독립적으로 학습이 이루어질 수 있게 Mask를 씌워주었습니다.
오른쪽의 Attention mask에서 회색으로 칠한 부분이 Mask입니다. 그리고 왼쪽 그림이 약간 잘못된 거 같은데, 매칭 파트가 디노이지 파트를 볼 수 없게 Attention mask가 되어야 하는데 반대로 된 것 같네요.
추가적으로, 디노이징 파트는 매칭 파트에 대해 마스크를 씌우지 않아도 성능에 영향을 끼치지 않는다고 합니다. 그 이유는 GT에 대한 정보가 있는 디노이징 파트와 달리, 어차피 매칭 파트에는 GT에 대한 정보가 없기 때문이라고 합니다.
마치며
오늘은 최초로 DETR에 디노이징에 대한 접근 방식을 적용한 DN-DETR을 리뷰해 보았습니다. 단순 코드 몇 줄의 추가만으로 좋은 성능을 내었기 때문에 다른 Task에도 적용하면 성능 향상을 이끌 수 있을 거 같습니다.
이상 DN-DETR의 포스팅을 마치겠습니다.
긴 글 읽어주셔서 감사합니다.