OpenAI CLIP으로 시맨틱 이미지 검색을 구축하는 방법#
이 가이드에서는 OpenAI CLIP과 Flask를 사용하여 시맨틱 이미지 검색 엔진을 구축하는 방법을 안내합니다. CLIP의 비전-언어 임베딩과 NumPy로 구동되는 빠른 코사인 유사도 검색을 결합하면, 레이블이나 카테고리 없이도 자연어 쿼리에서 관련 이미지를 검색하는 웹 인터페이스를 구축할 수 있습니다.
Watch: How Similarity Search Works | Visual Search Using OpenAI CLIP and the Ultralytics Package 🎉

Ultralytics Python 패키지는 전체 파이프라인을 두 개의 클래스로 래핑하므로, 몇 줄의 코드만으로 작동하는 검색 앱을 실행하거나 프로그래밍 방식으로 쿼리를 수행할 수 있습니다. 이 가이드에서는 시맨틱 검색이 유용한 이유, 작동 방식, 웹 앱 실행, 프로그래밍 방식 검색, 매개변수 구성을 다룹니다.
시맨틱 이미지 검색을 사용하는 이유#
CLIP으로 자체 시맨틱 이미지 검색 시스템을 구축하면 다음과 같은 여러 가지 이점이 있습니다.
- 제로샷 기능: 데이터셋으로 학습할 필요가 없습니다. CLIP의 제로샷 학습을 사용하면 자유로운 자연어로 모든 이미지 컬렉션을 쿼리할 수 있어 시간과 리소스를 절약할 수 있습니다.
- 사람과 유사한 이해: 키워드 검색과 달리 CLIP은 시맨틱 컨텍스트를 이해하고 "자연 속의 행복한 아이" 또는 "밤의 미래적인 도시 스카이라인"과 같은 추상적, 감정적 또는 관계적 쿼리에서 이미지를 검색합니다.
- 레이블이나 메타데이터 불필요: 이 방식에는 원시 이미지만 필요합니다. CLIP은 수동 어노테이션 없이 임베딩을 생성합니다.
- 경량의 정확한 검색: NumPy에서 한 번의 정규화된 행렬 곱셈으로 모든 이미지의 코사인 유사도를 기준으로 순위를 지정하므로, 추가 검색 종속성을 설치하거나 관리하지 않고도 수천 개의 임베딩에 대해 실시간 응답으로 정확한 결과를 제공합니다.
- 도메인 간 활용: 개인 사진 아카이브, 창작 영감 도구, 제품 검색 엔진 또는 예술 추천 시스템을 구축하는 경우에도 동일한 스택을 최소한의 조정으로 적용할 수 있습니다.
시맨틱 이미지 검색의 작동 방식#
이 파이프라인은 이미지와 텍스트를 순위가 지정된 결과로 변환하는 각 단계를 담당하는 세 가지 구성 요소를 결합합니다.
- CLIP은 이미지에 비전 인코더(예: ResNet 또는 ViT)를 사용하고 언어에 텍스트 인코더(Transformer 기반)를 사용하여 두 입력을 동일한 멀티모달 임베딩 공간으로 투영합니다. 이를 통해 코사인 유사도를 사용하여 텍스트와 이미지를 직접 비교할 수 있습니다.
- NumPy는 이미지 임베딩을 단일 배열로 저장하고 한 번의 행렬 곱셈으로 쿼리 임베딩과 비교하여, 추가 인덱싱 종속성 없이 코사인 유사도가 가장 높은 벡터를 반환합니다.
- Flask는 자연어 쿼리를 제출하고 인덱스에서 시맨틱하게 일치하는 이미지를 표시할 수 있는 간단한 웹 인터페이스를 제공합니다.

이미지와 텍스트가 모두 동일한 벡터 공간에 배치되므로 검색은 제로샷 방식으로 수행됩니다. 레이블이나 카테고리 없이 이미지 데이터와 좋은 프롬프트만 있으면 됩니다.
시맨틱 검색 웹 앱 실행#
SearchApp 클래스는 전체 Flask 인터페이스를 실행합니다. 처음 실행할 때 샘플 이미지 세트를 다운로드하고 임베딩 인덱스를 구축한 다음, 쿼리를 입력하고 순위가 지정된 결과를 확인할 수 있는 페이지를 제공합니다.
이미지 경로 경고
자체 이미지를 사용하는 경우 이미지 디렉터리에 대한 절대 경로를 제공해야 합니다. 그렇지 않으면 Flask의 파일 제공 제한으로 인해 웹페이지에 이미지가 표시되지 않을 수 있습니다.
from ultralytics import solutions
app = solutions.SearchApp(
data="images", # replace with a path to build the 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 클래스는 웹 계층 없이 모든 백엔드 작업을 수행합니다.
- 로컬 이미지에서 임베딩 인덱스를 로드하거나 구축합니다.
- CLIP을 사용하여 이미지 및 텍스트 임베딩을 추출합니다.
- 코사인 유사도를 사용하여 유사도 검색을 수행합니다.
자연어 쿼리로 검색기를 호출하면 유사도 순으로 정렬된 일치 이미지 파일 이름 목록을 반환받을 수 있습니다.
from ultralytics import solutions
searcher = solutions.VisualAISearch(
data="images", # replace with a path to build the search engine with your own images
device="cpu", # 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.2680VisualAISearch 매개변수 구성#
아래 표에는 VisualAISearch에서 사용할 수 있는 매개변수가 정리되어 있습니다.
| 인수 | 유형 | 기본값 | 설명 |
|---|---|---|---|
data | str | 'images' | 인덱싱하고 검색할 이미지 디렉터리의 경로입니다. |
device | str | 'cpu' | CLIP 추론에 사용되는 디바이스입니다(예: cpu, cuda, 0). |
로컬 파일을 관리하지 않고 프로덕션 규모의 이미지 컬렉션을 검색하려면, CLIP으로 인덱싱하기 전에 Ultralytics Platform에서 이미지를 구성하고 버전을 관리할 수 있습니다.
결론#
CLIP과 Ultralytics Python 패키지를 사용하면 몇 줄의 코드만으로 Flask 웹 앱 또는 프로그래밍 방식의 검색 백엔드 형태로 제로샷 시맨틱 이미지 검색 엔진을 구축할 수 있습니다. 이제 data을 자체 이미지 디렉터리로 지정하여 인덱싱한 다음, 다른 Ultralytics Solutions을 살펴보고 컴퓨터 비전 워크플로를 확장해 보세요.
FAQ#
CLIP을 차별화하는 요소는 일반화 능력입니다. 특정 레이블이나 작업만을 위해 학습되는 대신 자연어 자체에서 학습합니다. 따라서 "제트스키를 타는 남자" 또는 "초현실적인 꿈의 풍경"과 같은 유연한 쿼리를 처리할 수 있어, 재학습 없이 분류부터 창의적인 시맨틱 검색까지 다양한 작업에 유용합니다.
CLIP은 OpenAI에서 개발되었지만, Ultralytics Python 패키지는 임베딩 생성, 인덱싱 및 코사인 유사도 검색을 몇 줄의 코드만으로 작동하는 완전한 시맨틱 이미지 검색 파이프라인으로 래핑합니다.
from ultralytics import solutions searcher = solutions.VisualAISearch( data="images", # replace with a path to build the search engine with your own images device="cpu", # configure the device for processing, e.g., "cpu" or "cuda" ) results = searcher("a dog sitting on a bench")이 고수준 구현은 다음을 처리합니다.
- CLIP 기반 이미지 및 텍스트 임베딩 생성입니다.
- 임베딩 인덱스 생성 및 관리입니다.
- 코사인 유사도를 사용한 효율적인 시맨틱 검색입니다.
- 디렉터리 기반 이미지 로드 및 시각화입니다.
예. 현재 설정은 기본 HTML 프론트엔드와 함께 Flask를 사용하지만, 자체 HTML로 교체하거나 React, Vue 또는 다른 프론트엔드 프레임워크를 사용하여 더욱 동적인 UI를 구축할 수 있습니다. Flask를 사용자 지정 인터페이스의 백엔드 API로 사용할 수 있습니다.
직접 검색할 수는 없습니다. 간단한 해결 방법은 동영상에서 개별 프레임을 추출하여(예: 1초마다 한 프레임) 독립적인 이미지로 처리한 다음 시스템에 입력하는 것입니다. 이렇게 하면 검색 엔진이 동영상의 시각적 순간을 시맨틱하게 인덱싱할 수 있습니다.