말(馬) BestView·Keypoints·Segmentation·Detection 추론 워커 — 역분석

대상 이미지(삭제됨): ghcr.io/sanchit2843/horse-bestview-keypoints-segmentation-detection-dino-worker:v6 digest sha256:3a796a4276168afedb8b18c40e4fb72f3d16445a14c20ca3b078ab4699151b26, 5.5GB, 2026-06-20 빌드 근거: 이미지 빌드 히스토리(rtx3-docker-leftover-detail.txt 1~90행)만으로 역분석. 소스 본문은 확보 못 함(이미지 삭제, ghcr 401). 따라서 "구조·파일·모델·실행방식"은 확실, 알고리즘 세부는 추정으로 구분 표기.


한 줄 요약

말 사진/영상을 입력받아 ① 말 탐지(detection) → ② 분할(segmentation) → ③ 자세 키포인트(pose keypoints) → ④ "베스트 뷰" 선별(best-view 분류) 까지 한 번에 수행하는, DINOv3 + YOLO 기반 멀티모델 추론 파이프라인. 상시 떠 있는 REST 서버가 아니라, 잡(run) 단위로 큐에서 작업을 받아 처리하는 클라우드 워커(Vast.ai cloud_docker 실행 모드).


1. 무엇을 하는 서버인가 (기능)

이름이 곧 기능 명세다: horse · bestview · keypoints · segmentation · detection · dino.

→ 전형적 용도(추정): 말 체형/외형 분석·정렬용 자동 전처리. 예) 말 매물 사진에서 최적 측면컷 자동 선정 + 마스킹 + 부위 측정용 키포인트 산출, 또는 컨포메이션(체형) 평가·바이오메카닉스 파이프라인의 프런트엔드.


2. 모델 구성 (4종 — 멀티모델 앙상블 파이프라인)

가중치 파일 정체 역할(추정)
weights/horse22_yolo26x_best.pt 말 전용 커스텀 학습 YOLO("horse22" 데이터셋, yolo26x, best 체크포인트) 1차 말 탐지/세그(도메인 특화)
weights/yolo11l-seg.pt Ultralytics YOLO11-large 세그멘테이션(스톡, 56MB) 분할(segmentation) 보강
weights/dinov3_vitb16_pretrain_lvd1689m-*.pth DINOv3 ViT-B/16(LVD-1689M 사전학습, 343MB) 공통 특징 백본(메인)
weights/dinov3_vits16plus_pretrain_lvd1689m-*.pth DINOv3 ViT-S/16+(경량) 경량 특징 추출
model/classifier_epoch_030_val0.1344.pt + model/config.json 자체 학습 분류기(30 epoch, val loss 0.1344) BestView 판정 헤드(DINOv3 임베딩 입력→뷰 점수)
dinov3/hubconf.py DINOv3 repo(torch.hub 로더) ViT 로딩 진입점

핵심: YOLO 계열(탐지·분할) + DINOv3 ViT(특징) + 경량 분류기(베스트뷰) 의 조합. 키포인트는 별도 모델 혹은 YOLO-pose/DINO 특징 기반(소스 미확보로 단정 불가).


3. 소스 구성 (커스텀 코드)

추론 패키지 /app/inference_bestview_keypoints/ (WORKDIR, ENV HORSE_DIR):

워커 측 /app/horse_worker/:

힌트: ENV BV_PYTHON, KP_PYTHON(둘 다 /opt/conda/bin/python) → BestView 와 Keypoints 를 별도 모델서버 프로세스로 띄울 수 있게 설계(파이썬 인터프리터를 단계별로 분리 호출). HORSE_FULL_PIPELINE=1 → 전체 파이프라인 모드 토글.


4. 실행/배포 아키텍처 — "서버"가 아니라 "워커"

기동 명령(CMD):

sh -c "python /app/horse_worker/preflight.py \
   && python -m worker_runtime.main --launch-mode cloud_docker \
        --run-id ${RUN_ID} --executor-id ${EXECUTOR_ID} --config ${RUN_CONFIG}"

동반된 프레임워크 패키지(범용 = 다른 모델에도 재사용되는 자체 플랫폼): worker_runtime(워커 본체) · orchestrator(오케스트레이션) · queues(잡 큐) · storage(입출력 아티팩트 저장) · providers(클라우드/리소스 공급자 추상화) · inferctl(추론 제어 CLI?) · local_agent(로컬 에이전트) · core · config. pip install -e /app 로 설치.

이 프레임워크가 이 워커의 가장 큰 학습 가치다 — "여러 모델 추론을 Vast 같은 임차 GPU에 잡 단위로 분산 실행하는 자체 오케스트레이션 플랫폼"의 레퍼런스 구현. 같은 골격에 executor만 바꿔 다른 추론도 돌렸을 것.


5. 기술 스택


6. 추정 파이프라인 흐름 (재구성)

입력(말 영상/이미지들)
  └─[ffmpeg 프레임 추출]
      └─ segdetdino.py
           ├─ horse22_yolo26x / yolo11l-seg → 말 탐지 + 분할 마스크
           └─ DINOv3 ViT-B/16 → 프레임 임베딩
      └─ keypoints.py → 말 자세 키포인트
      └─ best_view.py
           └─ classifier(epoch_030) + DINOv3 임베딩 → 프레임별 "뷰 점수" → 베스트 프레임 선정
  └─ infer_one.py 가 위를 한 잡으로 묶어 실행
  └─ worker_runtime → 결과(베스트뷰 이미지 + 마스크 + bbox + 키포인트)를 storage 로 업로드

7. 확실 vs 추정

복구/재현 단서