구조물 안정성 물리 추론 AI 경진대회

Public LB 0.01453 방법론 공유드립니다.

2026.03.31 16:04 232 조회

제가 뭐 하다가 코드를 지워버렸더라구요..? 코드의 잔해를.. 토대로 공유드립니다.. (왜 지워진거지 엄..)


1. 문제 분석

  • Train(1000개): 고정된 실험실 환경 (광원/카메라 고정)
  • Dev/Test: 무작위 환경 (광원/카메라 변동)


  • 핵심 문제: 이번 대회의 핵심 난이도는 Train과 Test의 도메인 차이였습니다. Train 데이터는 광원과 카메라가 고정된 실험실 환경에서 촬영되었고, Test 데이터는 이들이 무작위로 변하는 환경에서 촬영되었습니다. 따라서 단순히 Train에서 잘 학습된 모델이 Test에서는 일반화되지 않는 문제가 있었습니다.



2. 모델 구조

  • Backbone: ConvNeXt-Large
  • Input: Front view + Top view (384x384)
  • Fusion: 두 view feature concat → MLP classifier
  • Output: unstable 확률


  • Backbone으로 ConvNeXt-Large를 사용했습니다. Front view와 Top view 두 개의 이미지를 각각 384x384 크기로 resize한 후, 같은 backbone에 통과시켜 feature를 추출했습니다. 두 feature를 concat한 후 MLP classifier를 통해 unstable 확률을 예측했습니다.

3. 학습 전략

3-1. 데이터

  • Train 1000개 + Dev 100개 전체 활용 (규정 허용)
  • 10-Fold Stratified CV

3-2. 2-Stage 학습

  • Stage-1: 전체 데이터로 18 epochs (LR=1e-4)
  • Stage-2: Dev 4배 업샘플링 후 8 epochs (LR=2e-5) → 도메인 적응

3-3. Augmentation (핵심)

  • 조명 변환: RandomBrightnessContrast, RandomGamma, CLAHE
  • 색상 변환: HueSaturationValue, RGBShift, ColorJitter
  • 기하 변환: HorizontalFlip, ShiftScaleRotate
  • 목적: Train 고정환경 → Test 무작위환경 시뮬레이션

3-4. 기타

  • Label Smoothing: 0.07 (Stage-1), 0.04 (Stage-2)
  • Mixup: alpha=0.2 (epoch 3 이후)
  • Optimizer: AdamW + OneCycleLR


Train 1000개와 Dev 100개를 모두 학습에 활용했습니다. 10-Fold Stratified CV로 총 10개의 모델을 학습했습니다.

학습은 2단계로 진행했습니다. Stage-1에서는 전체 데이터로 18 epochs 학습했고, Stage-2에서는 Dev 데이터를 4배 업샘플링하여 추가로 8 epochs 학습했습니다. 이렇게 한 이유는 Dev가 Test와 동일한 환경이기 때문에, Stage-2에서 Dev 분포에 적응하도록 했습니다.

Augmentation이 가장 중요했습니다. Train의 고정된 조명 환경을 Test의 무작위 환경으로 시뮬레이션하기 위해 RandomBrightnessContrast, RandomGamma, CLAHE, HueSaturationValue, ColorJitter 등 강한 조명/색상 변환을 적용했습니다. 이 외에도 HorizontalFlip, ShiftScaleRotate, Mixup, Label Smoothing을 사용했습니다.


4. 추론

  • TTA 8회: Flip, Brightness, Gamma, CLAHE 조합
  • 앙상블: 10개 fold 모델 logit 평균
  • Temperature Scaling: Dev에서 최적 T 탐색 후 calibration
  • Clip: 최종 확률 0.002~0.998 범위로 제한


추론 시에는 TTA를 8회 적용했습니다. Flip, Brightness, Gamma, CLAHE 등의 조합으로 다양한 변환을 주고 예측을 평균했습니다. 10개 fold 모델의 logit을 평균하여 앙상블했고, Dev 데이터를 이용해 Temperature Scaling을 적용하여 확률을 보정했습니다. 최종 확률은 0.002~0.998 범위로 clip했습니다.


5. 결과

항목값 CV Score~0.017 Public LB 0.01453


6. 시도했으나 효과 없었던 것

  • EVA02 backbone → val loss 높음
  • Mixup on/off → 차이 미미
  • Swin ensemble → 악화
  • Video frame 학습 → 앙상블 시 악화


EVA02 backbone은 val loss가 높아서 사용하지 않았습니다. Swin과의 앙상블은 오히려 성능이 악화되었습니다. 시뮬레이션 영상에서 프레임을 추출하여 학습 데이터를 증강하는 방법도 시도했으나, 기존 모델과 앙상블 시 성능이 나빠졌습니다.

시간 없어서 도중에 하차했는데 재밌는 문제였습니다.

감사합니다.