ICT 드림업 - 무물 매니저/개발

이미지 crop, 임베딩, FAISS 인덱스 구축 파이프라인 구현(2/2)

kangchaewon 2025. 5. 3. 15:50

2025.05.03 - [ICT 드림업 - 무물 매니저/개발] - 이미지 crop, 임베딩, FAISS 인덱스 구축 파이프라인 구현

 

이미지 crop, 임베딩, FAISS 인덱스 구축 파이프라인 구현(1/2)

프로젝트 개요이미지 속 객체를 자동으로 잘라내고, 그 조각들에 대해 의미 있는 벡터를 만들고, 나중에 유사한 이미지를 빠르게 검색할 수 있는 시스템을 만들고자 했습니다.이를 위해 다음 세

kcw9609.tistory.com

 

이전 글에서는 인덱스 데이터베이스를 생성했다면, 이번 글에서는 벡터 데이터베이스에서 검색합니다.

 

주요 코드 설명

1. 모델 로드 및 데이터 준비

yolo_model = YOLO("yolov8n-seg.pt")
clip_model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
index = faiss.read_index("../data/faiss/image_clip.index")

2. 이미지 임베딩 함수

def image_embedding_from_pil(pil_img: Image.Image) -> np.ndarray:
    inputs = clip_processor(images=pil_img, return_tensors="pt")
    emb = clip_model.get_image_features(**inputs)
    return emb / emb.norm(dim=-1, keepdim=True)

crop 이미지를 CLIP으로 임베딩하여 벡터로 변환합니다.

3. 검색 함수

def search_similar_image(embedding, index, top_k=1):
    distances, indices = index.search(embedding, top_k)
    return distances, indices

검색된 벡터와 가장 유사한 crop을 반환합니다.

4. YOLO로 객체 시각화 + 클릭 인터랙션

def detect_and_interact(image_path: str):
    ...
    cv2.setMouseCallback("YOLOv8 Segmentation Click", on_mouse)

이미지 위에 객체 마스크를 시각화, 사용자가 마우스로 객체를 클릭하면 해당 영역을 crop + 임베딩 + 유사 검색 수행합니다.

5. 클릭 시 처리 로직(확인용)

def on_mouse(event, x, y, ...):
    ...
    embedding = image_embedding_from_pil(pil_cropped)
    distances, indices = search_similar_image(embedding, index)
    ...
    print(f"📄 파일명: {matched_crop_id}")
    print(f"📝 설명: {description}")

검색 결과로 나온 crop 이미지의 crop_id와 설명을 콘솔에 출력합니다.