Link to this sectionOpenAI CLIP을 사용하여 시맨틱 이미지 검색을 구축하는 방법#
This guide walks you through building a semantic image search engine using OpenAI CLIP and Flask. By combining CLIP's visual-language embeddings with fast cosine similarity search powered by NumPy, you can build a web interface that retrieves relevant images from natural language queries, no labels or categories required.
Watch: How Similarity Search Works | Visual Search Using OpenAI CLIP and the Ultralytics Package 🎉

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

이미지와 텍스트 모두 동일한 벡터 공간에 위치하므로 검색은 제로샷으로 수행됩니다. 즉, 레이블이나 카테고리가 필요 없으며 이미지 데이터와 좋은 프롬프트만 있으면 됩니다.
Link to this section의미론적 검색 웹 앱 실행#
SearchApp 클래스는 전체 Flask 인터페이스를 실행합니다. 처음 실행 시 샘플 이미지 세트를 다운로드하고 임베딩 인덱스를 구축하며, 쿼리를 입력하고 순위가 지정된 결과를 볼 수 있는 페이지를 제공합니다.
이미지 경로 경고
자체 이미지를 사용하는 경우 이미지 디렉토리에 대한 절대 경로를 제공해야 합니다. 그렇지 않으면 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 testingLink to this section프로그래밍 방식으로 이미지 검색#
VisualAISearch 클래스는 웹 계층 없이 모든 백엔드 작업을 수행합니다:
- 로컬 이미지에서 임베딩 인덱스를 로드하거나 구축합니다.
- CLIP을 사용하여 이미지 및 텍스트 임베딩(embeddings)을 추출합니다.
- 코사인 유사도를 사용하여 유사도 검색을 수행합니다.
자연어 쿼리로 검색기를 호출하여 유사도 순으로 정렬된 일치하는 이미지 파일 이름 목록을 가져옵니다:
from ultralytics import solutions
searcher = solutions.VisualAISearch(
# 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"
)
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.2680Link to this sectionVisualAISearch 매개변수 구성#
아래 표는 VisualAISearch에 사용할 수 있는 매개변수를 요약한 것입니다:
| 인수 | 유형 | 기본값 | 설명 |
|---|---|---|---|
data | str | 'images' | 유사도 검색에 사용되는 이미지 디렉토리 경로입니다. |
| 인수 | 유형 | 기본값 | 설명 |
|---|---|---|---|
device | str | None | 추론을 위한 장치(예: cpu, cuda:0 또는 0)를 지정합니다. 사용자가 모델 실행을 위해 CPU, 특정 GPU 또는 기타 컴퓨팅 장치를 선택할 수 있도록 합니다. |
로컬 파일을 관리하지 않고 프로덕션 규모로 이미지 컬렉션을 검색하려면, CLIP으로 인덱싱하기 전에 Ultralytics Platform에서 이미지를 정리하고 버전 관리할 수 있습니다.
Link to this section결론#
CLIP과 Ultralytics Python 패키지를 사용하면 몇 줄의 코드만으로 제로샷 시맨틱 이미지 검색 엔진을 Flask 웹 앱 또는 프로그래밍 방식의 검색 백엔드로 구축할 수 있습니다. 여기에서 data를 자신의 이미지 디렉토리를 가리키도록 설정한 다음, 다른 Ultralytics Solutions를 탐색하여 컴퓨터 비전 워크플로우를 확장해 보십시오.
Link to this sectionFAQ#
Link to this sectionCLIP은 어떻게 이미지와 텍스트를 모두 이해합니까?#
CLIP(Contrastive Language Image Pretraining)은 시각 정보와 언어 정보를 연결하는 방법을 학습하는 OpenAI에서 개발한 모델입니다. 이 모델은 자연어 캡션과 쌍을 이루는 방대한 이미지 데이터셋으로 학습되었습니다. 이러한 학습을 통해 이미지와 텍스트를 모두 공유 임베딩 공간에 매핑할 수 있게 되어, 벡터 유사도를 사용하여 직접 비교할 수 있습니다.
Link to this sectionCLIP이 AI 작업에서 강력하다고 평가받는 이유는 무엇입니까?#
CLIP이 돋보이는 이유는 일반화 능력 때문입니다. 특정 레이블이나 작업에 대해서만 학습되는 대신, 자연어 그 자체로부터 학습합니다. 이를 통해 "제트 스키를 타는 남자"나 "초현실적인 꿈의 풍경"과 같은 유연한 쿼리를 처리할 수 있으며, 재학습 없이도 분류에서 창의적인 의미론적 검색에 이르기까지 모든 것에 유용합니다.
Link to this section이미지는 텍스트 쿼리에 대해 어떻게 순위가 매겨지나요?#
CLIP이 이미지를 임베딩으로 변환하면, Ultralytics 패키지는 이를 L2-정규화하여 단일 NumPy 배열에 저장합니다. 쿼리는 쿼리 임베딩과 모든 이미지 임베딩 간의 코사인 유사도를 계산하는 하나의 행렬 곱셈으로 순위가 지정된 후 점수별로 정렬됩니다. 이 무차별 대입 검색(brute-force search)은 일반적인 이미지 컬렉션에 대해 정확하고 빠르며, 설치하거나 관리해야 할 추가적인 벡터 데이터베이스 의존성이 없습니다.
Link to this sectionCLIP이 OpenAI의 기술인데 왜 Ultralytics Python 패키지를 사용하나요?#
CLIP은 OpenAI에서 개발했지만, Ultralytics Python 패키지는 임베딩 생성, 인덱싱 및 코사인 유사도 검색을 몇 줄의 코드로 완벽한 시맨틱 이미지 검색 파이프라인으로 통합하여 제공합니다:
from ultralytics import solutions
searcher = solutions.VisualAISearch(
# 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"
)
results = searcher("a dog sitting on a bench")이 고수준 구현은 다음을 처리합니다:
- CLIP 기반 이미지 및 텍스트 임베딩 생성.
- 임베딩 인덱스 생성 및 관리.
- 코사인 유사도를 사용한 효율적인 의미론적 검색.
- 디렉토리 기반 이미지 로딩 및 시각화.
Link to this section이 앱의 프론트엔드를 사용자 정의할 수 있습니까?#
네. 현재 설정은 기본 HTML 프론트엔드와 함께 Flask를 사용하지만, 이를 자체 HTML로 대체하거나 React, Vue 또는 기타 프론트엔드 프레임워크를 사용하여 더 동적인 UI를 구축할 수 있습니다. Flask는 사용자 지정 인터페이스를 위한 백엔드 API 역할을 할 수 있습니다.
Link to this section정적 이미지 대신 비디오를 검색할 수 있습니까?#
직접적으로는 불가능합니다. 간단한 해결 방법은 비디오에서 개별 프레임(예: 1초당 하나)을 추출하여 독립적인 이미지로 취급하고 시스템에 입력하는 것입니다. 이런 방식으로 검색 엔진은 비디오의 시각적 순간을 의미론적으로 인덱싱할 수 있습니다.