MPEG-7 CDVS, 이미지를 2KB 이하로 압축해 검색하는 표준

MPEG-7 CDVS의 SCFV 전역 기술자와 압축 SIFT 국소 기술자 구조, 스케일러블 비트스트림, 모바일 시각 검색 적용 사례를 정리한다.

2026-08-13 · 최초 발행 2025-11-26

MPEG-7 CDVS란 무엇인가

모바일이나 엣지 환경에서 이미지로 검색하거나 인식하려면 대역폭과 지연이 발목을 잡는다. MPEG-7 CDVS(Compact Descriptors for Visual Search)는 이 문제를 표준으로 풀기 위해 만들어진 기술자 체계로, ISO/IEC 15938-13:2015에 정의돼 있다. 이미지에서 뽑은 전역·국소 시각 특징을 스칼라·벡터 양자화와 엔트로피 부호화로 압축해 수백 바이트에서 2KB 수준의 비트스트림으로 만든다. 전역 기술자(SCFV: Scalable Compressed Fisher Vector)와 선택적 국소 기술자(압축된 키포인트·지역 패치 기술자)를 조합하는 구조다.

목적은 명확하다. 클라이언트(모바일·엣지)에서는 가볍게 추출·전송만 하고, 서버가 초대규모 인덱싱·검색·기하학적 검증을 맡아 빠른 시각 검색을 달성한다.

전역 기술자: SCFV 기반 압축

Gaussian Mixture Model의 Fisher Vector를 PCA로 차원 축소한 뒤 스칼라·벡터 양자화를 적용하고 엔트로피 부호화로 마무리한다. 512B, 1KB, 2KB 세 가지 운영 포인트를 제공하며, 리트리벌의 1차 필터링에 최적화돼 있다.

국소 기술자: SIFT 계열 경량화

키포인트를 검출하고 방향을 부여한 뒤 그라디언트 히스토그램 기반 기술자를 구성하는데, 여기에 PCA 축소와 Product Quantization 같은 기법으로 바이트 단위까지 압축한다. 좌표·스케일·라플라시안도 함께 부호화하고, 정렬과 부분 중복 제거로 전송 효율을 끌어올린다.

스케일러블 비트스트림 구조

먼저 전역 기술자만 전송해 후보를 생성하고, 필요할 때만 상위 K개에 한해 국소 기술자를 증분 전송하는 구조다. 대역폭 상황과 응답 시간 요구에 따라 정밀도를 점진적으로 높일 수 있다.

표준화된 파이프라인과 저전력 최적화

추출 파라미터, 비트스트림 구문, 거리 계산·정규화 방식이 표준화돼 있어 서로 다른 구현끼리도 상호운용이 보장된다. 서버 측에서는 RANSAC 기반 기하 검증을 권장해 위양성을 억제한다. 모바일에서는 키포인트를 반복성·분산 기준으로 선별하고, 서브샘플링과 고정소수점 연산을 써서 CPU 부담을 낮춰 실시간 처리가 가능하도록 설계했다. 전송량을 최소화하면 무선망 지연과 요금도 함께 줄어든다.

처리 절차

상위 K키포인트 부족파싱 실패입력 이미지키포인트 검출/선별국소 기술자 추출(PCA 축소)전역 기술자 생성(SCFV)양자화/엔트로피 부호화국소 기술자 압축(선택)CDVS 비트스트림 패키징서버 전송전역 인덱스 검색기하 검증(RANSAC)최종 랭킹/메타데이터전처리 재시도/저신뢰 플래그재요청/전역만 처리

입력은 RGB 이미지나 YUV 프레임이다. 키포인트가 부족하면 해상도를 높이거나 노출을 보정, 샤프닝을 다시 시도한 뒤 저신뢰 플래그를 붙이고, 비트스트림 파싱에 실패하면 세그먼트를 재요청하거나 전역 기술자만으로 결과를 낸다. 최종 출력은 랭킹 목록, 정합 점수, 기하 행렬(H) 또는 inlier 통계다.

실무 활용 사례

모바일 시각 검색에서는 포스터·상품·랜드마크를 인식해 앱 안에서 즉시 정보를 조회하는 데 쓰인다. 산업·물류에서는 라벨이 손상되거나 회전된 상황에서도 견고하게 식별하고, 오프라인 창고에서 저전력으로 스캔한다. 문화유산·박물관에서는 네트워크가 제한된 현장에서 검색 가이드를 제공하는 데 쓰인다. 엣지-클라우드 협력 구조에서는 엣지가 CDVS를 추출하고 클라우드가 검색한 뒤, 필요하면 국소 기술자를 증분 요청해 검증하는 절차로 운영한다.

CDVS와 다른 방식 비교

항목 CDVS 순수 SIFT/ORB CNN 임베딩(NetVLAD/GeM 등)
성능(정확도) 랜드마크/상품 검색에서 높은 mAP, 저대역폭 환경 최적화 정합 정확도 우수하나 전송·매칭 비용 과다 대규모 데이터에서 최고 성능 경향, 도메인 의존성 존재
확장성 512B~2KB/이미지, 수억 장 인덱싱 실용 이미지당 수천 벡터, 인덱스 폭증 256~2048D/이미지, IVF-PQ 등과 결합 용이
일관성(표준/상호운용) 비트스트림·절차 표준화, 상호운용 보장 표준 부재, 구현별 편차 모델·포맷 비표준, 버전별 상이
안정성(리소스/환경) 저전력·무선환경 견고, 조명/스케일 변화 강인 리소스 고소모, 모바일 부적합 모델 드리프트/추론 리소스 요구
운영 편의 레퍼런스 SW 존재, 점진 전송 운영 용이 특허 이슈(과거 SIFT, 현재 만료), 운영 복잡 모델 관리·배포 파이프라인 필요

운영 가이드와 트레이드오프

비트 예산은 초저대역폭·거친 필터링에는 512B, 균형에는 1KB, 고정밀에는 2KB를 고른다. 전송은 전역으로 후보를 만든 뒤 상위 K에 한해서만 국소 기술자를 증분 전송해 지연과 정확도의 균형을 맞춘다. 인덱싱은 전역 기술자에 IVF-PQ·OPQ를 적용해 후보를 1~2천 개 정도 추린 뒤 국소 기하 검증을 수행한다. RANSAC은 최대 반복 횟수와 인라이어 임계값을 튜닝하고, 저텍스처 이미지는 리뷰 대상으로 플래그를 붙인다. 리소스 측면에서는 모바일은 고정소수점 경로를 우선하고 서버는 SIMD·멀티스레딩과 배치 검색을 적용한다. CNN 전역 임베딩과 CDVS 국소 검증을 섞는 하이브리드 구성은 최신 성능을 더 끌어올릴 수 있지만 모델 유지보수 부담이 늘어나는 트레이드오프가 있다.

이런 설계를 적용하면 1050KB짜리 원본 썸네일 대신 512B2KB만 전송해 대역폭을 5100배 절감할 수 있고(환경 가정), 3G나 손실이 있는 망에서는 왕복 지연이 100300ms 줄어 타임아웃도 감소한다. 인덱스 크기와 후보 수가 줄어들면서 검색 CPU 비용은 30~60% 절감되고, 국소 증분과 기하 검증을 함께 쓰면 위양성이 크게 억제돼 mAP 손실도 최소화된다.

참고용 구현 예시

아래는 CDVS의 아이디어를 참고용으로 시뮬레이션한 코드다. 실제 CDVS 표준과 동일하지 않고(SCFV 대신 VLAD로 근사) 환경은 Python 3.10, opencv-python, numpy, scikit-learn을 전제로 한다. 실무에서는 레퍼런스 SW를 쓰는 편이 낫다.

# python -m pip install opencv-python numpy scikit-learn
import cv2, numpy as np
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA

def extract_sift(img, max_kp=800):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    sift = cv2.SIFT_create(nfeatures=max_kp)
    kps, desc = sift.detectAndCompute(gray, None)
    return kps, desc  # desc: (N, 128)

def train_codebook(desc_list, k=32):
    X = np.vstack([d for d in desc_list if d is not None])
    km = KMeans(n_clusters=k, n_init=4, random_state=0).fit(X)
    return km.cluster_centers_

def vlad_encode(desc, centers):
    k, d = centers.shape
    vlad = np.zeros((k, d), dtype=np.float32)
    labels = np.argmin(((desc[:, None, :] - centers[None, :, :])**2).sum(axis=2), axis=1)
    for i, c in enumerate(labels):
        vlad[c] += (desc[i] - centers[c])
    v = vlad.reshape(-1)
    v /= (np.linalg.norm(v) + 1e-9)
    return v  # shape: k*d

def compact_descriptor(img, pca_model=None, centers=None):
    _, desc = extract_sift(img)
    if desc is None or len(desc) < 16:
        return None
    if centers is None:
        raise ValueError("Pretrained VLAD centers required")
    v = vlad_encode(desc, centers)
    if pca_model is not None:
        v = pca_model.transform([v])[0]
    # uint8 양자화(데모용)
    q = np.clip((v * 127.0) + 128.0, 0, 255).astype(np.uint8)
    return q.tobytes()  # ~256B @ 256D

# 예시 사용
# 1) 여러 학습 이미지로 centers/PCA 학습 후 저장
# 2) 쿼리 이미지에 compact_descriptor 적용 → 전송

실제 환경에서는 SCFV와 표준 양자화·부호화 규격을 따라야 하고, 서버 인덱싱은 IVF-PQ·OPQ로 후보를 검색한 뒤 국소 매칭과 RANSAC을 수행하는 편을 권장한다.

MPEGCDVS시각검색이미지압축SIFT컴퓨터비전