Ultralytics YOLO27:

OpenAI CLIP으로 시맨틱 이미지 검색을 구축하는 방법#

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



Watch: How Similarity Search Works | Visual Search Using OpenAI CLIP and the Ultralytics Package 🎉

시맨틱 검색 결과 개요가 표시된 Flask 웹페이지

Ultralytics Python 패키지는 전체 파이프라인을 두 개의 클래스로 래핑하므로, 몇 줄의 코드만으로 작동하는 검색 앱을 실행하거나 프로그래밍 방식으로 쿼리를 수행할 수 있습니다. 이 가이드에서는 시맨틱 검색이 유용한 이유, 작동 방식, 웹 앱 실행, 프로그래밍 방식 검색, 매개변수 구성을 다룹니다.

시맨틱 이미지 검색을 사용하는 이유#

CLIP으로 자체 시맨틱 이미지 검색 시스템을 구축하면 다음과 같은 여러 가지 이점이 있습니다.

  • 제로샷 기능: 데이터셋으로 학습할 필요가 없습니다. CLIP의 제로샷 학습을 사용하면 자유로운 자연어로 모든 이미지 컬렉션을 쿼리할 수 있어 시간과 리소스를 절약할 수 있습니다.
  • 사람과 유사한 이해: 키워드 검색과 달리 CLIP은 시맨틱 컨텍스트를 이해하고 "자연 속의 행복한 아이" 또는 "밤의 미래적인 도시 스카이라인"과 같은 추상적, 감정적 또는 관계적 쿼리에서 이미지를 검색합니다.
  • 레이블이나 메타데이터 불필요: 이 방식에는 원시 이미지만 필요합니다. CLIP은 수동 어노테이션 없이 임베딩을 생성합니다.
  • 경량의 정확한 검색: NumPy에서 한 번의 정규화된 행렬 곱셈으로 모든 이미지의 코사인 유사도를 기준으로 순위를 지정하므로, 추가 검색 종속성을 설치하거나 관리하지 않고도 수천 개의 임베딩에 대해 실시간 응답으로 정확한 결과를 제공합니다.
  • 도메인 간 활용: 개인 사진 아카이브, 창작 영감 도구, 제품 검색 엔진 또는 예술 추천 시스템을 구축하는 경우에도 동일한 스택을 최소한의 조정으로 적용할 수 있습니다.

시맨틱 이미지 검색의 작동 방식#

이 파이프라인은 이미지와 텍스트를 순위가 지정된 결과로 변환하는 각 단계를 담당하는 세 가지 구성 요소를 결합합니다.

  • CLIP은 이미지에 비전 인코더(예: ResNet 또는 ViT)를 사용하고 언어에 텍스트 인코더(Transformer 기반)를 사용하여 두 입력을 동일한 멀티모달 임베딩 공간으로 투영합니다. 이를 통해 코사인 유사도를 사용하여 텍스트와 이미지를 직접 비교할 수 있습니다.
  • NumPy는 이미지 임베딩을 단일 배열로 저장하고 한 번의 행렬 곱셈으로 쿼리 임베딩과 비교하여, 추가 인덱싱 종속성 없이 코사인 유사도가 가장 높은 벡터를 반환합니다.
  • Flask는 자연어 쿼리를 제출하고 인덱스에서 시맨틱하게 일치하는 이미지를 표시할 수 있는 간단한 웹 인터페이스를 제공합니다.

OpenAI CLIP 이미지 검색 워크플로

이미지와 텍스트가 모두 동일한 벡터 공간에 배치되므로 검색은 제로샷 방식으로 수행됩니다. 레이블이나 카테고리 없이 이미지 데이터와 좋은 프롬프트만 있으면 됩니다.

시맨틱 검색 웹 앱 실행#

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.2680

VisualAISearch 매개변수 구성#

아래 표에는 VisualAISearch에서 사용할 수 있는 매개변수가 정리되어 있습니다.

인수유형기본값설명
datastr'images'인덱싱하고 검색할 이미지 디렉터리의 경로입니다.
devicestr'cpu'CLIP 추론에 사용되는 디바이스입니다(예: cpu, cuda, 0).
클라우드에서 데이터 관리

로컬 파일을 관리하지 않고 프로덕션 규모의 이미지 컬렉션을 검색하려면, CLIP으로 인덱싱하기 전에 Ultralytics Platform에서 이미지를 구성하고 버전을 관리할 수 있습니다.

결론#

CLIP과 Ultralytics Python 패키지를 사용하면 몇 줄의 코드만으로 Flask 웹 앱 또는 프로그래밍 방식의 검색 백엔드 형태로 제로샷 시맨틱 이미지 검색 엔진을 구축할 수 있습니다. 이제 data을 자체 이미지 디렉터리로 지정하여 인덱싱한 다음, 다른 Ultralytics Solutions을 살펴보고 컴퓨터 비전 워크플로를 확장해 보세요.

FAQ#

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

  • CLIP을 차별화하는 요소는 일반화 능력입니다. 특정 레이블이나 작업만을 위해 학습되는 대신 자연어 자체에서 학습합니다. 따라서 "제트스키를 타는 남자" 또는 "초현실적인 꿈의 풍경"과 같은 유연한 쿼리를 처리할 수 있어, 재학습 없이 분류부터 창의적인 시맨틱 검색까지 다양한 작업에 유용합니다.

  • CLIP이 이미지를 임베딩으로 변환하면 Ultralytics 패키지가 이미지 임베딩을 L2 정규화하고 단일 NumPy 배열에 저장합니다. 쿼리는 한 번의 행렬 곱셈으로 순위가 지정되며, 이 연산은 쿼리 임베딩과 모든 이미지 임베딩 간의 코사인 유사도를 계산한 다음 점수를 정렬합니다. 이 브루트포스 검색은 일반적인 이미지 컬렉션에서 정확하고 빠르며, 추가 벡터 데이터베이스 종속성을 설치하거나 관리할 필요가 없습니다.

  • 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초마다 한 프레임) 독립적인 이미지로 처리한 다음 시스템에 입력하는 것입니다. 이렇게 하면 검색 엔진이 동영상의 시각적 순간을 시맨틱하게 인덱싱할 수 있습니다.

댓글