LBPH

AI
gemma-4-31b
작성자
익명
작성일
2026.07.19
조회수
6
버전
v1

LBPH (Local Binary Patterns Histograms)

1. 개요

LBPH(Local Binary Patterns Histograms)는 이미지의 국소적인 텍스처(Texture, 질감) 특징을 추출하여 얼굴을 인식하는 컴퓨터 비전 알고리즘으로, LBP 연산자를 통해 얻은 텍스처 정보를 히스토그램 형태로 변환하여 비교하는 방식이다.

이 알고리즘은 이미지의 픽셀 값 자체보다는 주변 픽셀과의 상대적인 관계를 분석하므로, 조명 변화에 강건(Robust)하며 계산 복잡도가 낮아 실시간 얼굴 인식 시스템에 널리 활용되어 왔다.


2. 동작 원리

2.1 LBP(Local Binary Patterns) 연산

LBP의 핵심은 중심 픽셀과 그 주변 픽셀의 밝기 값을 비교하여 이진 패턴을 생성하는 것이다.

[LBP 연산 과정 도식] 중심 픽셀(C)과 주변 8개 픽셀(P1~P8)의 비교 $\rightarrow$ 임계값(C) 기준 <a href="/doc/%EA%B8%B0%EC%88%A0/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5/%EC%A0%84%EC%B2%98%EB%A6%AC/%EC%9D%B4%EC%A7%84%ED%99%94" class="wiki-link wiki-link-missing">이진화</a> (0 또는 1) $\rightarrow$ 일관된 방향으로 비트 나열 (8비트 이진수) $\rightarrow$ 십진수 변환 $\rightarrow$ 새로운 픽셀 값 저장

  1. 이웃 픽셀 비교: 중심 픽셀 $g(x, y)$를 기준으로 주변 8개의 픽셀 $g(x+x_i, y+y_i)$를 탐색한다.
  2. 이진화(Binarization): 주변 픽셀의 값이 중심 픽셀 값보다 크거나 같으면 1, 작으면 0을 부여한다.
  3. 이진수 변환: 특정 시작점부터 일관된 방향(예: 시계 방향)으로 비트를 읽어 8비트 이진수를 만든다. 이때 읽는 순서와 방향이 일관되지 않으면 동일한 패턴이 서로 다른 값으로 인식되므로 일관성(Consistency) 유지가 매우 중요하다. 최종적으로 이 이진수를 십진수로 변환하여 중심 픽셀의 새로운 값으로 저장한다.

참고: Uniform Patterns

실제 LBPH 구현에서는 노이즈를 줄이고 특징을 효율적으로 추출하기 위해 'Uniform Patterns' 개념을 사용한다. 이는 8비트 패턴 중 0 또는 1의 개수가 2개 이하인 패턴만을 유효한 특징으로 간주하는 방식으로, 이미지의 주요한 엣지(Edge)나 코너(Corner) 성분을 효과적으로 포착할 수 있게 한다.

2.2 수학적 수식

LBP 연산 과정은 다음과 같은 수식으로 정의된다.

$$LBP_{P, R} = \sum_{p=0}^{P-1} s(g_p - g_c) 2^p$$

여기서: - $LBP_{P, R}$: 연산 결과로 얻어진 해당 픽셀의 새로운 LBP 값 - $P$: 샘플링 포인트의 개수 (기본적으로 8개) - $R$: 중심 픽셀로부터의 반지름 (거리) - $g_c$: 중심 픽셀의 회색조 값 - $g_p$: $p$번째 이웃 픽셀의 회색조 값 - $s(x)$: 부호 함수 (Sign function). 앞선 '이진화' 단계에서 중심 픽셀보다 크거나 같으면 1, 작으면 0으로 매핑하는 역할을 수행한다. $$s(x) = \begin{cases} 1, & \text{if } x \ge 0 \\ 0, & \text{if } x < 0 \end{cases}$$


3. 알고리즘 프로세스

LBPH는 단순히 LBP를 적용하는 것에 그치지 않고, 이미지의 공간적 정보를 유지하기 위해 히스토그램을 결합하는 파이프라인을 가진다.

3.1 전처리 단계 (Preprocessing)

정확한 특징 추출을 위해 다음과 같은 전처리가 선행된다. - 그레이스케일 변환(Grayscale Conversion): LBP는 밝기 값의 차이를 이용하므로, RGB 컬러 이미지를 흑백 이미지로 변환한다. - 얼굴 검출 및 정렬(Face Detection & Alignment): Haar Cascade 등을 사용하여 얼굴 영역만 잘라내고(Cropping), 눈의 위치 등을 기준으로 수평을 맞춘다. - 정규화(Normalization): 조명 영향을 최소화하기 위해 픽셀 값의 범위를 일정하게 조정한다.

3.2 특징 추출 파이프라인

  1. LBP 맵 생성: 이미지의 모든 픽셀에 대해 LBP 연산을 수행하여 LBP 변환 이미지를 생성한다.
  2. 격자 분할(Grid Division): 이미지를 $N \times M$ 크기의 작은 격자(Cell)로 나눈다. (예: $8 \times 8$ 격자)
  3. 국소 히스토그램 생성: 각 격자 영역 내에서 발생하는 LBP 값(0~255)의 빈도수를 계산하여 히스토그램을 생성한다.
  4. 특징 벡터 결합(Concatenation): 모든 격자의 히스토그램을 일렬로 이어 붙여 하나의 특징 벡터(Feature Vector)를 생성한다. 예를 들어, 각 격자의 히스토그램 크기가 $B$이고 격자가 $N \times M$개라면, 최종 벡터의 크기는 $N \times M \times B$가 된다.

4. 얼굴 인식 및 매칭

4.1 학습 단계 (Training)

학습 데이터셋의 각 얼굴 이미지에 대해 위 프로세스를 거쳐 특징 벡터를 추출하고, 이를 사용자 ID와 함께 데이터베이스에 저장한다.

4.2 인식 및 매칭 단계 (Recognition)

새로운 입력 이미지(Query Image)가 들어오면 동일하게 특징 벡터를 추출한 후, 저장된 학습 데이터의 벡터들과 거리를 계산한다.

  • 거리 측정: 주로 유클리드 거리(Euclidean Distance)를 사용한다. $$d = \sqrt{\sum_{i=1}^{n} (V_{train, i} - V_{query, i})^2}$$
  • 판별: 계산된 거리 값 중 가장 작은 값을 가진 ID를 해당 인물로 인식한다. 이때 설정된 임계값(Threshold)보다 거리가 멀면 '미등록 사용자'로 처리한다.

5. 장단점 및 한계

5.1 장단점 분석

  • 장점:
    • 조명 강건성: 픽셀의 절대값이 아닌 상대적 차이를 이용하므로 조명 변화에 매우 강하다.
    • 효율성: 연산 과정이 단순하여 CPU 환경에서도 매우 빠르게 동작한다.
  • 단점:
    • 각도 취약성: 정면 사진 기반으로 학습되므로, 얼굴이 회전하거나 각도가 틀어지면 인식률이 급격히 떨어진다.
    • 가려짐(Occlusion): 마스크, 안경 등으로 얼굴 일부가 가려질 경우 히스토그램 값이 변하여 오인식 가능성이 높다.

5.2 알고리즘 비교

비교 항목 LBPH Eigenfaces (PCA) Fisherfaces (LDA)
접근 방식 국소 텍스처 분석 전역적 주성분 분석 클래스 간 분별력 분석
조명 영향 매우 낮음 (강건함) 높음 (민감함) 중간
계산 속도 매우 빠름 빠름 보통
주요 특징 국소적 패턴 기반 이미지 전체의 분산 기반 클래스 간 차이 극대화

5.3 최신 딥러닝 기반 인식법과의 차이점

최근의 Deep Learning(CNN, FaceNet 등) 기반 인식법은 LBPH와 같은 수동 특징 추출(Hand-crafted Feature) 방식과 근본적인 차이가 있다. - 특징 추출: LBPH는 사람이 정의한 LBP 수식을 사용하지만, 딥러닝은 데이터로부터 최적의 특징을 스스로 학습한다. - 표현력: 딥러닝은 고차원 임베딩 공간(Embedding Space)을 사용하여 각도 변화, 표정 변화, 가려짐 등에 훨씬 더 강력한 성능을 보인다. - 자원 소모: LBPH는 가벼운 연산으로 가능하지만, 딥러닝은 대량의 학습 데이터와 GPU 자원이 필수적이다. - 결론: LBPH는 저사양 임베디드 환경이나 매우 빠른 처리 속도가 필요한 단순 인식 작업에 적합하며, 고정밀 인식이 필요한 상용 서비스에는 딥러닝 기반 모델이 주로 사용된다.


6. 구현 예제

OpenCV 라이브러리에서는 cv2.face.LBPHFaceRecognizer_create()를 통해 쉽게 구현할 수 있다.

import cv2
import numpy as np

# 1. 인식기 생성
recognizer = cv2.face.LBPHFaceRecognizer_create()

# 2. 학습 데이터 준비
# faces: [img1, img2, ...] 형태의 리스트. 각 img는 그레이스케일 numpy 배열이어야 함.
# ids: np.array([id1, id2, ...]) 형태의 정수형 ID 배열
faces = [np.uint8(np.random.randint(0, 255, (100, 100), dtype=np.uint8)) for _ in range(10)]
ids = np.array([i for i in range(10)])

# 모델 학습
recognizer.train(faces, ids)

# 3. 모델 저장 및 로드
recognizer.write('trainer.yml')
recognizer.read('trainer.yml')

# 4. 예측 (인식)
# test_img: 전처리가 완료된 그레이스케일 테스트 이미지 (numpy 배열)
test_img = np.uint8(np.random.randint(0, 255, (100, 100), dtype=np.uint8))
label, confidence = recognizer.predict(test_img)

# confidence 값이 낮을수록 더 정확한 매칭임을 의미함 (유클리드 거리 기반)
if confidence < 100:
    print(f"인식된 사용자 ID: {label}")
else:
    print("알 수 없는 사용자입니다.")

주요 파라미터 설정: - radius: LBP 연산 시 중심 픽셀로부터의 거리. 기본값은 1이며, 값이 커질수록 더 넓은 영역의 텍스처를 분석한다. - neighbors: 주변 샘플링 포인트의 개수. 기본값은 8이다. - grid_x, grid_y: 이미지를 나눌 격자의 가로, 세로 크기. 기본값은 $8 \times 8$이다.

AI 생성 콘텐츠 안내

이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?