[트러블 슈팅][하이라이트 사진 추천] Linear Probing 학습 과정 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki

관련 기능

1. 데이터 로딩 문제

  • 학습에 사용할 데이터셋의 크기가 33GB로, 데이터를 로드해오는 것부터 어려웠음

    • COLAB에서 학습을 돌리기 위해 Google Drive 연동
      • Google Drive에 압축 파일을 올리고 해제

      • Google Drive에서 제공하는 Extractor는 너무 느려서 사용 불가 → Colab에서 아래 코드 실행해서 압축 해제

        !unzip "AVA_dataset.zip"
        
  • Google Drive를 마운트 했다고 해도, 불러오는 속도가 너무 느렸음

→ 결국 로컬에서 학습


2. 정확한 학습 가이드의 부재

  • 학습 방안이 제시되어 있는 논문에는 사용한 데이터셋, Loss, Optimizer만 나타나 있음
    • 스코어 정규화를 하였는지, Epoch는 몇으로 돌렸는지가 나와있지 않았음

→ 방식을 나눠서 실험을 하고 최적의 결과를 도출

# 스코어 정규화 전
[epoch 1] Spearman Rank Correlation: 0.1410
[epoch 2] Spearman Rank Correlation: 0.3466
[epoch 3] Spearman Rank Correlation: 0.5080
[epoch 4] Spearman Rank Correlation: 0.5744
[epoch 5] Spearman Rank Correlation: 0.6079

# 스코어 정규화 후
[epoch 1] Spearman Rank Correlation: 0.1400
[epoch 2] Spearman Rank Correlation: 0.6030
[epoch 3] Spearman Rank Correlation: 0.6776
[epoch 4] Spearman Rank Correlation: 0.6947
[epoch 5] Spearman Rank Correlation: 0.7012

3. 배치 단위로 미리 저장한 이미지 임베딩과 스코어 매칭 불일치

a. 문제 개요

  • AVA dataset을 배치 단위로 미리 임베딩 후 .pt 파일로 저장하여 학습에 활용하려고 했음
  • 그러나 일부 이미지 로딩 실패(Image.open(...))로 인해 임베딩 벡터 수와 스코어 수가 불일치하는 문제가 발생
  • 이로 인해 학습 시 image_featuresscores 간의 매핑이 어긋나 모델이 정확히 학습되지 않았음

b. 발생 원인

  • batch_image_generator() 내부에서 이미지를 열 때 예외 발생 시 continue로 건너뛰게 되어 있음

    try:
        img = Image.open(row['image_url']).convert("RGB")
        ...
    except:
        print(f"[Error] Faild to load {row['image_url']}")
        continue
    
  • 그러나 이후 .pt 파일 저장 시 사용된 인덱싱 로직은 start_idx:end_idx 기준으로 DataFrame 상의 전체 인덱스를 고정적으로 참조

    torch.save({
        'image_names': df.iloc[start_idx:end_idx]['image_url'].tolist(),  # ❌ 손실된 이미지 고려 안함
        ...
    })
    
  • 이로 인해 로드에 실패한 이미지가 누락되었음에도, 스코어는 고정된 인덱스를 기준으로 저장되어 embeddingscore의 순서가 어긋남

c. 해결 방법: 임베딩-스코어를 함께 저장 및 불러오기

  • 이미지 로딩이 성공한 경우에만 임베딩 벡터, 스코어, 이미지 이름을 각각 리스트에 수집하고, 동일한 순서로 .pt에 저장

    image_names.append(row['image_url'])  # ✅ 로딩 성공한 경우에만 추가
    scores.append(row['mean_score'])
    images.append(img_tensor)
    
    ...
    
    torch.save({
        'image_names': image_names,
        'image_features': embeddings.cpu(),
        'scores': scores.cpu()
    }, f"ava_embeddings/ViT_B_32_train_image_batch_{count:04d}.pt")
    
  • 학습 시에도 .pt에서 image_featuresscores를 함께 불러와 정확히 정렬된 상태로 학습에 활용:

    for file in train_files:
        data = torch.load(file)
        train_features.append(data['image_features'])
        train_labels.append(data['scores'])
    

d. 핵심 정리

항목 내용
문제 현상 image_featuresscores의 매칭이 어긋남
원인 이미지 로딩 실패 시 continue 하면서도, df.iloc[start_idx:end_idx]를 그대로 사용
증상 학습 시 loss 이상치, Spearman correlation 저하, 평가 오류
조치 이미지 임베딩과 정답 스코얼르 동시에, 같은 순서로 .pt에 저장 → 학습 시 동시에 로드
결과 학습/평가 시 정확한 임베딩–스코어 매칭이 보장됨