OpenAI CLIP으로 시맨틱 이미지 검색 구축하기#
이 가이드에서는 OpenAI CLIP과 Flask를 사용해 시맨틱 이미지 검색 엔진을 구축하는 방법을 안내합니다. CLIP의 시각-언어 임베딩과 NumPy를 활용한 빠른 코사인 유사도 검색을 결합하면, 레이블이나 카테고리 없이 자연어 질의에 적합한 이미지를 검색하는 웹 인터페이스를 구축할 수 있습니다.
시청: 유사도 검색의 작동 방식 | OpenAI CLIP 및 Ultralytics 패키지를 사용한 시각적 검색 🎉

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", # 자체 이미지로 검색 엔진을 구축하려면 경로를 지정하세요
device="cpu", # 처리 장치를 설정하세요(예: "cpu" 또는 "cuda").
)
app.run(debug=False) # 테스트에는 `debug=True` 인수를 사용할 수도 있습니다.프로그래밍 방식으로 이미지 검색#
VisualAISearch 클래스는 웹 계층 없이 모든 백엔드 작업을 수행합니다.
- 로컬 이미지에서 임베딩 인덱스를 불러오거나 생성합니다.
- CLIP을 사용해 이미지 및 텍스트 임베딩을 추출합니다.
- 코사인 유사도를 사용해 유사도 검색을 수행합니다.
자연어 질의와 함께 검색기를 호출하면 유사도가 높은 순서로 정렬된 일치 이미지 파일 이름 목록을 받을 수 있습니다.
from ultralytics import solutions
searcher = solutions.VisualAISearch(
data="images", # 자체 이미지로 검색 엔진을 구축하려면 경로를 지정하세요
device="cpu", # 처리 장치를 설정하세요(예: "cpu" 또는 "cuda").
)
results = searcher("a dog sitting on a bench")
# 순위별 결과:
# - 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 솔루션을 살펴보세요.
자주 묻는 질문#
CLIP의 차별점은 일반화 능력입니다. 특정 레이블이나 작업에만 맞춰 학습되는 대신 자연어 자체를 학습합니다. 따라서 재학습 없이도 "제트스키를 타는 남자" 또는 "초현실적인 꿈의 풍경"과 같은 유연한 질의를 처리할 수 있어 분류부터 창의적인 시맨틱 검색까지 다양한 작업에 유용합니다.
CLIP은 OpenAI에서 개발했지만, Ultralytics Python 패키지는 몇 줄의 코드만으로 바로 사용할 수 있는 완전한 시맨틱 이미지 검색 파이프라인에 임베딩 생성, 인덱싱, 코사인 유사도 검색을 통합합니다.
from ultralytics import solutions searcher = solutions.VisualAISearch( data="images", # 자체 이미지로 검색 엔진을 구축하려면 경로를 지정하세요 device="cpu", # 처리 장치를 설정하세요(예: "cpu" 또는 "cuda"). ) results = searcher("a dog sitting on a bench")이 고수준 구현은 다음을 처리합니다.
- CLIP 기반 이미지 및 텍스트 임베딩 생성
- 임베딩 인덱스 생성 및 관리
- 코사인 유사도를 사용한 효율적인 시맨틱 검색
- 디렉터리 기반 이미지 로드 및 시각화
예. 현재 설정은 기본 HTML 프런트엔드와 함께 Flask를 사용하지만, 자체 HTML로 교체하거나 React, Vue 또는 다른 프런트엔드 프레임워크로 더 동적인 UI를 구축할 수 있습니다. Flask를 사용자 지정 인터페이스의 백엔드 API로 사용할 수 있습니다.
직접 검색할 수는 없습니다. 간단한 해결 방법은 비디오에서 개별 프레임(예: 초당 한 프레임)을 추출하여 독립적인 이미지로 취급한 뒤 시스템에 입력하는 것입니다. 이렇게 하면 검색 엔진이 비디오 속 시각적 순간을 시맨틱하게 인덱싱할 수 있습니다.