Source: Beyond-Labels: Advancing Open-Vocabulary Segmentation With Vision-Language Models
당분간 Open-set, Open-vocabulary, Open-ended. 이렇게 세 가지의 도메인에 대해 공부를 할 예정이다. 개념 혼동을 피하기 위해 잠시 정리해보자.
| 분류 | Training 시 카테고리 | Inference 시 카테고리 | 작동 방법 (매커니즘) |
|---|---|---|---|
| Traditional Detection (YOLO, Faster R-CNN) | Fixed Classes (e.g., COCO 80) | Only Image | Classification: calculate probability to choose one among Claases |
| Open-Vocabulary (OVOD) (GLIP, OWL-ViT) | Base Classess + Large Scale Image-text Pairs | Image + Category list to find['Drone', 'Truck'] | Alignment: Matching Image region and text embedding (CLIP) |
| Open-Set Detection | Only specific Class ('Unknown' to rest of them) | Image + Category list to find | If unknown object comes in, find by user prompt |
| Open-Ended Detection (VL-SAM, GenerateU) | No fixed category | Only Image | Generation: See and name an object by model itself. |
| Open-set Detection | Open-Vocabulary Detection (OVOD) | |
|---|---|---|
| Keyword | Unknown category detection | Novel Class (New word)'s naming |
| Background | To break limits of traditional statistical classification | VLM (e.g., CLIP) |
| When Inference | "This is unknown object I've never learned." | "Though I've never seen this, I'm sure it is dog according to my vocabulary skills" |
| Limits of Voca skill | Relatively Narrow | Close to |
FCN, U-Net, DPT와 같은 모델들은 Segmentation작업을 위해 구축된 방대한 데이터셋에서 딥러닝 네트워크를 훈련시키는 데 큰 성공을 거두었다.
하지만 이러한 전통적인 기법들은 특정 카테고리에 맞춰 Classifier를 학습시킨다는 방식에 국한되었는데, 학습 단계에서 Seen Category에 대해서만 레이블을 예측할 수 있다는 것이다.
따라서 테스트 시에 새롭게 등장하는 Unseen Category의 객체는 감지하거나 분류할 수 없는 한계가 존재한다.
MoCo나 DINO와 같은 모델들은 레이블이 없는 데이터(Unlabeled data)만으로도 강력한 시각적 표현을 학습할 수 있음을 증명했다.
최근의 트렌드는 Vision과 Text 도메인을 결합하는 것으로, 단순 대조 학습 기법으로 훈련된 CLIP이나 ALIGN은 추가적 학습 없이도 Zero-shot방식으로 이미지 분류와 같은 새로운 작업을 수행하는 놀라운 성과를 보인다.
이러한 발전은 Open-vocabulary 분할, 이미지 검색, 멀티모달 추론 등 다양한 Vision langauge Task의 길을 열었다.
논문은 앞서 말한 강력한 pre-trained VLM을 사용하여, 텍스트 이름이나 설명만으로 모든 카테고리의 객체를 분할하는 Open-vocabulary의 semantic segmentation 문제를 효율적으로 해결하고자 한다.
Frozen Encoder: 세밀한(Fine-grained) 공간 정보를 포착하기 위해 Positional Encoding이 추가된 Frozen 한 self-supervised 비전 모델을 사용하여 입력 이미지를 인코딩한다. 동시에 Frozen한 언어 모델을 사용하여 카테고리 이름을 인코딩함으로써 텍스트 설명에 대한 강력한 표현을 보장한다.
Fourier Embedding: 이 논문의 가장 중요한 기술 중 하나다. 고차원적인 공간/주파수 특징을 추출하기 위해 푸리에 임베딩을 사용한다. 일반적인 사전 학습 Positional Embeddings을 사용하지 않고, 푸리에 임베딩(빈도 기반 임베딩)에 의존하여 공간 정보를 인코딩한다. 이를 통해 일반화 성능을 높이고 일관된 Spatial Encoding을 생성한다고 한다.
두 모달리티에서 추출된 임베딩을 통합하여 이미지 영역과 텍스트 설명을 정확하게 일치시키고, 결과적으로 다양한 카테고리에 걸쳐 매끄럽게 분할을 수행하는 것이다.
Fourier Embedding의 영향
일반적인 Positional Embedding
보통 트랜스포머에서 사용하는 Learnable PE는 각 위치에 대응되는 특정 벡터를 파라미터로 가진다.
⚠️이 방식은 Discrete하여, 특정 위치에 대한 값은 고정, Spatial한 관계를 유연하게 유추하기 힘들다.
훈련 데이터에 없던 새로운 해상도의 이미지가 들어오면, 학습된 위치 정보가 완전 어긋나버리는 일반화의 한계가 발생하는 것이다.Fourier Embedding (고주파 기반)
- 작동방식: 특정 위치()를 고정된 벡터로 갖는 것이 아닌, sin, cos함수를 사용하여 위치를 다차원 주파수 공간으로 매핑한다.
- 핵심: 픽셀의 위치를 단순 숫자로 인식하는 것이 아닌, "이 위치는 어떤 주파수를 가진 파동의 정점/저점인가?"로 표현한다.
푸리에 변환은 Continuous하여 공간을 파동으로 표현하기 때문에, 픽셀 사이 미세한 위치적 차이도 수학적으로 부드럽게 연결한다.
그럼 PE 말고 항상 Fourier Embedding을 하면?
이론적으로 푸리에 임베딩이 더 강력하고 일반화 성능이 좋아보이지만, 역시나 Trade-off가 존재한다.
- 데이터 성격에 따른 효율성: 정형 데이터- 텍스트나 간단한 분류 문제처럼 위치 정보가 결정적이지 않은 경우, 오히려 Learnable한 PE가 특정 데이터 분포에 빠르게 과적합되어 높은 정확도를 낼 경우가 있다고 한다.
- 비전/공간 데이터: Segmentation이나 NeRF처럼 공간적 연속성이 중요한 작업에서는 푸리에 임베딩이 더 유리하게 작동할 수 있다.
- 모델 설계의 복잡도:
- Learnable PE는 그냥 Look-up Table에서 값을 가져오면 끝이라 구현이 매우 단순하다.
- 반면, 푸리에 임베딩은 입력 좌표를 고차원으로 Projection하는 추가 연산이 필요하며, 어떤 주파수 대역을 사용할지에 따라 성능이 달라질 수 있다.(튜닝 비용 발생)
- 이미지 일반화 vs. 과적합:
이미 고정된 특정 해상도의 데이터셋만 학습하는 환경이면, 굳이 복잡한 푸리에 임베딩 대신 PE로 좋은 성능을 낼 수 있다.
그럼 RoPE나 ALiBi를 적용할 수는 없는가?
GEMINI : "기술적으로 적용은 가능하나, 왜 굳이 푸리에 임베딩을 고집했는지에 대한 이유는 명확하다."
RoPE (Rotary Positional Embedding)
- 원리: 벡터를 회전시켜 상대적 위치 관계를 인코딩한다. 주로 LLM에서 긴 문맥 처리를 위해 사용한다.
- 가능성: 이미지의 2D Grid에 맞춰 RoPE를 확장하면 충분히 가능하다. 시각적 특징 맵의 패치들 사이의 상대적 거리를 매우 효과적으로 잡아낼 수 있을 것이다.
ALiBi (Attention with Linear Biases):
- 원리: 위치 인코딩을 따로 더하지 않고, 어텐션 스코어에 거리에 비례하는 페널티(Bias)를 직접 준다.
- 가능성: 구현이 매우 간결, 학습이 안정적이다. 이미지 패치 간의 원거리 의존성을 제어하는 데에 강력하다.
논문 밖 개인 해석
그럼 왜 해당 방법들 대신 푸리에를 사용했을까?
바로 '목적'과 '성격' 때문이라고 본다.1. 연속성(Continuity)'의 차이
- RoPE/ALiBi: 이들은 본질적으로 '이산적'인 토큰 순서를 처리하는 데에 최적화되어 있다. 물론 2D로 확장할 수는 있어도, 기본적으로 어텐션 메커니즘 내부에서 위치 관계를 조정하는 방식이다.
- 푸리에 임베딩: 이미지 분할은 픽셀이라는 '연속적 공간'에서 일어난다. 푸리에 임베딩은 입력 그 자체를 연속적인 함수 공간으로 변환한다. 즉, 인코더가 이미지를 읽어들일 때부터 "이미지가 아니라 수학적 공간"으로 인지하게 만드는 효과가 있다. 이것이 픽셀 단위의 부드러운 경계를 잡는 데에 유리하다.
2. 모델의 상태: Frozen
이 논문의 모델은 CLIP과 같은 pre-trained 모델을 Frozen한 상태에서 사용한다.
- RoPE나 ALiBi를 적용하려면 어텐션 연산 자체를 수정하거나, 인코더의 내부 레이어에 직접 개입해야 할 수도 있다.
- 반면, 푸리에 임베딩은 인코더의 외부에서 특징 맵에 단순히 Addition만 하면 된다. 동결된 인코더를 전혀 건드리지 않고 공간 정보를 주입할 수 있는 가장 효율적인 방법이다.
VLM이나 Open-vocabulary를 처음 다루는 나에겐 해당 개념들이 조금은 생소하기 때문에, 관련 연구들을 보다 자세히 알아보도록 하겠다.
여기서 Open-Vocabulary와 맞닿아 있는 Zero-shot 개념이 나온다.
이전 연구들은 크게 단어 임베딩을 통해 새로운 카테고리의 시각적 특징을 만들어내는 생성적 방식(ZS3Net, CaGNet) 과 픽셀과 카테고리 이름을 공유된 공간에 매핑하는 판별적 방식(SPNet) 으로 나누어 연구해왔다.
여기가 바로 VLM이 무엇인지 이해할 수 있는 파트이다.
이 논문은 각 작업을 위해 pre-trained 모델을 fine-tuning하는 대신, 가벼운 퓨전 모듈을 사전 학습된 시각 및 언어 모델과 통합하는 더 단순한 전략을 채택한다.
강력한 VLM을 가져왔으니, 이미지를 픽셀 단위로 쪼개는 Segmentation에 필요한 공간 정보를 어떻게 잘 처리할 것인가에 대한 이야기이다.
이 논문이 풀고싶은 문제는 open-vocabulary semantic segmentation으로, 일반 segmentation처럼 정해진 클래스만 분할하는 것이 아닌, 학습 때도 보지 못한 category 이름이 들어와도 텍스트 정보를 이용하여 해당 영역을 분할하려는 문제이다.

파이프라인은 크게 3가지 영역으로 나눌 수 있겠다.
Visual Branch: 입력 이미지 푸리에 임베딩 추가 FrozenVisualt Encoder (e.g., CLIP ViT) visual/spatial feature 추출
Language Branch: 카테고리 텍스트 Fozen Text Encoder (e.g., CLIP Text Encoder) 언어적 개념 추출
Fusion Module: 두 브렌치의 특징을 받아 트랜스포머 레이어에서 상호작용, 최종적으로 픽셀별 점수 계산
Open-vocabulary 분할을 "텍스트 쿼리 기반의 픽셀 분류 문제"로 정의한다.
여기서 는 입력 이미지, 는 segmentation mask, 는 이미지 안에서 관측된 category 집합, 는 전체 학습 category 집합이다.
"We aim to train a segmentation model that separates a test image into significant areas of unexplored categories.
즉, 재현할 때의 목표는 단순 PASCAL의 20개 클래스를 맞추는 것이 아닌, 학습 category 밖의 unseen category에 대해서도 텍스트 이름을 주면 mask를 만들 수 있는 구조를 재현하는 것이다.
여기서 중요한 점은 가 라는 점인데, 모델은 사실상 category마다 binary mask를 예측하는 형태에 가깝다 (카테고리 개수만큼의 채널이기 때문).
Y[:, :, 0] = dog mask
Y[:, :, 1] = cat mask
이런 식으로, dog mask는 각 픽셀에 대해
"이 픽셀이 dog인가?" 를 0/1 로 표현한다.
마지막에 class-wise thresholding과 sigmoid를 사용하는 이유도 이와 연결된다.
이 단계는 모델이 이미지를 "어떻게 이해하는가" 알 수 있다.
이미지를 patch 단위 feature sequence로 바꾸고, 각 patch에 Fourier Positional Information을 더한 뒤, visual encoder로 보낸다.
ViT 방식으로, non-overlapping 2D patch 들의 집합으로 나눈다.
예를 들어 이미지가 HxW, patch size가 p이면:
H' = H / p
W' = W / p
N = H' * W' # N은 패치 개수
CLIP ViT-B/16을 쓰면 보통 p=16, 224x224로 입력이 들어온다고 할 때:
H' = 14
W' = 14
N = 196
"Fourier embeddings are used to encode positional information."
즉, 일반 ViT/CLIP처럼 학습된 PE를 그대로 쓰는 대신, patch의 좌표(x, y)를 sinusoidal/Fourier Feature 로 변환해서 위치 정보를 준다는 뜻이다.
여기서 중요한 점은,
: 번째 image patch embedding,
: patch grid 위치 에 대한 푸리에 임베딩
: 위치 정보가 더해진 최종 patch embedding
인데, Fourier Embedding이 learned positional embedding이 아니라는 것이다. 좌표를 sin/cos 함수로 변환해서 만들기 때문에, 이미지 크기나 위치 변하에 좀 더 부드럽게 일반화될 수 있다고 보는 것이다.말이 나온 김에 Fourier Embedding의 장점을 다시 살펴보자
1. 좌표 기반이라 해상도 변화에 대응하기 쉬움
2. sin/cos 기반이라 위치 변화가 연속적
3. patch 간 상대적/공간적 구조를 부드럽게 표현
4. segmentation처럼 dense prediction이 필요한 task에 잘 맞는다.
x_i에 Fourier positional embedding f_emb(x, y)를 더해서 position-aware patch embedding을 만든다.h x w x C Feature Map이라기보다, 먼저F_i ∈ R^{h*w × d} 형태의 patch token sequence로 나온다고 보는 것이 맞다.추가로 'frozen'의 의미는
F_i가 고정인 것이 아니라,Vis_Enc의 parameter가 학습 중 업데이트 되지 않는다.라는 뜻이다.
입력 이미지가 달라지면F_i도 달라지지만, 그 feature를 만드는 encoder 함수 자체는 사전학습된 상태로 고정된다.
카테고리 이름을 segmentation에 쓸 수 있는 벡터로 바꾸는 단계이다.
Visual branch가 이미지 patch들을 feature로 바꿨다면, Textual branch는 dog, cat, person과 같은 category name을 CLIP text encoder에 넣어 text feature로 만든다.
"Semantic categories (W) are encoded using a text encoder."
즉, 입력은 이미지가 아니라 semantic category set이다.
예를 들어 PASCAL-5i에서 현재 평가해야 할 class가 다음과 같다고 해보자.
W = {dog, cat, person, car, chair}
이때 모델은 각 단어를 그냥 문자열로 쓰지 않고, text encoder가 이해할 수 있는 자연어 prompt로 바꾼다. 논문은 예시 prompt로 다음을 말한다.
"a picture of a category within the context."
조금 더 구현 친화적으로 쓰자면 이렇다.
"a picture of a dog within the context"
"a picture of a cat within the context"
"a picture of a person within the context"
왜 굳이 prompt template을 쓰냐면, CLIP은 단어 하나보다 자연어 문장 형태의 입력에서 더 안정적인 의미 표현을 만들기 때문이다. dog만 넣는 것보다 a photo of a dog, a picture of a dog처럼 넣는 것이 더 CLIP pretraining과 잘 맞는다.
는 입력 category들의 집합, 는 각 category에 대한 text feature matrix이다.
예를 들어 class가 5개이고, CLIP embedding dimension이 512이면,
F_W ∈ R^{5 × 512}로, 각 행이 하나의 category vector 이다.
F_W[0] = dog text feature
F_W[1] = cat text feature
F_W[2] = person text feature
...
여기서 중요한 점은 여러 prompt를 평균낸다는 점이다. 논문은 text encoder가 만든 output embeddings를 average한다고 설명한다. 즉, dog에 대해 prompt를 여러 개 썼다면, 각 prompt에서 embedding을 뽑고 평균내서 최종 dog embedding을 만든다.
이렇게 하면 특정 prompt 문장 하나에 과의존하지 않고, category 의미를 조금 더 안정적으로 표현 가능하다.
🔥 Text feature의 중요성
기존 semantic segmentation에서는 마지막 classifier가 고정된 class 개수만큼 예측한다.
하지만, 이 논문에서는 text embeddingF_W가 사실상 동적으로 주어지는 classifier prototype처럼 작동한다.visual pixel feature <-> text category feature를 비교해서 이 픽셀이
dog과 얼마나 비슷한지를 계산하는 구조가 되는 것이다.
(나중에 decoder 이후에는 pixel-level visual feature와 text feature 사이에 코사인 유사돌르 계산한다.)
그래서 Textual Feature Extraction은 단순 텍스트 인코딩 보조 단계가 아니라, open-vocabulary가 가능해지는 핵심이다. 새로운 클래스가 들어와도 classifier head를 다시 학습하는 게 아니라, 그 class name을 text encoder에 넣어 새로운F_W를 만들면 되기 때문이다.
이미지와 텍스트가 처음으로 서로를 보며 갱신되는 단계이다.
이전까지는 두 개의 branch: Visual branch, text branch 가 따로따로 움직였다.
Visual branch: image -> F_i
Text branch: category text -> F_W
D. Multimodal Embedding Fusion 부터는 이 두 개의 branch를 합쳐서 visual feature가 text category를 의식하고, text feature도 image context를 반영하도록 한다.
"To align the visual and textual information, we use MLPs."
즉, MLP를 먼저 써서 visual feature와 text feature의 channel dimension을 맞춘다.
Visual Feature는 B절에서 나온다.
구현 관점에서는 batch를 포함하여:
Text Feature는 C절에서 나온다.
구현 관점에서는:
여기서 K = |W|, 즉 입력 category 개수이다. batch를 처리할 때는 보통 image batch마다 같은 category set을 복제하여 처럼 맞춘다.
논문은 와 의 채널 차원을 맞추기 위해 MLP 를 사용한다고 한다.
예를 들어 visual encoder output이 768차원이고, text encoder output이 512차원이라면, fusion module에 넣기 전에 둘은 같은 차원 C로 맞춰야 한다.
,
CLIP 계열에서는 visual/text feature가 이미 같은 embedding dimension일 수도 있겠지만, 그래도 MLP를 쓰는 이유는 단순 차원 정렬뿐 아니라 fusion에 적합한 feature space로 projection하기 위해서라고 볼 수 있다.
이 식의 핵심은 와 를 하나의 multimodal token sequence로 만든 뒤, fusion module에 넣는다는 것이다.
구현적으로는 보통 token dimension 방향으로 concatenate 한다고 보면 된다.
🤨 token dimension 방향으로 concat이요?
쉽게 말해 이미지 patch token들과 텍스트 category token들을 한 줄짜리 sequence로 이어 붙인다는 뜻이다.
예를 들어 visual feature가 다음과 같이 생겼다고 가정하자.
F_i.shape = [B, N_img, d]
여기서B = batch size N_img = 이미지 patch 개수, 예: 16×16 = 256 d = embedding dimension텍스트 feature는 category마다 하나의 token이라고 본다면,
F_w.shape = [B, N_cls, d]이고, 예를 들어 category가
{dog, cat, car}이라면,N_cls = 3그러면, token dimension 방향 concat은?
F = torch.cat([F_i, F_w], dim=1) 이 될 것이고, 예를 들어 보자면, | F_i: [B, 256, 512] F_w: [B, 3, 512] | concat 결과: F: [B, 259, 512]여기서
dim=1이 바로 token dimension또는, sequence dimension이다.
논문은 fusion model이 "multiple transformer encoder layers"를 사용한다고 한다.
중요한 점은 이것이 꼭 cross-attention 전용 모듈이라기보다는, visual token과 text token을 합친 뒤 transformer self-attention을 적용하는 방식에 가깝다는 것이다.
self-attention 안에서는 모든 token이 서로를 볼 수 있다.
때문에 해당 단계 이후에는 visual feature가 더이상 순수 image-only feature가 아니다. 예를 들어 dog, cat이라는 text token들은 "이 patch가 dog/cat과 관련이 있는가?"라는 방향으로 갱신될 수 있다.
반대로 text feature도 image context를 반영하여 갱신된다.
F_i -> F_i_upd
F_W -> F_w_upd
Transformer encoder를 통과한 output은 여전히
[B, N+K, C] 형태이다. 이것을 앞부분과 뒷부분으로 나눈다.
F_i_upd = Z_out[:, :N, :] # updated visual features
F_w_upd = Z_out[:, N:, :] # updated text features
결과적으로 shape은 원래와 비슷해진다.
논문도 "fused visual and text features resemble the originals in shape"라고 설명한다. 즉, shape는 유지되지만, 내용은 서로의 modality를 참고해서 갱신된 상태이다.
왜 이 단계가 중요할까? 🧐
이 fusion module이 없으면 visual feature와 text feature는 각각 frozen encoder에서 나온 독립적인 표현이다. CLIP이 이미 image-text alignment를 어느 정도 학습했지만, segmentation에서는 image-level alignment 만으로는 한참 부족하다.
segmentation은 pixel/patch 단위로 판단해야 하기 때문이다.
따라서 visual feature와 text feature가 dense prediction에 맞게 한 번 더 상호작용 해야한다. 이 역할을 하는 것이 Multimodal Embedding Fusion이다.조금 더 쉽게 풀어보자면...
앞 단계까지는 이미지와 텍스트가 따로 놀았다.이미지 encoder: "이 사진에는 이런 모양, 질감, 위치의 patch들이 있어." 텍스트 encoder: "'dog'는 이런 의미를 가진 단어야."그런데 segmentation을 하려면, 단순 이미지 전체가 dog와 관련이 있는 것이 아니라, "어느 픽셀이 dog인가?", "어느 부분은 background인가?"를 판별해야한다.
CLIP과 같은 VLM은 원래 이미지 전체와 텍스트 전체를 맞추는 데에 강하다. 예를 들어 이미지 한 장과'A dog'이라는 문장이 잘 어울리는지는 잘 판단한다. 하지만, segmentation은 훨씬 더 세밀하다.이미지 전체와 dog가 어울린다. - X | 왼쪽 아래 patch는 dog와 어울린다 - O 오른쪽 위 patch는 background와 어울린다 - O 가운데 patch는 cat과 어울린다. - O그래서 Fusion Module이 필요한 것이다.
Fusion 전에는 visual feature가 다음과 같은 상태라고 할 수 있다.patch 1: 털 같은 texture patch 2: 둥근 귀 모양 patch 3: 배경 잔디 patch 4: 고양이 얼굴 일부text feature는 이런 상태이다.
dog: 개라는 개념 cat: 고양이라는 개념 background: 배경이라는 개념Fusion Module은 이 둘을 같이 transformer에 넣어서, 각 patch가 category text를 참고하게 만든다.
그러면 visual feature가 이렇게 바뀌는데..patch 1: 털 texture + dog/cat 후보와 비교된 정보 patch 2: 귀 모양 + dog와 더 관련 있음 patch 3: 잔디 texture + background와 더 관련 있음 patch 4: 얼굴 일부 + cat과 더 관련 있음즉, 단순한 visual feature가 아니라 text-aware visual feature가 된다.
반대로 text feature도 image를 참고해서 조금 더 현재 이미지에 맞게 조정된다.
정리하자면, **CLIP이 아는 "dog"와 이미지 속 patch들을 그냥 비교하는 것이 아니라, 현재 이미지 안에서 "dog일 가능성이 있는 영역"을 서로 맞춰보며 feature를 갱신하기 때문이다.
지금까지의 흐름을 다시 보자면,
B. Visual Feature Extraction
이미지 -> patch-level visual feature F_i
C. Textual Feature Extraction
category text -> text feature F_W
D. Multimodal Embedding Fusion
F_i, F_W -> updated visual/text feature
-> F_i_upd, F_w_upd
이제 E. The Hierarchical Visual Decoder에서는 이 와 를 가지고 실제 segmentation mask를 만드는 과정을 설명한다.

핵심은 크게 4가지 단계이다.
즉, 이제부터는 "이미지와 텍스트를 어떻게 이해했는가"가 아닌, 그 이해를 어떻게 pixel-level mask로 바꾸는가?의 문제이다.
"The decoder gives us the visual feature map, which is progressively upsampled to match the resolution of the input image."
patch-level feature는 원본 이미지보다 해상도가 낮다. 예를 들어224x224이미지를16x16patch로 나누면 visual feature는14x14grid이다. 그런데 segmentation mask는 원본 이미지처럼224x224에 가까워야 한다.
그래서 decoder가 필요하다.
[B, C, 14, 14]
-> decoder / upsampling
-> [B, C, 224, 224]
"The upsampled visual features are compared with the textual features using cosine similarity."
즉, 각 pixel 위치의 visual feature와 각 category text feature를 비교한다.
"Using class-wise thresholding and a sigmoid with a temperature."
즉, category별 threshold와 temperature-scaled sigmoid를 사용해서 최종 binary segmentation을 만든다.