OpenAI CLIP 및 Meta FAISS를 사용한 시맨틱 이미지 검색
소개
이 가이드에서는 OpenAI CLIP, Meta FAISS 및 Flask를 사용하여 시맨틱 이미지 검색 엔진을 구축하는 과정을 안내합니다. CLIP의 강력한 시각-언어 임베딩과 FAISS의 효율적인 최근접 이웃 검색을 결합하여 자연어 쿼리를 사용하여 관련 이미지를 검색할 수 있는 완전한 기능을 갖춘 웹 인터페이스를 만들 수 있습니다.
참고: 유사성 검색 작동 방식 | OpenAI CLIP, META FAISS 및 Ultralytics 패키지를 사용한 시각적 검색 🎉
시맨틱 이미지 검색 시각적 미리보기
작동 방식
- CLIP은 이미지에 대한 비전 인코더(예: ResNet 또는 ViT)와 언어에 대한 텍스트 인코더(Transformer 기반)를 사용하여 둘 다 동일한 다중 모드 임베딩 공간으로 투사합니다. 이를 통해 코사인 유사도를 사용하여 텍스트와 이미지 간의 직접적인 비교가 가능합니다.
- FAISS (Facebook AI Similarity Search)는 이미지 임베딩의 인덱스를 구축하고 주어진 쿼리에 가장 가까운 벡터를 빠르고 확장 가능하게 검색할 수 있도록 합니다.
- Flask는 자연어 쿼리를 제출하고 인덱스에서 의미상 일치하는 이미지를 표시하는 간단한 웹 인터페이스를 제공합니다.
이 아키텍처는 제로샷 검색을 지원합니다. 즉, 레이블이나 범주가 필요 없고 이미지 데이터와 적절한 프롬프트만 있으면 됩니다.
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 i.e "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 i.e "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
:
인수 | 유형 | 기본값 | 설명 |
---|---|---|---|
data |
str |
'images' |
유사성 검색에 사용되는 이미지 디렉토리 경로입니다. |
인수 | 유형 | 기본값 | 설명 |
---|---|---|---|
device |
str |
None |
추론을 위한 장치를 지정합니다 (예: cpu , cuda:0 또는 0 ). 사용자는 모델 실행을 위해 CPU, 특정 GPU 또는 기타 컴퓨팅 장치 중에서 선택할 수 있습니다. |
CLIP 및 FAISS를 사용한 시맨틱 이미지 검색의 장점
CLIP 및 FAISS를 사용하여 자체 시맨틱 이미지 검색 시스템을 구축하면 다음과 같은 몇 가지 강력한 이점이 있습니다.
-
Zero-Shot 기능: 특정 데이터 세트에 대해 모델을 학습할 필요가 없습니다. CLIP의 Zero-Shot 학습을 통해 자유 형식의 자연어를 사용하여 모든 이미지 데이터 세트에 대한 검색 쿼리를 수행할 수 있으므로 시간과 리소스를 절약할 수 있습니다.
-
인간과 유사한 이해: 키워드 기반 검색 엔진과 달리 CLIP은 의미론적 컨텍스트를 이해합니다. "자연 속에서 행복한 아이" 또는 "밤에 미래 도시 스카이라인"과 같은 추상적, 감정적 또는 관계적 쿼리를 기반으로 이미지를 검색할 수 있습니다.
-
레이블 또는 메타데이터 불필요: 기존 이미지 검색 시스템은 신중하게 레이블링된 데이터가 필요합니다. 이 접근 방식에서는 원시 이미지만 필요합니다. CLIP은 수동 주석 없이 임베딩을 생성합니다.
-
유연하고 확장 가능한 검색: FAISS는 대규모 데이터 세트에서도 빠른 최근접 이웃 검색을 가능하게 합니다. 속도와 메모리에 최적화되어 수천 (또는 수백만) 개의 임베딩에서도 실시간 응답이 가능합니다.
-
교차 도메인 애플리케이션: 개인 사진 보관함, 창의적인 영감 도구, 제품 검색 엔진 또는 미술 추천 시스템을 구축하든, 이 스택은 최소한의 조정으로 다양한 도메인에 적응합니다.
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 i.e "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 또는 다른 프런트엔드 프레임워크를 사용하여 보다 동적인 것을 구축할 수도 있습니다. Flask는 사용자 지정 인터페이스를 위한 백엔드 API 역할을 쉽게 수행할 수 있습니다.
정지 이미지 대신 비디오를 검색할 수 있습니까?
직접적으로는 불가능하지만 간단한 해결 방법이 있습니다. 비디오에서 개별 프레임을 추출하여 (예: 1초마다 하나씩) 독립 실행형 이미지로 취급하고 시스템에 공급할 수 있습니다. 이렇게 하면 검색 엔진이 비디오의 시각적 순간을 의미적으로 인덱싱할 수 있습니다.