V2 로직(계층 구조 도입) - 100-hours-a-week/5-yeosa-wiki GitHub Wiki
1. 기존 로직 요약
a. 태그셋
- 일상/여행 사진에 주로 등장할만한 태그를 임의로 32개 추출
b. 이미지-태그 유사도 계산
- 각 이미지에 대해 전체 태그셋(M개)과의 cosine 유사도 계산
- 유사도 0.25 미만은 무시하고, Top-3 태그만 저장
c. 글로벌 태그 후보 추출
- 모든 이미지의 Top-3 태그 빈도를 집계
- 등장 횟수 상위 5개의 태그를 글로벌 대표 카테고리 후보로 설정
d. 초기 분류 (First Pass)
- 각 이미지를 글로벌 후보 중 가장 유사한 태그로 분류
- 단, 유사도가 0.22 미만이거나 Top-3에 해당 태그가 없으면 →
기타
e. 그룹 정제 (Refinement)
- 각 태그 그룹 내에서 전체 유사도 점수를 재집계해 가장 대표적인 태그로 변경
- 대표 태그가 바뀌면 이미지들을 새 태그로 재배정
f. 유사도 재검증 (Second Pass)
- 그룹 내 각 이미지가 대표 태그와 유사도가 0.22 미만이면 다시
기타
로 분류
g. 카테고리 병합
- 이름이 동일한 카테고리는 자동으로 병합
2. 주요 문제점
a. 태그셋 자체의 한계
- 전체 태그셋이 32개로 너무 적고 단일 수준(flat structure)
- 사용자 취향이나 사진 내용의 세분화를 제대로 반영하지 못함
b. 의미 있는 하위 분류 부족
- 예:
동물
→ 강아지, 고양이 등 세분화 불가
3. 개선한 태그셋
-
기존 태그 32개 → 상위 태그 14개를 포함, 총 611개의 태그셋으로 세분화
- 상위 태그는 여러 하위 태그를 포함할 수 있고, 반대로 하위 태그 또한 여러 상위 태그를 가질 수 있음
-
상위 태그 목록(14개)
동물, 취미, 음식과 음료, 장소, 여행, 운동, 풍경, 업무, 공연, 인물, 식물, 액티비티, IT, 교통수단
-
하위 태그 예시
동물 : 강아지, 고양이, 사자, 코끼리, ... 풍경 : 나무, 연못, 들판, 폭포, ... 운동 : 야구, 축구, 스키, 당구, ...
4. 개선된 로직 요약
a. 기본 태그 후보에 상위 태그를 전부 추가
refined_categories = list(parent_categories)
refined_embeds = list(parent_embeds)
b. 사용자로부터 concepts를 입력받음
concepts = req.concepts
- concepts는 상위태그 중 일부
- 0개~3개까지 선택 가능
c. concepts에 포함된 상위 태그의 하위태그를 태그 후보에 포함
for concept in concepts:
concept_category = category_dict.get(concept, [])
concept_embed = embed_dict.get(concept, [])
refined_categories.extend(concept_category)
refined_embeds.extend(concept_embed)
refined_embeds = torch.stack(refined_embeds, dim=0)
d. 선정된 태그 후보로 기존 로직으로 카테고리 분류
-
태그 후보 자체가 많아졌으므로, 글로벌 태그 후보 추출 시 기존 top-3에서 top-10으로 변경
-
top-10으로 하되 다양성을 위해 threshold는 0으로 변경
# 기존 topk_info = select_topk_tags_per_image( boosted_sims_matrix, categories, k=3, threshold=0.22) # 변경 topk_info = select_topk_tags_per_image( boosted_sims_matrix, categories, k=10, threshold=0)
5. 개선 효과
a. 카테고리 세분화 및 정확도 향상
- 기존 단일 수준의 32개 태그 → 600개 이상의 하위 태그를 포함한 계층형 태그셋으로 확장
- 예전에는 단순히
동물
로 묶이던 이미지들이 이제는강아지
,사자
,고양이
등으로 정확하고 직관적인 분류 가능
b. 사용자 취향 반영 가능
- 사용자가
concepts
입력을 통해 특정 주제(예:여행
,운동
)를 지정하면, 해당 상위 태그의 관련 하위 태그들만을 후보로 설정해 더 정확한 맞춤형 분류 가능
c. 태그 후보 다양성 향상
- 이전에는 전체 태그셋이 32개였고, 유사도 상위 3개만을 대상으로 빈도 집계 → 대표 태그 후보가 편향되기 쉬웠음
- 이제는 태그셋이 방대하고, Top-10 유사도 기반 분류로 다양한 태그가 반영 → 대표 태그 편향 문제 완화
d. 로버스트한 분류 전략
- 유사도 threshold를 제거(threshold=0)하면서 미세한 차이도 반영 가능
- 이후 대표성 점수, 재분류 등 다단계 로직을 통해 여전히
기타
처리가 가능해 유연성과 견고함을 동시에 확보
e. 상위-하위 계층 구조로 향후 기능 확장 용이
- 태그가 계층적으로 구조화되어 있기 때문에,
- 예:
동물
하위 태그는강아지
,고양이
,호랑이
- 예:
- 향후에는 상위 태그 기준 필터링, 유저 인터페이스 구성, 통계 집계 등에서 유용하게 활용 가능