본문 바로가기

Computer Vision + Python/이미지 분석 & 인식 (중급자)

Python으로 이미지 검색(Content-based Image Retrieval) 시스템 구축

Python으로 이미지 검색(Content-based Image Retrieval) 시스템 구축

 

이미지 특징 기반 검색의 원리부터 실전 구축까지

현대의 디지털 환경에서 이미지는 더 이상 단순한 미디어 요소가 아니라 중요한 데이터 자원으로 자리 잡았다. 전자상거래, 포털 검색, 아카이브 관리, 패션 리테일, 의료 영상 등 다양한 산업에서 사용자는 키워드가 아닌 이미지를 기준으로 비슷한 이미지를 찾는 기능, 즉 Content-based Image Retrieval(CBIR) 시스템을 요구하고 있다. Python은 이러한 시스템을 구축하는 데 가장 강력한 언어 중 하나이며, 최신 머신러닝 및 딥러닝 기술을 쉽게 적용할 수 있는 생태계를 제공한다.

아래에서는 CBIR의 핵심 개념부터 Python으로 시스템을 구축하는 실제 과정, 그리고 오랜 개발 경험에서 얻은 프랙티컬한 통찰을 정리해 본다.


1. 이미지 검색(CBIR)의 핵심 개념 이해

CBIR 시스템은 텍스트가 아닌 이미지 자체의 특징을 기반으로 유사 이미지를 검색한다.
검색 과정은 크게 아래 네 가지 단계로 이루어진다.

  • 이미지 특징 추출
  • 특징 벡터 저장
  • 쿼리 이미지 특징 추출
  • 거리 기반 유사도 계산 및 유사 이미지 반환

여기서 가장 중요한 요소는 ‘어떤 특징을 추출하느냐’이다. 전통적으로는 SIFT, SURF, HOG 같은 특징 기반 기법이 강력했다. 하지만 현재는 딥러닝 이미지 임베딩(CNN 기반 feature vector)이 훨씬 우수한 검색 품질을 제공한다.

개인적으로 전통적 특징 기반 검색을 오래 사용했지만, 대규모 데이터셋에서는 CNN 임베딩 방식이 확실히 안정적이고 유지보수도 쉽다는 점을 경험했다. 특히 제품 이미지 검색처럼 배경이 다양하거나 촬영 환경이 일정하지 않은 경우 딥러닝 기반 CBIR의 효과는 확연히 드러난다.


2. Python으로 구현하는 이미지 특징 추출

  딥러닝 기반 특징 추출 방식

Python에서는 다음과 같은 사전학습 모델을 활용하여 쉽고 안정적으로 이미지 임베딩을 생성할 수 있다.

  • ResNet50
  • EfficientNet
  • MobileNetV2
  • VGG16

이들 모델의 마지막 Fully Connected 계층을 제거하고, Feature Vector(임베딩) 형태로 변경하여 사용한다.
특징 벡터는 보통 256~2048 차원의 숫자 배열로 이루어진다.

왜 딥러닝 기반 특징이 강력할까?
여러 프로젝트에서 테스트한 결과, 딥러닝 임베딩은 작은 노이즈·밝기 변화·각도 변화에도 안정적이다. 전통적 특징(SIFT/HOG)은 회전이나 스케일 변화에는 강하지만 복잡한 배경이 있는 이미지 검색에서는 일관성이 떨어졌다. 반면 CNN 임베딩은 학습 과정에서 추출된 ‘시맨틱 특징’을 기반으로 하기 때문에 “비슷한 스타일”, “비슷한 구성”, “비슷한 색감” 등 사람의 시각적 판단과 유사한 검색이 가능했다.


3. 특징 벡터 저장 및 검색 구조 구축

CBIR 시스템의 성능은 특징 벡터 저장 방식과 거리 계산 알고리즘에 따라 결정된다.

  특징 벡터 저장 방식

  • Numpy 배열
  • Pickle 파일
  • SQLite + BLOB
  • Elasticsearch(vector search)
  • FAISS(Facebook AI Library)

특히 FAISS는 초대규모 이미지 검색에서도 매우 빠른 성능을 제공한다.
실무 경험에서 텍스트 기반 DB에 벡터를 저장하는 방식은 소규모에서는 편했으나 데이터가 10만 장 이상으로 늘어났을 때 검색 시간이 길어졌다. 이때 FAISS로 전환하자 수십 배 빠른 검색 속도를 확인할 수 있었다.

  거리 기반 유사도 계산

일반적으로 다음과 같은 거리 계산법을 사용한다.

  • Cosine Similarity
  • Euclidean Distance
  • Manhattan Distance

CNN 임베딩은 보통 코사인 유사도가 가장 안정적이다.
예를 들어 패션 이미지 검색에서는 동일한 아이템이라도 조명과 각도가 다를 수 있는데, 코사인 유사도는 벡터의 크기보다 ‘방향성’에 초점을 맞추기 때문에 변동성에 강했다.


4. CBIR 시스템 구축에서 겪는 실제 문제와 해결 전략

CBIR를 여러 산업에서 구축하면서 경험한 실제 문제들은 아래와 같다.

  문제 1: 같은 제품인데 검색되지 않음

원인: 배경이 복잡하거나 촬영 환경이 지나치게 다름
해결: 이미지 전처리 및 bounding box crop 적용
→ 특히 제품 사진에서 배경 제거(semantic segmentation)를 적용하면 검색 품질이 크게 개선된다.

  문제 2: 너무 많은 유사 이미지가 반환됨

원인: 특징 벡터가 지나치게 일반화됨
해결: 모델 선택 시 “fine-tuning” 적용
→ 자체 데이터셋으로 ResNet을 부분 재학습하면 검색 정확도가 개선됨.

  문제 3: 검색 속도 느림

원인: Naive 방식의 벡터 비교
해결: FAISS Index 적용
→ 실무에서 200ms → 10ms 수준으로 속도 개선을 경험.


5. Python으로 구현하는 간단한 CBIR 구조 예시(설명 중심)

from tensorflow.keras.applications.resnet50 import ResNet50, preprocess_input
from tensorflow.keras.preprocessing import image
import numpy as np

# ResNet 기반 feature extractor 로드
model = ResNet50(weights='imagenet', include_top=False, pooling='avg')

def extract_feature(img_path):
    img = image.load_img(img_path, target_size=(224, 224))
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    x = preprocess_input(x)
    feature = model.predict(x)
    return feature / np.linalg.norm(feature)

이 함수는 이미지 하나에서 특징 벡터를 생성하는 기본 구조이다.
여기에 벡터 저장, 유사도 계산, 검색 UI 등을 결합하면 단순한 형태의 CBIR가 완성된다.


6. CBIR 시스템의 활용 사례

1) 패션 리테일 – 유사 제품 자동 추천

실제 프로젝트에서 딥러닝 기반 CBIR는 클릭률(CTR)을 크게 높였다.
특히 “비슷한 스타일 추천” 기능이 매출 향상에 직접적인 영향을 주었다.

2) 아카이브 관리 – 이미지 중복 제거

방대한 이미지 데이터셋에서 중복 이미지 자동 식별에 큰 효과가 있었다.

3) 의료 영상 – 병변 유사도 기반 검색

정확한 병변 비교를 위한 보조 진단 용도로 활용 가능하다.

4) 전자상거래 – 사진 기반 검색

사용자가 사진을 업로드하면 비슷한 상품을 추천하는 기능의 핵심 기술이다.


6. 앞으로의 CBIR 발전 방향

CBIR 기술은 비약적으로 발전하고 있으며, 앞으로는 아래 기술과 결합될 전망이다.

  • CLIP 기반 이미지·텍스트 결합 검색
  • 다중 모달 검색(Multimodal Retrieval)
  • 더 작은 임베딩 크기를 유지하면서 높은 검색 성능 제공
  • 대규모 데이터에서 초고속 검색을 위한 Hybrid Index 적용

개인적으로는 CLIP 기반의 검색이 텍스트와 이미지의 경계를 허물어, 단순한 유사 이미지 검색을 넘어 “의미 기반 검색”으로 발전할 것이라 확신한다.