← 모델 목록
프로젝트 2026-09-29 · image-retrieval · 프로젝트 FurniSketch
CLIP + DINOv3 앙상블 (손그림 이미지 검색)

PiDiNet + CLIP ViT-B/32 + facebook/dinov3-vitl16-pretrain-lvd1689m

FurniSketch 손그림 → 스탠드 조명 검색 (배경 제거 · 카테고리 분리 비교)
모델
손그림을 임베딩해 상품 사진과 코사인 유사도로 찾는 검색 파이프라인 (0.3 × CLIP + 0.7 × DINOv3 앙상블, 추가 학습 없음)
사용 목적
정답률이 낮은 손그림 검색에서 엉뚱한 결과(오답)를 줄이려고, 최종 모델에 배경 제거와 카테고리 분리를 각각 더해 오답률을 비교
코드
Subeen2/FurniSketch
가중치
없음
off_rate15.2%
cat_wrong_rate0.0%
hit_top1039.3%
실험3회 · 대표 r3
학습 시간없음
추론 CPU / GPU측정 안 함

데이터

  • 장·단스탠드 카탈로그 각 799개
  • 손그림 224장 (장 112 · 단 112)
  • 직접 수집 · 오늘의집 상품

학습

  • 학습 없음 · 사전학습 임베딩 + 가중합
  • 배경 제거는 rembg u2net
  • seed 0 · Top-10 기준

결과

  • 오답률 28.2% → 15.2% (카테고리 분리)
  • 배경 제거는 34.3%로 악화 (단스탠드 45.1%)
  • 장↔단 혼동 17.9% → 0%

배운 점

  • 정답률 대신 오답률로 비교
  • 카테고리 분리는 사용자가 장/단을 고른다는 가정
  • 라벨당 112장이라 신뢰구간이 넓음
개요용도 의도한 용도: 손그림으로 스탠드 조명을 찾는 검색에서, 정확히 그 상품을 맞히는 비율(정답률)은 낮으므로 엉뚱한 결과(오…

용도

  • 의도한 용도: 손그림으로 스탠드 조명을 찾는 검색에서, 정확히 그 상품을 맞히는 비율(정답률)은 낮으므로 엉뚱한 결과(오답)를 최소화하는 방향을 정하려고 최종 모델에 두 가지 변경을 각각 더해 오답률을 비교
  • 대상 사용자: 팀 내 발표·의사결정용 분석
  • 의도하지 않은 용도: 정답률 개선의 근거 (정답률은 참고용으로만 기록). 224장 규모의 결과를 서비스 전체 성능으로 일반화하는 것

모델 정보

항목 값
베이스 모델 CLIP ViT-B-32-quickgelu (open_clip, pretrained=openai), DINOv3 facebook/dinov3-vitl16-pretrain-lvd1689m, PiDiNet table5_pidinet (체크포인트 analysis/pidinet/trained_models/table5_pidinet.pth), 배경 제거 rembg u2net
크기 · 변형 CLIP ViT-B/32, DINOv3 ViT-L/16 (파라미터 수 [미확인])
리비전 Hugging Face revision은 지정하지 않음 ([미확인]). rembg 2.0.84, transformers 5.17.0 (프로젝트 .venv)
아키텍처 손그림 → CLIP 임베딩(상품은 PiDiNet 스케치화 0.8 + 원본 0.2 혼합) 과 DINOv3 임베딩(상품은 원본 사진). 점수 = 0.3 × CLIP + 0.7 × DINOv3 코사인 유사도
학습 방식 학습하지 않음. 사전학습 가중치와 가중합(DINOV3_WEIGHT=0.7, RAW_WEIGHT=0.2)만 사용
프롬프트 · 에이전트 구성 해당 없음

비교한 세 구성 (②, ③은 누적이 아니라 각각 ①에 하나씩만 더함):

run 구성 내용
1_final (r1) 최종 모델 원본 사진, 카테고리 분리 없음
2_final_rembg (r2) + 배경 제거 DINOv3 갈래의 상품 사진만 rembg 배경 제거 + 피사체 크롭
3_final_category (r3) + 카테고리 분리 장 손그림은 장스탠드 안에서만, 단 손그림은 단스탠드 안에서만 검색. 배경 제거 없음
데이터확보 방식 직접 수집 (상품 사진) + 직접 그린 손그림 출처 오늘의집 조명 상품 ( data/ohou_lighting_pro…
항목 값
확보 방식 직접 수집 (상품 사진) + 직접 그린 손그림
출처 오늘의집 조명 상품 (data/ohou_lighting_products_stand_labeled.csv, 장/단 라벨 포함). 손그림은 data/hand_sketch_targets/
직접 수집 내용 오늘의집 공식 API가 없어 브라우저 콘솔 스크립트로 수집. 열어 둔 카테고리·검색 결과 페이지에서 스크롤하며 DOM의 상품 정보(product_id, name, brand, price, link, image_url)를 읽어 JSON으로 저장(analysis/ohou_browser_collect/category_collect.js, search_collect.js). 이 JSON을 Claude 스킬(ohou-collect)이 읽어 중복 제거 후 이미지를 내려받고 CSV(data/ohou_lighting_products.csv)로 만듦. 수집 기간·장/단 라벨링 방법은 [미확인]
이용 조건 확인 [미확인] (오늘의집 이용약관·robots.txt 확인 여부를 확인하지 않음)
규모 라벨된 상품 약 2,375개 (CSV 2,376줄, 헤더 포함). 이 측정에서는 카탈로그 장 799 + 단 799개 사용. 손그림 파일 269개 중 쿼리 224장
분할 학습 없음. 쿼리 장 112 + 단 112 = 224장. 카탈로그는 손그림 정답 상품을 반드시 포함하고 나머지는 seed 고정 무작위
레이블·클래스 분포 장스탠드 / 단스탠드 1 : 1 (카탈로그·쿼리 모두). ①②의 검색 후보는 장+단을 섞은 799개 (장 400 + 단 399), ③은 같은 라벨 799개
전처리 손그림 정제 + 크롭, 상품 사진 PiDiNet 스케치화(CLIP 갈래), 원본 사진(DINOv3 갈래), ②는 rembg + 피사체 bbox 크롭
개인정보·민감정보 처리 해당 없음 (상품 사진과 손그림)
학습학습을 하지 않았으므로 하이퍼파라미터·에폭·학습 시간은 해당 없음 입니다. 하이퍼파라미터 해당 없음 (측정 설정: Top-K=…

학습을 하지 않았으므로 하이퍼파라미터·에폭·학습 시간은 해당 없음입니다.

항목 값
하이퍼파라미터 해당 없음 (측정 설정: Top-K=10, 모양 무관 기준 = 유사도 하위 50%, 최악 사례 = 오답 50% 이상)
에폭 / 스텝 해당 없음
학습 시간 해당 없음. 임베딩 캐시를 처음 만들 때 약 35분 (README.md 안내, 직접 재지 않음)
하드웨어 측정에 쓴 장비 [미확인] (코드는 CUDA가 있으면 GPU, 없으면 CPU를 쓰며 torch 2.11.0+cu128이 설치됨)
프레임워크 PyTorch 2.11.0+cu128, transformers 5.17.0, open_clip, rembg 2.0.84, TensorBoard 2.21.0, Python 3.12 (.venv)
시드 · 재현 방법 seed=0. 프로젝트 루트에서 .\analysis\stand_bg_removal_category_tensorboard\run_stand_bg_removal_category_tensorboard.ps1 (--catalog-per-label 799 --per-label 112 --mixed-size 799 --seed 0)
결과전체 오답률 선 그래프 (상위 k개 중 오답 비율, k=1~10) 오답은 Top-10 결과(정답 자신 제외) 하나하나가 ⓐ 장…
전체 오답률 선 그래프 (상위 k개 중 오답 비율, k=1~10)
전체 오답률 선 그래프 (상위 k개 중 오답 비율, k=1~10)

오답은 Top-10 결과(정답 자신 제외) 하나하나가 ⓐ 장↔단 혼동(라벨이 손그림과 다름) 또는 ⓑ 같은 라벨이지만 정답 상품과의 유사도가 카탈로그 하위 50%(모양 무관)에 해당하는 경우입니다. 오답률 = Top-10 중 오답 비율(낮을수록 좋음)이고, 정답률은 참고용입니다.

지표 최종 모델 (r1) + 배경 제거 (r2) + 카테고리 분리 (r3) 테스트셋
오답률 (전체) 28.2% (24~32%) 34.3% (31~38%) 15.2% (12~18%) 손그림 224장
ⓐ 장↔단 혼동 17.9% 25.1% 0.0% (설계상) 〃
ⓑ 같은 라벨·모양 무관 10.2% 9.2% 15.2% 〃
1등이 오답 25.9% 35.3% 20.5% 〃
오답 5개↑ 손그림 비율 25.9% 31.2% 11.6% 〃
오답률 (장스탠드) 28.9% 23.6% 21.5% 장 112장
오답률 (단스탠드) 27.4% 45.1% 8.8% 단 112장
장/단 오답률 차이 1.5%p 21.5%p 12.7%p 224장
(참고) 정답률 Top-10 44.2% 52.2% 39.3% 224장

괄호는 부트스트랩 95% CI입니다. 최종 모델과 같은 손그림끼리 짝지은 차이:

비교 Δ오답률 Δ장↔단 혼동 Δ같은 라벨·모양 무관 (참고) Δ정답률
+ 배경 제거 − 최종 모델 +6.2%p (+3.4~+8.8) +7.2%p (+4.6~+9.7) −1.0%p (−2.7~+0.7) +8.0%p (+1.3~+14.7)
+ 카테고리 분리 − 최종 모델 −13.0%p (−15.8~−10.1) −17.9%p (−21.2~−14.8) +5.0%p (+3.4~+6.7) −4.9%p (−8.5~−2.2)
  • 검색 후보를 장+단 전체 1,598개로 늘린 조건(cat799_mixall_q112_seed0)에서도 방향은 같음: 오답률 최종 모델 29.0% / + 배경 제거 33.5% / + 카테고리 분리 15.2% (summary.md)

추론 성능 (CPU / GPU)

측정 안 함. 이 분석은 오답률 비교이며 지연 시간·처리량·메모리는 재지 않았습니다. infer_ms에는 넣지 않았습니다.

장비 장비 이름 배치 크기 지연 시간 (샘플당, p50 / p95) 처리량 (샘플/초) 메모리 사용
CPU - - 측정 안 함 측정 안 함 측정 안 함
GPU - - 측정 안 함 측정 안 함 측정 안 함
  • 측정 방법: 해당 없음
실험 기록3회 측정 · 대표 r3

같은 모델을 설정·분류기를 바꿔 3번 측정한 기록입니다. ★ r3이(가) 대표 결과(맨 위 수치)입니다.

직전 실행에서 바뀐 설정지표 최고값
실행날짜바뀐 점backgroundcategory_separationcandidatesoff_ratecat_wrong_ratehit_top10학습 시간
r1
최종 모델
2026-09-29기준: 원본 사진, 카테고리 분리 없음
analysis/stand_bg_removal_category_tensorboard/runs/cat799_mix799_q112_seed0/
originalfalse79928.2%17.9%44.2%-
r2
+ 배경 제거
2026-09-29DINOv3 갈래 상품 사진에 rembg 배경 제거 + 피사체 크롭
analysis/stand_bg_removal_category_tensorboard/runs/cat799_mix799_q112_seed0/
rembgfalse79934.3%25.1%52.2%-
★ r3
+ 카테고리 분리
2026-09-29배경 제거 없이, 손그림과 같은 라벨(장/단) 상품 안에서만 검색
analysis/stand_bg_removal_category_tensorboard/runs/cat799_mix799_q112_seed0/
originaltrue79915.2%0.0%39.3%-
off_rate 변화 실행 순서대로 · 낮을수록 좋음
r1 · 최종 모델
28.2%
r2 · + 배경 제거
34.3%
r3 · + 카테고리 분리
15.2%
한계 · 배운 점한계 알려진 실패 유형: 배경 제거가 엉뚱한 사물을 피사체로 잡는 경우가 있고(프로젝트 README), 단스탠드에서 장↔단 혼…

한계

  • 알려진 실패 유형: 배경 제거가 엉뚱한 사물을 피사체로 잡는 경우가 있고(프로젝트 README), 단스탠드에서 장↔단 혼동이 42.0%까지 늘어남
  • 편향 / 공정성 이슈: [미확인]
  • 성능이 떨어지는 입력 조건: 카테고리 분리는 사용자가 장/단을 고른다는 가정이라, 서비스에 카테고리 선택 단계가 있어야 이 조건이 됨. 카테고리 분리로 ⓐ가 0이 되는 것은 설계상 당연하고, 빠진 자리를 같은 라벨 상품이 채워 ⓑ가 +5.0%p 늘고 정답률 Top-10도 −4.9%p 줄어듦
  • 측정 한계: 라벨당 112장이라 신뢰구간이 넓음. ⓑ의 유사도는 검색 모델과 같은 계열 임베딩(DINOv3 0.5 + CLIP 0.5)으로 재서 완전히 독립적인 척도가 아님. 카탈로그 샘플이 seed에 따라 바뀌는데 seed 0 한 번만 기록함 (seed 1, 2 결과는 [미확인])

배운 점

  • 배경 제거는 정답률(+8.0%p)은 올리지만 장↔단 혼동(+7.2%p)과 장/단 편차(1.5%p → 21.5%p)를 키워 오답률이 늘었다. 특히 단스탠드 오답률이 27.4% → 45.1%가 됐다
  • 카테고리 분리만으로 오답률이 28.2% → 15.2%로 줄었고, 줄어든 만큼은 최종 모델에서 장↔단 혼동이 차지하던 17.9%와 일치한다
  • 다음에 해 볼 것: seed 1·2로 반복, 장스탠드에서 카테고리 분리 후에도 높은 ⓑ(21.5%) 줄이기, 장/단을 자동으로 분류하는 단계 검토
사용 방법코드 셀 2개
In [1]측정 + TensorBoard 기록
.\.venv\Scripts\python.exe analysis\stand_bg_removal_category_tensorboard\log_stand_bg_removal_category_to_tensorboard.py --catalog-per-label 799 --per-label 112 --seed 0
In [2]TensorBoard 보기
.\.venv\Scripts\python.exe -m tensorboard.main --logdir analysis\stand_bg_removal_category_tensorboard\runs

같은 과제·데이터셋 비교

같은 과제·데이터셋으로 학습한 모델이 생기면 여기에서 비교됩니다.