예상과 비교 (노트북 "결과" 셀 메모): 직접 본 이미지 설명 기준으로 예상 Top-2는 image1(흰 티에 어두운 청색 반바지), image2(파란 크롭탑에 청바지)였지만, 실제는 image2, image5(하늘색 셔츠에 베이지 바지)였습니다. 노트북에는 상/하의 구분 없이 색과 옷 종류를 같이 보기 때문으로 정리했습니다(원인 검증은 하지 않음). 점수 차이가 작아(0.0665~0.1045) 순위가 질의 표현에 쉽게 바뀔 수 있고, 개선 방법으로 질의를 구체적으로 쓰거나 바지만 보이게 크롭하는 것을 적었습니다.
추론 성능 (CPU / GPU)
측정 안 함. 지연 시간·처리량·메모리를 재는 코드가 노트북에 없습니다. infer_ms는 넣지 않았습니다.
장비
장비 이름
배치 크기
지연 시간 (샘플당, p50 / p95)
처리량 (샘플/초)
메모리 사용
CPU
[미확인]
-
측정 안 함
측정 안 함
측정 안 함
GPU
NVIDIA GeForce RTX 4070 Laptop 8GB
1
측정 안 함
측정 안 함
측정 안 함
한계 · 배운 점한계 알려진 실패 유형: 정답으로 보이는 bear 의 점수도 0.189로 낮았음. 프롬프트 문구를 바꿔 비교하지 않음 ( [미…
한계
알려진 실패 유형: 정답으로 보이는 bear의 점수도 0.189로 낮았음. 프롬프트 문구를 바꿔 비교하지 않음 ([미확인]). [🚩AI 설명] sigmoid 점수는 각 라벨의 독립 확률이라 프롬프트 문구("a photo of a bear" 등)에 따라 달라질 수 있음
검색 결과가 예상과 다름: 질의에 맞는 바지가 있는 image1이 Top-2에 못 들었음. [🚩AI 설명] 이미지 5장뿐이라 일반화는 불가
코드 수정 이력: 처음에는 trancation 오타, 검색 텍스트 padding 누락, 텍스트 벡터 미정규화(점수가 코사인 아닌 내적, 질의 "a blue pants" Top-2 = image1·image4)였으나 노트북에서 모두 고쳐 다시 실행함. 고친 뒤 결과가 바뀜 (결과가 바뀐 원인은 텍스트 벡터 정규화와 오타 수정이라고 직접 확인함, 사용자 확인)
로드 경고: 모델 config의 bos_token_id·eos_token_id(49406·49407)가 어휘 범위(0~31999)를 벗어난다는 transformers 경고가 출력됨. 결과에 미친 영향은 [미확인]
이미지 벡터화 셀이 processor(text=classes, images=...)로 불필요하게 텍스트(classes)까지 처리함 (결과에는 영향 없음)
편향 / 공정성 이슈: [미확인]
성능이 떨어지는 입력 조건: [미확인] (이미지 1장, 5장만 확인)
배운 점
SigLIP2 텍스트는 항상 max_length=64까지 패딩한 상태로 학습되어 있어, 검색 질의에도 padding="max_length"를 써야 한다 (노트북 메모)
제로샷 분류는 클래스를 학습 때 고정하지 않고 추론 때 텍스트로 지정한다. 클래스 추가·변경이 프롬프트 수정만으로 되지만 과제에 특화한 지도학습 분류보다 정확도는 대체로 낮다
SigLIP2는 분류 헤드가 없는 이미지-텍스트 임베딩 모델이다. 사전학습 가중치로 추론만 하면 "제로샷 분류"로 쓴 것이다
CLIP은 softmax로 라벨끼리 확률을 나누고(합 = 1), SigLIP2는 sigmoid로 이미지-텍스트 쌍마다 독립적인 "맞다/아니다" 점수를 낸다. 합이 1이 아니어도 정상이고 모든 라벨이 낮게 나올 수도 있다
벡터화 함수가 다르다: CLIP은 vision_model → visual_projection → 정규화, SigLIP2는 get_image_features(...) → 정규화. transformers 5 이상은 .pooler_output을 붙여야 한다
[🚩AI 설명] 같은 질의와 이미지 묶음으로 CLIP과 비교하지 않아(질의가 다름: "a black shirt" vs "a photo of blue pants") 성능 차이는 말할 수 없다
[🚩AI 설명] 다음에 해 볼 것: 같은 이미지·같은 질의로 CLIP과 SigLIP2의 Top-k와 속도 비교
사용 방법코드 셀 4개
In [1]모델 불러오기
import torch
from transformers import AutoModel, AutoProcessor
from transformers.image_utils import load_image
device = "cuda" if torch.cuda.is_available() else "cpu"
ckpt = "google/siglip2-base-patch16-224"
model = AutoModel.from_pretrained(ckpt, device_map="auto").eval()
processor = AutoProcessor.from_pretrained(ckpt)
Out[1] 출력 보기
cuda
Loading weights: 0%| | 0/408 [00:00<?, ?it/s]