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

오늘날 우리는 수많은 이미지를 생성하고 공유하며 살아갑니다.
스마트폰 갤러리, 전자상거래 플랫폼, 클라우드 저장소 등에서
효율적으로 이미지를 찾는 것은 매우 중요한 기술적 과제가 되었습니다.
이때 유용한 기술이 바로 콘텐츠 기반 이미지 검색(Content-based Image Retrieval, CBIR) 입니다.
CBIR은 단순한 파일 이름이나 메타데이터가 아니라 이미지의 시각적 특징을 이용해
유사한 이미지를 자동으로 검색하는 기술입니다.
이번 글에서는 Python과 OpenCV, scikit-learn을 활용하여
CBIR 시스템을 구축하는 과정을 단계별로 설명하고,
딥러닝 기반의 확장 가능성까지 함께 살펴보겠습니다.
콘텐츠 기반 이미지 검색(CBIR)이란?
CBIR은 "이미지 자체의 시각적 정보"를 분석하여
비슷한 이미지를 찾아내는 기술입니다.
즉, "고양이 사진"이라는 태그가 없어도
고양이 이미지를 입력하면 비슷한 고양이 이미지를 찾아주는 방식입니다.
CBIR의 핵심 요소는 다음과 같습니다.
- 특징 추출 (Feature Extraction)
- 이미지에서 색상, 질감, 형태 등 시각적 패턴을 수치로 표현
- 특징 벡터 저장 (Feature Storage)
- 추출한 특징을 벡터 형태로 데이터베이스에 저장
- 유사도 계산 (Similarity Measurement)
- 새로운 이미지의 특징 벡터와 기존 벡터 간의 거리 계산
- 결과 검색 (Retrieval)
- 유사도가 높은 순서대로 이미지를 정렬하여 반환
이러한 과정은 사람이 이미지를 “보는 방식”을
수학적으로 모델링한 것과 유사합니다.
Python 환경 구성과 라이브러리 설치
CBIR 시스템을 구축하기 위해 다음의 Python 라이브러리를 사용합니다.
pip install opencv-python numpy scikit-learn matplotlib
- OpenCV: 이미지 처리 및 특징 추출
- NumPy: 수치 연산 및 배열 관리
- Scikit-learn: 유사도 계산 및 데이터 관리
이 도구들을 사용하면 수천 장의 이미지 중에서도
빠르게 유사 이미지를 검색할 수 있습니다.
이미지 특징 추출(Feature Extraction)
CBIR의 첫 단계는 각 이미지의 특징을 수치화하는 것입니다.
일반적으로 색상 히스토그램(Color Histogram), HOG(Histogram of Oriented Gradients),
또는 SIFT/ORB 특징점을 사용합니다.
예를 들어 OpenCV의 ORB를 사용해 특징 벡터를 추출할 수 있습니다.
import cv2
import numpy as np
import os
def extract_features(image_path):
image = cv2.imread(image_path, cv2.IMREAD_COLOR)
orb = cv2.ORB_create()
keypoints, descriptors = orb.detectAndCompute(image, None)
return descriptors
ORB는 SIFT보다 계산 효율이 높고, 라이선스 제약이 없어 널리 사용됩니다.
이렇게 추출된 descriptors는 이미지의 시각적 특징을 나타내는 벡터 데이터입니다.
특징 벡터 데이터베이스 구축
다음 단계는 여러 이미지의 특징 벡터를 데이터베이스에 저장하는 것입니다.
image_folder = 'dataset/'
feature_list = []
filenames = []
for filename in os.listdir(image_folder):
path = os.path.join(image_folder, filename)
descriptors = extract_features(path)
if descriptors is not None:
feature_list.append(descriptors)
filenames.append(filename)
각 이미지마다 고유한 벡터 표현이 생성되며,
이것이 나중에 유사도 비교에 사용됩니다.
벡터가 많을 경우 차원 축소(PCA, t-SNE 등)를 적용하면
검색 속도를 향상시킬 수 있습니다.
유사도 계산 및 이미지 검색
특징 벡터 간의 유사도를 계산하기 위해 일반적으로
코사인 유사도(Cosine Similarity) 또는 **유클리드 거리(Euclidean Distance)**를 사용합니다.
from sklearn.metrics.pairwise import cosine_similarity
def find_similar_images(query_desc, features, top_k=5):
similarities = []
for desc in features:
sim = cosine_similarity(query_desc, desc).mean()
similarities.append(sim)
top_indices = np.argsort(similarities)[::-1][:top_k]
return top_indices
이 함수는 입력 이미지의 특징을 기준으로
유사도가 높은 상위 k개의 이미지를 반환합니다.
이를 시각화하면 다음과 같이 결과를 확인할 수 있습니다.
import matplotlib.pyplot as plt
indices = find_similar_images(query_features, feature_list)
for i in indices:
img = cv2.imread(os.path.join(image_folder, filenames[i]))
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.axis('off')
plt.show()
결과적으로 입력 이미지와 시각적으로 유사한 이미지들이
화면에 순서대로 표시됩니다.
딥러닝 기반 CBIR 확장
전통적인 특징 기반 방식은 단순하고 효율적이지만,
복잡한 객체나 다양한 조명, 배경 변화에는 약점을 보일 수 있습니다.
이러한 한계를 극복하기 위해 최근에는
딥러닝 기반 특징 추출(Deep Feature Extraction) 방식이 각광받고 있습니다.
TensorFlow나 PyTorch의 사전 학습 모델(VGG16, ResNet 등)을 활용하면
이미지의 고차원적 시각 정보를 벡터로 표현할 수 있습니다.
from tensorflow.keras.applications import VGG16
from tensorflow.keras.models import Model
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.vgg16 import preprocess_input
import numpy as np
base_model = VGG16(weights='imagenet', include_top=False)
model = Model(inputs=base_model.input, outputs=base_model.layers[-1].output)
def extract_deep_features(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)
features = model.predict(x)
return features.flatten()
이러한 딥러닝 기반 CBIR 시스템은
전자상거래(상품 유사 이미지 검색), 디지털 자산 관리,
의료 영상 검색 등에서 높은 정확도를 보입니다.
CBIR의 실제 활용 사례
CBIR은 다양한 산업에서 실질적인 가치를 제공합니다.
- 🛍️ 전자상거래: 유사 상품 자동 추천 (예: 패션, 인테리어 제품)
- 🧠 의료 분야: 유사 영상 검색을 통한 진단 지원
- 🎨 디지털 예술: 유사 스타일 이미지 큐레이션
- 📸 보안 감시: 특정 패턴이나 객체 검색
- 🌍 위성/지리 정보 분석: 유사 지형 이미지 자동 탐색
이처럼 CBIR은 “데이터의 시각적 의미”를 분석하는 AI 기술로,
이미지 검색을 훨씬 지능적으로 발전시킵니다.
결론
Python 기반 콘텐츠 기반 이미지 검색 시스템(CBIR) 은
이미지의 시각적 특징을 활용하여 효율적으로 유사 이미지를 탐색하는 강력한 기술입니다.
전통적인 ORB, HOG 같은 특징 기반 접근부터
VGG16, ResNet 등 딥러닝 기반 방법까지 확장할 수 있으며,
데이터 규모와 목적에 따라 유연하게 적용할 수 있습니다.
앞으로의 CBIR 기술은 멀티모달 AI와 결합하여
이미지와 텍스트, 음성까지 통합적으로 검색하는
지능형 검색 엔진으로 발전할 것입니다.