OpenAI CLIP과 Meta FAISS를 사용한 의미론적 이미지 검색

소개

이 가이드에서는 OpenAI CLIP, Meta FAISS, 그리고 Flask를 사용하여 의미론적 이미지 검색(semantic image search) 엔진을 구축하는 방법을 안내합니다. CLIP의 강력한 시각-언어 임베딩과 FAISS의 효율적인 최근접 이웃 검색을 결합하여, 자연어 쿼리를 사용하여 관련 이미지를 검색할 수 있는 완벽한 웹 인터페이스를 만들 수 있습니다.



Watch: How Similarity Search Works | Visual Search Using OpenAI CLIP, META FAISS and Ultralytics Package 🎉

의미론적 이미지 검색 시각적 미리보기

의미론적 검색 결과 개요가 포함된 Flask 웹 페이지

작동 원리

  • CLIP은 이미지용 비전 인코더(예: ResNet 또는 ViT)와 언어용 텍스트 인코더(Transformer 기반)를 사용하여 둘 다 동일한 다중 모달 임베딩 공간으로 투영합니다. 이를 통해 코사인 유사도를 사용하여 텍스트와 이미지 간의 직접적인 비교가 가능합니다.
  • FAISS(Facebook AI Similarity Search)는 이미지 임베딩 인덱스를 구축하고, 주어진 쿼리에 가장 가까운 벡터를 빠르고 확장성 있게 검색할 수 있도록 지원합니다.
  • Flask는 자연어 쿼리를 제출하고 인덱스에서 의미적으로 일치하는 이미지를 표시할 수 있는 간단한 웹 인터페이스를 제공합니다.

이 아키텍처는 제로샷(zero-shot) 검색을 지원하므로, 레이블이나 카테고리가 필요 없이 이미지 데이터와 좋은 프롬프트만 있으면 됩니다.

Ultralytics Python 패키지를 사용한 의미론적 이미지 검색
이미지 경로 주의사항

자체 이미지를 사용하는 경우, 이미지 디렉토리에 대한 절대 경로를 제공해야 합니다. 그렇지 않으면 Flask의 파일 제공 제한으로 인해 웹페이지에 이미지가 나타나지 않을 수 있습니다.

from ultralytics import solutions

app = solutions.SearchApp(
    # data = "path/to/img/directory" # Optional, build search engine with your own images
    device="cpu"  # configure the device for processing, e.g., "cpu" or "cuda"
)

app.run(debug=False)  # You can also use `debug=True` argument for testing

VisualAISearch 클래스

이 클래스는 다음과 같은 모든 백엔드 작업을 수행합니다:

  • 로컬 이미지에서 FAISS 인덱스를 로드하거나 구축합니다.
  • CLIP을 사용하여 이미지 및 텍스트 임베딩을 추출합니다.
  • 코사인 유사도를 사용하여 유사도 검색을 수행합니다.
유사 이미지 검색
이미지 경로 주의사항

자체 이미지를 사용하는 경우, 이미지 디렉토리에 대한 절대 경로를 제공해야 합니다. 그렇지 않으면 Flask의 파일 제공 제한으로 인해 웹페이지에 이미지가 나타나지 않을 수 있습니다.

from ultralytics import solutions

searcher = solutions.VisualAISearch(
    # data = "path/to/img/directory" # Optional, build search engine with your own images
    device="cuda"  # configure the device for processing, e.g., "cpu" or "cuda"
)

results = searcher("a dog sitting on a bench")

# Ranked Results:
#     - 000000546829.jpg | Similarity: 0.3269
#     - 000000549220.jpg | Similarity: 0.2899
#     - 000000517069.jpg | Similarity: 0.2761
#     - 000000029393.jpg | Similarity: 0.2742
#     - 000000534270.jpg | Similarity: 0.2680

VisualAISearch 매개변수

아래 표는 VisualAISearch에서 사용할 수 있는 매개변수를 설명합니다:

인수(Argument)유형(Type)기본값(Default)설명
datastr'images'유사성 검색에 사용되는 이미지 디렉토리 경로입니다.
인수(Argument)유형(Type)기본값(Default)설명
devicestrNone추론을 위한 장치(예: cpu, cuda:0 또는 0)를 지정합니다. 모델 실행을 위해 CPU, 특정 GPU 또는 기타 컴퓨팅 장치 중 하나를 선택할 수 있습니다.

CLIP 및 FAISS를 사용한 의미론적 이미지 검색의 장점

CLIP 및 FAISS로 자신만의 의미론적 이미지 검색 시스템을 구축하면 다음과 같은 강력한 장점이 있습니다:

  1. 제로샷 기능: 특정 데이터셋으로 모델을 학습시킬 필요가 없습니다. CLIP의 제로샷 학습을 사용하면 자유 형식의 자연어를 사용하여 모든 이미지 데이터셋에서 검색 쿼리를 수행할 수 있어 시간과 리소스를 모두 절약할 수 있습니다.

  2. 인간 수준의 이해력: 키워드 기반 검색 엔진과 달리, CLIP은 의미론적 맥락을 이해합니다. "자연 속에 있는 행복한 아이" 또는 "밤의 미래 도시 스카이라인"과 같은 추상적, 감정적 또는 관계적 쿼리를 기반으로 이미지를 검색할 수 있습니다.

    OpenAI Clip 이미지 검색 워크플로우

  3. 레이블이나 메타데이터 불필요: 기존의 이미지 검색 시스템은 세심하게 레이블이 지정된 데이터가 필요합니다. 이 접근 방식은 원시 이미지만 있으면 됩니다. CLIP은 수동 주석 없이도 임베딩을 생성합니다.

  4. 유연하고 확장 가능한 검색: FAISS는 대규모 데이터셋에서도 빠른 최근접 이웃 검색을 가능하게 합니다. 속도와 메모리에 최적화되어 있어 수천(또는 수백만) 개의 임베딩이 있어도 실시간 응답을 제공합니다.

    Meta FAISS 임베딩 벡터 구축 워크플로우

  5. 교차 도메인 애플리케이션: 개인 사진 아카이브, 창의적인 영감 도구, 상품 검색 엔진, 심지어 예술 추천 시스템을 구축하든, 이 스택은 최소한의 조정으로 다양한 도메인에 적응할 수 있습니다.

FAQ

CLIP은 어떻게 이미지와 텍스트를 모두 이해합니까?

CLIP(Contrastive Language Image Pretraining)은 OpenAI가 개발한 모델로, 시각 정보와 언어 정보를 연결하는 법을 학습합니다. 이 모델은 자연어 캡션과 짝을 이룬 방대한 이미지 데이터셋으로 학습되었습니다. 이러한 학습을 통해 이미지와 텍스트 모두를 공유 임베딩 공간에 매핑하여 벡터 유사도를 사용하여 직접 비교할 수 있습니다.

왜 CLIP은 AI 작업에서 매우 강력하다고 평가받습니까?

CLIP의 뛰어난 점은 일반화 능력입니다. 특정 레이블이나 작업에 대해서만 학습되는 것이 아니라 자연어 자체에서 학습합니다. 이를 통해 "제트 스키를 타는 남자"나 "초현실적인 꿈의 풍경"과 같은 유연한 쿼리를 처리할 수 있어, 재학습 없이도 분류부터 창의적인 의미론적 검색까지 모든 작업에 유용합니다.

이 프로젝트(의미론적 검색)에서 FAISS는 정확히 어떤 역할을 합니까?

FAISS(Facebook AI Similarity Search)는 고차원 벡터를 매우 효율적으로 검색할 수 있도록 돕는 툴킷입니다. CLIP이 이미지를 임베딩으로 변환하면, FAISS는 텍스트 쿼리와 가장 유사한 결과를 빠르고 쉽게 찾을 수 있도록 하며, 이는 실시간 이미지 검색에 완벽합니다.

CLIP과 FAISS는 OpenAI와 Meta에서 나왔는데, 왜 Ultralytics Python 패키지를 사용해야 합니까?

CLIP과 FAISS는 각각 OpenAI와 Meta가 개발했지만, Ultralytics Python 패키지를 사용하면 단 2줄의 워크플로우로 완전한 의미론적 이미지 검색 파이프라인에 통합할 수 있습니다:

유사 이미지 검색
from ultralytics import solutions

searcher = solutions.VisualAISearch(
    # data = "path/to/img/directory" # Optional, build search engine with your own images
    device="cuda"  # configure the device for processing, e.g., "cpu" or "cuda"
)

results = searcher("a dog sitting on a bench")

# Ranked Results:
#     - 000000546829.jpg | Similarity: 0.3269
#     - 000000549220.jpg | Similarity: 0.2899
#     - 000000517069.jpg | Similarity: 0.2761
#     - 000000029393.jpg | Similarity: 0.2742
#     - 000000534270.jpg | Similarity: 0.2680

이 상위 수준의 구현은 다음을 처리합니다:

  • CLIP 기반 이미지 및 텍스트 임베딩 생성.
  • FAISS 인덱스 생성 및 관리.
  • 코사인 유사도를 사용한 효율적인 의미론적 검색.
  • 디렉토리 기반 이미지 로딩 및 시각화.

이 앱의 프론트엔드를 사용자 정의할 수 있습니까?

네. 현재 설정은 기본 HTML 프론트엔드를 갖춘 Flask를 사용하지만, 이를 자체 HTML로 대체하거나 React, Vue 또는 기타 프론트엔드 프레임워크를 사용하여 더 동적인 UI를 구축할 수 있습니다. Flask는 사용자 지정 인터페이스를 위한 백엔드 API 역할을 할 수 있습니다.

정적인 이미지 대신 동영상을 검색할 수 있습니까?

직접적으로는 불가능합니다. 간단한 해결 방법은 동영상에서 개별 프레임(예: 1초당 1개)을 추출하여 이를 독립적인 이미지로 취급한 뒤 시스템에 입력하는 것입니다. 이렇게 하면 검색 엔진이 동영상의 시각적 순간을 의미론적으로 인덱싱할 수 있습니다.

댓글