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. 상위-하위 계층 구조로 향후 기능 확장 용이

  • 태그가 계층적으로 구조화되어 있기 때문에,
    • 예: 동물 하위 태그는 강아지, 고양이, 호랑이
  • 향후에는 상위 태그 기준 필터링, 유저 인터페이스 구성, 통계 집계 등에서 유용하게 활용 가능