10억 규모 이미지 검색 최적화를 향한 여정 (1/2)
Yupoo Picture Manager는 수천만 명의 사용자에게 서비스를 제공하고 수백억 장의 사진을 관리합니다. 사용자 갤러리가 점점 더 커짐에 따라, Yupoo는 이미지를 빠르게 찾을 수 있는 솔루션에 대한 긴급한 비즈니스 요구가 있습니다. 다시 말해, 사용자가 이미지를 입력하면 시스템은 갤러리에서 해당 원본 이미지와 유사한 이미지를 찾아야 합니다. 이미지로 검색 서비스의 개발은 이 문제에 대한 효과적인 접근 방식을 제공합니다.
이미지로 검색 서비스는 두 번의 진화를 거쳤습니다:
- 2019년 초에 첫 번째 기술 조사를 시작했고 2019년 3월과 4월에 1세대 시스템을 출시했습니다;
- 2020년 초에 업그레이드 계획 조사를 시작했고 2020년 4월에 2세대 시스템으로의 전체 업그레이드를 시작했습니다.
이 글은 이 프로젝트에 대한 제 경험을 바탕으로 두 세대의 이미지로 검색 시스템 뒤에 있는 기술 선택과 기본 원리를 설명합니다.
개요
이미지란 무엇인가?
이미지를 다루기 전에 이미지가 무엇인지 알아야 합니다.
답은 이미지가 픽셀의 집합이라는 것입니다.
예를 들어, 이 이미지의 빨간 상자 안 부분은 사실상 일련의 픽셀입니다.
그림 1.
빨간 상자 안 부분이 이미지라고 가정하면, 이미지의 각 독립적인 작은 정사각형은 기본 정보 단위인 픽셀입니다. 그러면 이미지의 크기는 11 x 11 px입니다.
그림 2.
이미지의 수학적 표현
각 이미지는 행렬로 표현할 수 있습니다. 이미지의 각 픽셀은 행렬의 한 요소에 해당합니다.
이진 이미지
이진 이미지의 픽셀은 검은색 또는 흰색이므로, 각 픽셀은 0 또는 1로 표현할 수 있습니다. 예를 들어, 4 * 4 이진 이미지의 행렬 표현은 다음과 같습니다:
0 1 0 1
1 0 0 0
1 1 1 0
0 0 1 0
RGB 이미지
세 가지 원색(빨강, 초록, 파랑)은 혼합되어 어떤 색상이든 만들어낼 수 있습니다. RGB 이미지의 경우 각 픽셀은 세 개의 RGB 채널에 대한 기본 정보를 갖습니다. 마찬가지로, 각 채널이 8비트 숫자(256단계)를 사용하여 그레이 스케일을 표현한다면, 픽셀의 수학적 표현은 다음과 같습니다:
([0 .. 255], [0 .. 255], [0 .. 255])
4 * 4 RGB 이미지를 예로 들면:
그림 3.
이미지 처리의 본질은 이러한 픽셀 행렬을 처리하는 것입니다.
이미지로 검색의 기술적 문제
원본 이미지, 즉 픽셀이 정확히 동일한 이미지를 찾고 있다면, MD5 값을 직접 비교할 수 있습니다. 그러나 인터넷에 업로드된 이미지는 종종 압축되거나 워터마크가 추가됩니다. 이미지의 작은 변화만으로도 다른 MD5 결과가 생성될 수 있습니다. 픽셀에 불일치가 있는 한 원본 이미지를 찾는 것은 불가능합니다.
이미지로 검색 시스템의 경우, 우리는 콘텐츠가 유사한 이미지를 검색하고자 합니다. 그러면 두 가지 기본 문제를 해결해야 합니다:
- 이미지를 컴퓨터가 처리할 수 있는 데이터 형식으로 표현하거나 추상화합니다.
- 데이터는 계산을 위해 비교 가능해야 합니다.
보다 구체적으로, 다음 기능이 필요합니다:
- 이미지 특징 추출.
- 특징 계산(유사도 계산).
1세대 이미지로 검색 시스템
특징 추출 — 이미지 추상화
1세대 이미지로 검색 시스템은 특징 추출을 위해 Perceptual hash 또는 pHash 알고리즘을 사용합니다. 이 알고리즘의 기본은 무엇일까요?
1세대 이미지 검색.
위 그림에 표시된 것처럼, pHash 알고리즘은 이미지에 일련의 변환을 수행하여 해시 값을 얻습니다. 변환 과정에서 알고리즘은 이미지를 지속적으로 추상화하여, 유사한 이미지의 결과가 서로 더 가까워지도록 합니다.
특징 계산 — 유사도 계산
두 이미지의 pHash 값 간 유사도는 어떻게 계산할까요? 답은 해밍 거리(Hamming distance)를 사용하는 것입니다. 해밍 거리가 작을수록 이미지 콘텐츠가 더 유사합니다.
해밍 거리란 무엇일까요? 서로 다른 비트의 개수입니다.
예를 들어,
값 1: 0 1 0 1 0
값 2: 0 0 0 1 1
위 두 값에는 서로 다른 비트가 두 개 있으므로, 두 값 사이의 해밍 거리는 2입니다.
이제 유사도 계산의 원리를 알았습니다. 다음 질문은, 1억 장 규모의 사진에서 나온 1억 규모 데이터의 해밍 거리를 어떻게 계산할 것인가입니다. 간단히 말해, 유사 이미지를 어떻게 검색할 것인가입니다.
프로젝트 초기 단계에서 저는 해밍 거리를 빠르게 계산할 수 있는 만족스러운 도구(또는 컴퓨팅 엔진)를 찾지 못했습니다. 그래서 계획을 변경했습니다.
제 생각은 두 pHash 값의 해밍 거리가 작다면, pHash 값을 잘랐을 때 해당하는 작은 부분들이 같을 가능성이 높다는 것입니다.
예를 들어:
값 1: 8 a 0 3 0 3 f 6
값 2: 8 a 0 3 0 3 d 8
위 두 값을 여덟 개의 세그먼트로 나누면 여섯 개 세그먼트의 값이 정확히 같습니다. 이를 통해 두 값의 해밍 거리가 가깝고 따라서 이 두 이미지가 유사하다고 추론할 수 있습니다.
변환 후에는 해밍 거리 계산 문제가 동등성 매칭 문제로 바뀌었음을 알 수 있습니다. 각 pHash 값을 여덟 개의 세그먼트로 나누었을 때, 정확히 같은 값을 가진 세그먼트가 다섯 개를 넘기만 하면 두 pHash 값은 유사합니다.
따라서 동등성 매칭을 해결하는 것은 매우 간단합니다. 전통적인 데이터베이스 시스템의 고전적인 필터링을 사용할 수 있습니다.
물론 저는 ElasticSearch에서 다중 항목 매칭을 사용하고 minimum_should_match를 통해 매칭 정도를 지정합니다(이 글에서는 ES의 원리를 소개하지 않으니, 직접 학습하시면 됩니다).
왜 ElasticSearch를 선택할까요? 첫째, 위에서 언급한 검색 기능을 제공합니다. 둘째, 이미지 관리자 프로젝트 자체가 전체 텍스트 검색 기능을 제공하기 위해 ES를 사용하고 있으며, 기존 리소스를 사용하는 것이 매우 경제적입니다.
1세대 시스템 요약
1세대 이미지 검색 시스템은 pHash + ElasticSearch 솔루션을 선택했으며, 다음과 같은 특징이 있습니다:
- pHash 알고리즘은 사용하기 쉽고 어느 정도의 압축, 워터마크, 노이즈에 견딜 수 있습니다.
- ElasticSearch는 프로젝트의 기존 리소스를 사용하므로 검색에 추가 비용을 더하지 않습니다.
그러나 이 시스템의 한계는 분명합니다: pHash 알고리즘은 전체 이미지에 대한 추상적 표현입니다. 원본 이미지에 검은 테두리를 추가하는 것처럼 이미지의 무결성을 훼손하면, 원본과 다른 이미지 사이의 유사성을 판단하는 것은 거의 불가능합니다.
이러한 한계를 돌파하기 위해, 완전히 다른 기반 기술을 가진 2세대 이미지 검색 시스템이 등장했습니다.
이 글은 Milvus 사용자이자 UPYUN의 소프트웨어 엔지니어인 rifewang이 작성했습니다. 이 글이 마음에 드셨다면, 와서 인사해 주세요! https://github.com/rifewang
계속 읽기

How Zilliz Saw the Future of Vector Databases—and Built for Production
An inside look at how Zilliz built vector databases for real-world use, focusing on scalability, stability, and running them reliably at scale.

Zilliz Cloud Update: Smarter Autoscaling for Cost Savings, Stronger Compliance with Audit Logs, and More
What's new in Zilliz Cloud? Smarter autoscaling with scale-down, audit logs GA, enhanced SSO, and Milvus 2.6 in Private Preview.

Why Not All VectorDBs Are Agent-Ready
Explore why choosing the right vector database is critical for scaling AI agents, and why traditional solutions fall short in production.



