인물 분류 성능 향상 (DBSCAN vs HDBSCAN 비교, 클러스터링 후처리 적용) - 100-hours-a-week/5-yeosa-wiki GitHub Wiki
1. 문제 상황과 예상 원인
a. 문제 상황
- 클러스터 -1은 분류되지 않은 사진 모아져 있기 때문에 요청 반환 시, 제외되어야 함
- 클러스터 0도 분류되지 않은 사진으로 보임 - 결과에서 제외시킬지 추가 데이터셋 구축해서 더 확인해보기
- 나머지 클러스터 중 성능 이슈가 있는 부분 있는지 확인 - 만약 있다면 추가 데이터셋으로 더 확인해보고 정확도 이슈 명확히 한 후, 개선 방안 탐색
b. 이슈: 이상치 클러스터(-1)을 제외하고도 이상한 클러스터 존재
가. 데이터셋1 (폭싹 속았수다) 기준
- person_0 괜찮으나, person_1에 여러 사진이 모여 있음
나. 데이터셋2 (살인장난감) 기준
- person_0에 여러 사진 모여 있음
- person_1은 괜찮음
다. 데이터셋3(듄) 기준
- person_0에 여러 사진 모여 있음
- person_1은 괜찮음
c. 예상 원인
가. 데이터셋마다 이상 클러스터 번호 다른 이유
- 임베딩 순서의 영향
DBSCAN
은fit_predict()
호출 시 임베딩 배열을 순회하며 클러스터를 형성하기 시작- 만약 초기에 나오는 임베딩들이:
- 노이즈 또는 품질이 낮은 임베딩이라면?
- → 이상한 군집이 먼저 형성되고
label == 0
,1
등에 할당됨.
- 이후 진짜 사람들끼리 뭉친 그룹은
2
,3
, ... 이런 label로 붙을 수 있음.
→ 단순히 person_-1, 0을 제외하는 것으로 개선 불가할 듯 하다.
⇒ 클러스터링 및 파일 분류 파트 코드 뜯어보고 원인 찾기
2. 개선 시도
a. 개선 필요성
- DBSN에서 -1만 이상치로 모아두고 나머지 클러스터들은 정상 클러스터여야 함
- DBSN 자체를 수정하는건 불가(sklearn에서 제공하는 모듈)
- 그런데 -1을 제외한 클러스터가 이상하게 분류되는 것은 클러스터 분류되는 threshold를 수정하거나 클러스터링 알고리즘 교체가 필요함
b. DBSCAN → HDBSCAN: 클러스터링 알고리즘 변환 시도
가. HDBSCAN 개요
-
HDBSCAN 방식에 대한 이해
사진 속 사람마다 찍힌 빈도가 다르기 때문에, 한 가지 기준 거리(eps)로는 부족함.
공간을 “밀도 기반 거리”로 바꾼다
두 점 사이 거리만 보면 노이즈나 우연히 가까운 점에 민감해짐. 그래서 밀도까지 고려한 거리(mutual reachability distance)를 새로 만든다. 방법: 두 점 a, b 사이 거리는 다음 중 가장 큰 값으로 정의:
-
a의 주변 이웃과의 거리
-
b의 주변 이웃과의 거리
-
실제 거리 d(a, b) 만약 a나 b 중 하나라도 외딴 곳에 있다면 그 둘의 거리를 크게 봐줌
-
이해
a와 b가 가깝더라도 만약 core_k(a) (a가 주변에서 k번째로 가까운 이웃과의 거리)가 크다면 외딴 곳에 있다는 의미이다. 이것은 우연히 가까이 있는 노이즈들(a, b)를 연결해서 클러스터로 착각할 가능성이 있다는 의미이다. 이런 사태를 막기 위해 a와 b의 거리를 계산할 때, 2점이 인점한 지점들과 얼마나 먼지를 고려한다. (인접한 지점들과 멀다면 노이즈라고 판단해서 a와 b의 거리를 크게 설정 → 노이즈인 a와 b가 클러스터로 묶이는 것을 방지)
밀도 기반 거리를 바탕으로 MST(최소 연결 트리)를 만든다
모든 점들을 거리가 짧은 순서대로 연결해나간다.연결을 자르면서 계층을 만든다
MST의 간선을 길이가 긴 순서대로 자르며 클러스터 만든다 single linkage 계층적 클러스터링작은 클러스터는 버리고 중요한 줄기만 남긴다
min_cluster_size보다 작은 클러스터는 노이즈나 outlier로 간주해서 제거한다
안정적인 클러스터만 남긴다
안정성은 각 점이 얼마나 오랫동안 클러스터에 속해 있었는지를 모두 더해서 계산한다 안정성이 높은 클러스터를 남기고 불안정한 클러스터는 제거한다
-
-
DBSCAN은 반지름
eps
내에 일정 수 이상의 이웃이 존재하면 해당 지점을 core point로 간주하는 밀도 기반 클러스터링 알고리즘-
core point를 구하는 이유
용어 조건 의미 Core point 반지름 eps
이내에 이웃이min_samples
개 이상중심 밀도 높은 영역 Border point 이웃은 많지 않지만, core point의 eps 안에 있음 경계에 있는 점 Noise 어디에도 속하지 않는 점 이상치로 간주 - 하나의 클러스터에는 여러 개의 core point가 존재할 수 있다.
- core point들은 서로 eps 이내에 연결되어 하나의 클러스터로 이어지게 된다.
- border point는 core point 주변에 붙어있는 점일 뿐, 직접적으로 core가 되진 않는다.
-
그러나 eps 값을 하나로 고정해야 하기 때문에, 다양한 밀도 분포를 가진 데이터셋에 적용하기 어렵다는 한계가 있음
-
-
HDBSCAN은 DBSCAN을 확장한 알고리즘으로, 계층적 클러스터링을 수행한 후, 밀도가 높은 영역만을 클러스터로 유지. 따라서 서로 다른 밀도를 가진 클러스터도 유연하게 탐지할 수 있음
→ 우리의 테스크는 사람마다 사진에 포함된 빈도(=밀도)가 다르기 때문에, HDBSCAN처럼 가변적인 밀도 기반 클러스터링이 더 적합하다 판단하여 테스트
나. HDBSCAN 클러스터링 결과
# 클러스터링 수행
clusterer = hdbscan.HDBSCAN(min_cluster_size=2, gen_min_span_tree=True)
labels = clusterer.fit_predict(embeddings)
-
HDBSCAN 클러스터링 결과 시각화
- 2D로 차원 축소하고 클러스터별로 분류되도록 시각화한 결과, 이상 클러스터인 -1, 4가 실제로도 거리가 멀리 떨어져 있음을 확인함.
- 하나의 클러스터로 묶기 적합하지 않은 파일들이 하나의 클러스터로 묶음
-
개선 방안
- 클러스터로 묶는 범위 조건을 더 타이트하게 가져가기
- 이상 클러스터 판별 조건 넣어서 클러스터 생성 후, 후처리하기
다. DBSCAN 클러스터링 결과
dbscan = DBSCAN(eps=0.6, min_samples=2, metric="cosine")
labels = dbscan.fit_predict(embeddings)
제목 앞에 HDBSCAN은 오타
-
HDBSCAN
vsDBSCAN + eps
의 핵심 차이항목 HDBSCAN DBSCAN ( eps=0.4
)클러스터 자동 선택 ✅ 클러스터 개수 자동 결정 (density 기반) ❌ eps
,min_samples
직접 조절 필요노이즈 처리 ✅ 잘함 (low-density 군집 자동 제거) ❌ 적절한 eps
못 정하면 오탐/미탐 많음클러스터의 ‘품질’ 기준 λ-값 기반의 지속성 평가 단순 거리 기반 post-filtering으로 유연하게 다듬기 가능 ✅ (우리가 한 것처럼 avg_dist 기반) ❌ eps 설정 외에 조정 어려움 복잡한 분포 대응 ✅ variable density 대응 가능 ❌ 단일 eps로는 밀도 다르면 한계 - DBSCAN은 "거리 하나로 전체를 자른다"
- HDBSCAN은 "전체를 계층적으로 분석한 뒤, 그 중에서 밀도 높은 것만 골라낸다"
C. HDBSCAN vs DBSCAN 비교 및 후처리 적용
가. HDBSCAN vs DBSCAN 테스트 결과
# hdbscan 클러스팅 avg_dist으로 후처리한 결과 (합계: 47)
./result_1_hdbscan_filtered/person_-1: 70 files (이상 클러스터)
./result_1_hdbscan_filtered/person_1: 22 files
./result_1_hdbscan_filtered/person_0: 7 files
./result_1_hdbscan_filtered/person_5: 8 files
./result_1_hdbscan_filtered/person_2: 7 files
./result_1_hdbscan_filtered/person_3: 3 files
# 후처리하지 않은 hdscan 결과
./result_1_hdbscan/person_8: 2 files (5번과 동일 인물)
./result_1_hdbscan/person_1: 24 files (잘못된 결과 존재)
./result_1_hdbscan/person_6: 7 files
./result_1_hdbscan/person_7: 5 files
./result_1_hdbscan/person_0: 46 files (잘못된 결과 존재)
./result_1_hdbscan/person_9: 4 files
./result_1_hdbscan/person_5: 10 files (8번과 동일 인물)
./result_1_hdbscan/person_2: 29 files (3장 잘못됨)
./result_1_hdbscan/person_-1: 29 files (이상 클러스터)
./result_1_hdbscan/person_3: 11 files (이상 클러스터)
./result_1_hdbscan/person_4: 43 files (이상 클러스터)
./result_1_hdbscan/person_10: 2 files
# dbscan 후처리하지 않은 상태(합계: 65)
./result/person_8: 2 files
./result/person_1: 42 files (이상 클러스터)
./result/person_6: 7 files
./result/person_7: 5 files
./result/person_0: 2 files
./result/person_9: 4 files
./result/person_5: 10 files
./result/person_2: 23 files
./result/person_-1: 18 files (이상 클러스터)
./result/person_3: 8 files
./result/person_4: 2 files
./result/person_10: 2 files
- hdbscan은 dbscan보다 후처리하지 않은 상태에서 잘못된 클러스터가 많다.
- 잘못된 클러스터는 동일 인물이 아닌 사진이 포함된 클러스터
- 이상 사진이 포함되어 있으면 후처리를 하더라도 클러스터 내에서 특정 사진을 제외할 수는 없기 때문에 정확도가 떨어진다. (해당 사진이 포함된 클러스터를 아예 제외시켜야 한다.)
- 후처리는 포함된 대다수의 사진이 서로 다른 인물을 가리키는 클러스터를 대상으로 하는게 적합하다. 왜냐하면 후처리로 완전히 그 클러스터를 없애기 때문.
나. avg_dist < 0.4를 이용한 후처리 방식의 단점
- 포함된 사진 수가 적은 클러스터는 평균값 민감하다.
- 그리고 사진 수가 많은 클러스터는 평균값이 더 작아지는 경향이 있다.
- 그렇기에 avg_dist 기준을 이용할 때, 작은 클러스터는 이상 클러스터로 판별되고 큰 클러스터가 주로 남게 된다.
- 그렇기에 적합한 기준이 아니다.
다. 개선 방안
- 작은 클러스터는 max_dist 조건을 이용하고 큰 클러스터는 avg_dist 조건을 이용한다.
라. 테스트 결과
# dbscan max로 걸러낸 방식 (합계: 19)
./result_1_dbscan_filtered/person_8: 2 files
./result_1_dbscan_filtered/person_1: 2 files
./result_1_dbscan_filtered/person_6: 7 files
./result_1_dbscan_filtered/person_9: 4 files
./result_1_dbscan_filtered/person_-1: 74 files (이상 클러스터)
./result_1_dbscan_filtered/person_4: 2 files
./result_1_dbscan_filtered/person_10: 2 files
# dbscan max(작은 클러스터용) & avg(큰 클러스터용) 혼합 방식 (합계: 29)
./result_1_dbscan_filtered_mixed/person_8: 2 files
./result_1_dbscan_filtered_mixed/person_1: 2 files
./result_1_dbscan_filtered_mixed/person_6: 7 files
./result_1_dbscan_filtered_mixed/person_9: 4 files
./result_1_dbscan_filtered_mixed/person_5: 10 files
./result_1_dbscan_filtered_mixed/person_-1: 68 files (이상 클러스터)
./result_1_dbscan_filtered_mixed/person_4: 2 files
./result_1_dbscan_filtered_mixed/person_10: 2 files
# dbscan 걸러내지 않은 것 (합계: 65)
./result_1_dbscan/person_8: 2 files
./result_1_dbscan/person_1: 2 files
./result_1_dbscan/person_6: 7 files
./result_1_dbscan/person_7: 5 files
./result_1_dbscan/person_0: 42 files (이상 클러스터)
./result_1_dbscan/person_9: 4 files
./result_1_dbscan/person_5: 10 files
./result_1_dbscan/person_2: 23 files
./result_1_dbscan/person_-1: 17 files (이상 클러스터)
./result_1_dbscan/person_3: 8 files
./result_1_dbscan/person_4: 2 files
./result_1_dbscan/person_10: 2 files
# dbscam 혼합 방식(avg < 0.5로 완화) (합계: 60) <- 이대로 가자
./result_1_dbscan_filtered_re_loose_condition/person_8: 2 files
./result_1_dbscan_filtered_re_loose_condition/person_1: 2 files
./result_1_dbscan_filtered_re_loose_condition/person_6: 7 files
./result_1_dbscan_filtered_re_loose_condition/person_9: 4 files
./result_1_dbscan_filtered_re_loose_condition/person_5: 10 files
./result_1_dbscan_filtered_re_loose_condition/person_2: 23 files
./result_1_dbscan_filtered_re_loose_condition/person_-1: 50 files (이상 클러스터)
./result_1_dbscan_filtered_re_loose_condition/person_3: 8 files
./result_1_dbscan_filtered_re_loose_condition/person_4: 2 files
./result_1_dbscan_filtered_re_loose_condition/person_10: 2 files
- max_dist 방식으로 바꾸니까 대형 클러스터가 없어짐. max 방식은 대형 클러스터에 취약할 수 있음 대형 클러스터는 avg, 작은 클러스터는 max를 이용하는 혼합 방식으로 수정
- dbscan에서 혼합 방식 후처리 테스트 진행함. 이때, avg_dist < 0.4 조건을 0.5로 완화한 결과, 다양한 인물이 적합한 클러스터로 적절하게 클러스터링 된 것을 확인할 수 있었다.
마. dbscan 필터링 혼합 방식 시각화
- 대형 클러스터 평균 거리 조건 < 0.5로 완화
- 기준을 완화시켰을 때, 우측 상단에 이상치로 걸러졌던 클러스터가 제대로 구분되게 됨 실제로 파일 열어 확인했을 때, 해당 클러스터는 분리되는게 맞음
바. 참고자료
3. 결론 및 개선 방안
a. 결론
- DBSCAN을 밀도 기반 다중 계층 방식인 HDBSCAN으로 적용하려 했으나 크기가 작은 클러스터도 포함해야 하는 테스크 특성 상 DBSCAN이 더 적합함을 확인함.
- 추가적으로 성능 향상을 위해 후처리 로직을 적용했고 클러스터 사이즈에 따라 다른 후처리를 적용함으로써 정확도 향상을 이끌어냄.
b. 추후 개선 방안
- 추후 클러스터링 반환 순서를 대표 인물 클러스터가 먼저 나오도록 하기 & 얼굴 크롭된 대표 사진 나오도록 하기