📝 DIGIT pretrained 5종 비교 실험 보고서
DIGIT 2D 센서 정보 활용 노트에서 정리한 방법론들 중, 사전학습(pretrained) 모델이 공개된 다섯 가지(py3DCal, Sparsh, SITR, MidasTouch, NeuralFeels의 tactile transformer)를 같은 DIGIT 하드웨어로 직접 돌려보고 체감 성능을 순위로 정리한 보고서.
1. 실험 배경
원래 출발점은 NeuralFeels였다. 인핸드 자세·형상 추정을 해보려고 공개된 tactile transformer(ViT/DPT) 가중치를 내 DIGIT에 그대로 꽂아봤는데, 실센서에서의 깊이 출력 품질이 기대에 못 미쳤다(포화·절대값 모호). 가중치가 TACTO 시뮬로만 학습된 탓이 커 보였다.
그러면 실물 DIGIT 데이터로 다시 학습해야 하는데, 여기서 막혔다. NeuralFeels의 평가 데이터셋인 FeelSight는 공개돼 있지만 그걸 어떻게 구축했는지(촉각 깊이 라벨을 어떻게 만들었는지)는 문서화돼 있지 않다. 결국 “내 센서로 ViT를 재학습하려면 데이터를 어떻게 모으고 라벨링해야 하나”가 막막했다.
그래서 방향을 틀었다. “실물 DIGIT에 바로 쓸 수 있는, 이미 학습된 모델이 다른 데도 있지 않나” 를 조사·실험한 게 이 보고서다. ViT 재학습이라는 큰 산을 넘기 전에, 사전학습만으로 쓸 만한 대안(Sparsh, py3DCal, MidasTouch)이 있는지부터 확인하려는 의도였다.
2. 실험 개요
이전 노트는 DIGIT 한 장의 RGB에서 뽑을 수 있는 정보를 수준별로 매핑한 자료조사였다. 이번에는 그중 사전학습 모델을 바로 쓸 수 있는 다섯 방법론을 골라, 같은 환경에서 실제로 추론을 돌려봤다.
- 공통 하드웨어: 물리 DIGIT 센서 4개 —
D21418,D21422,D21424,D21429 - 공통 입력: DIGIT 임베디드 카메라의 2D RGB (대략 240×320)
- 비교 관점: “사전학습 가중치를 받아서, 추가 학습/캘리브레이션 없이, 내 센서에 꽂았을 때 바로 쓸 만한가” (SITR만 18장짜리 기하 캘리브레이션 이미지를 요구하지만, 재학습은 아니므로 포함)
다섯 방법론은 같은 입력을 받지만 목표 출력이 다르다. 그래서 “누가 정확한가”를 한 줄로 줄 세우긴 어렵고, 아래에서는 (1) 각자 무엇을 뽑는지, (2) 그걸 사전학습 상태로 돌렸을 때의 체감을 나눠서 본다.
3. 각 방법론이 DIGIT에서 뽑아낸 정보
py3DCal — RGB → 깊이맵(mm)
DIGIT 젤이 눌린 RGB를 받아 표면 기울기(Gx, Gy) 를 예측하고, Poisson 적분으로 깊이맵(단위 mm) 을 만든다. 모델은 TouchNet이라는 완전 합성곱 CNN(약 3.9M 파라미터)이고, 3D 프린터로 구를 정확한 좌표에 눌러 모은 캘리브레이션 데이터로 학습됐다. 핵심은 물리 단위(mm)로 해석 가능한 깊이가 바로 나온다는 점.
- 입력: 5채널(RGB 3 + 좌표 임베딩 2), 320×240 풀해상도
- 출력: 기울기맵 → 깊이맵(mm), 접촉 마스크, 포인트클라우드
- 사전학습:
digit_weights/digit_pretrained_weights.pth(15MB, Zenodo 자동 다운로드)
Sparsh — RGB → 표현(latent) → 힘장 / 슬립
자기지도학습(SSL)으로 만든 범용 촉각 표현(ViT-Base, 768차원) 이 백본이고, 그 위에 디코더를 붙여 다양한 정보를 뽑는다. 내가 돌려본 건 force field 디코더로, 접촉 지점의 normal force 크기 + 2D shear force 벡터장을 픽셀 단위로 출력한다. slip(미끄러짐) 디코더도 있다.
- 입력: 6채널(연속 2프레임 × RGB 3)
- 출력: per-pixel normal·shear 힘장, slip 이진 분류, latent 표현
- 백본 SSL: DINO / MAE / I-JEPA / DINOv2 중 DINO-base가 체감 최고
- 사전학습:
sparsh_models/의 DINO 백본 +forcefield_decoder체크포인트 - 데모:
demo_forcefield.py(단일),demo_forcefield_multi.py(센서 4개 동시, RTX 4070 Laptop에서 ~28fps)
SITR — RGB → 센서 불변 표현 → 법선맵 / 분류·포즈
여러 시뮬레이션 센서로 학습한 ViT 인코더(Sensor-Invariant Tactile Representation, ICLR 2025)다. 핵심은 어떤 광학 촉각 센서를 꽂든 공통의 surface-normal map(표면 법선) 으로 정규화해주는 것. 그 위에 task head를 붙여 물체 분류(16클래스), 3-DoF 상대 포즈 회귀, 3D 표면 재구성을 한다. DIGIT는 학습된 센서 목록에서 sensor_0001로 대응된다.
- 입력: 샘플 RGB + 캘리브레이션 이미지 18장(배경 1 + 구 압입 9 + 큐브 압입 9)
- 출력: 3채널 surface-normal map(224×224), cls 토큰(768d) → 분류/포즈 head
- 사전학습:
data/checkpoints/의 백본SITR_B18.pth+ 센서별 분류/포즈 head (HFhgupt3/sitr_dataset) - 특징: zero-shot 센서 전이 — 새 DIGIT는 재학습 없이 18장 기하 캘리브레이션만으로 적용.
stream_digit_sitr.py로 4센서 실시간(재구성 ~185fps)
MidasTouch — RGB → 표면 위 위치(SE(3) belief)
알려진 물체 메시 위에서 DIGIT가 지금 어디를 만지고 있는지를 추정한다(슬라이딩 위치추정). 파이프라인은 ① TDN으로 heightmap+contact mask, ② TCN으로 256차원 tactile code, ③ 미리 만든 codebook(자세→code)과 비교하며 파티클 필터로 SE(3) 분포를 좁힌다.
- 입력: DIGIT RGB → heightmap → tactile code
- 출력: 표면 위 위치의 확률분포(파티클 + 가중치)
- 사전학습:
download_assets.sh로 TDN(729MB)·TCN(13MB)·MinkLoc3D 가중치 + YCB codebook 다운로드 - 전제 조건: 물체 메시 + 해당 물체의 codebook + 센서의 6-DOF odometry(모캡/로봇 FK/VIVE 등)
NeuralFeels (tactile transformer) — RGB → 깊이맵 → neural SDF
NeuralFeels가 인핸드 자세·형상 추정에 쓰는 촉각 프런트엔드는 DPT(Dense Prediction Transformer, ViT-Small/DINO 백본) 다. DIGIT RGB → heightmap(깊이) 을 예측해서, 뒷단의 neural SDF 최적화에 3D 접촉점으로 공급한다. 즉 py3DCal과 목표(깊이 추정)가 같은데 방법이 ViT라는 점이 비교 포인트다.
- 입력: DIGIT RGB(224×224로 리사이즈)
- 출력: 단일 채널 깊이맵([0,1] 범위) → 마스킹 → neural SDF 입력
- 사전학습:
dpt_real.p,dpt_sim.p(각 ~310MB, TACTO 시뮬로만 학습해서 실센서에 frozen 배포)
정보 요약 표
| 방법론 | 모델 종류 | DIGIT에서 뽑는 것 | 출력 단위/형식 | 추가로 필요한 것 |
|---|---|---|---|---|
| py3DCal | CNN (TouchNet) | 깊이맵 | mm 단위 depth + 마스크 | 없음 (가중치만) |
| Sparsh | SSL ViT + 디코더 | 힘장 / 슬립 / 표현 | normal·shear 힘장, slip | 없음 (가중치만) |
| SITR | 센서 불변 ViT + head | 법선맵 / 분류·포즈 | surface-normal map, 분류·3DoF 포즈 | 캘리브 이미지 18장 |
| MidasTouch | CNN + 파티클 필터 | 표면 위 위치 | SE(3) 확률분포 | 메시 + codebook + 6DOF 추적 |
| NeuralFeels | ViT (DPT) | 깊이맵 | [0,1] 정규화 depth | (SDF 단까지 가려면) 멀티뷰·포즈 |
4. 체감 pretrained 성능 순위
사전학습 가중치를 받아 추가 학습 없이 내 4개 센서에 바로 꽂았을 때, 출력이 얼마나 깨끗하고 바로 쓸 만했는지 기준의 체감 순위다.
| 순위 | 방법론 | 한 줄 평 |
|---|---|---|
| 🥇 1 | Sparsh | 힘장(normal·shear)이 박스째로 잘 분리되어 나오고, 4센서 실시간까지 안정 |
| 🥈 2 | SITR | 시뮬 학습인데도 18장 캘리브만으로 zero-shot 전이, 법선맵·분류·포즈가 바로 동작 |
| 🥉 3 | py3DCal | mm 단위 깊이가 곧바로 해석 가능, 형상 품질이 깔끔 |
| 4 | MidasTouch | 능력은 가장 크지만 메시·codebook·6DOF 추적 의존이 무겁다 |
| 5 | NeuralFeels (ViT) | 깊이가 나오긴 하나 출력이 포화/절대값 모호, sim 학습 한계 |
왜 이 순위인가
1위 Sparsh — “바로 꽂아서 가장 많이, 가장 안정적으로”. DINO 백본 + force field 디코더 조합이 사전학습 상태에서 곧바로 동작했다. 접촉 시 normal 필드에 국소 피크가 잡히고 shear 벡터장이 미끄러짐 방향을 따라가, normal과 shear가 의미대로 분리됐다. 단일·멀티(4센서) 데모 모두 실시간으로 돌았다. 한계는 명확한데, 무접촉 상태에서 normal 필드에 잔여 노이즈가 있어 절대값보다 상대 변화를 봐야 한다(shear는 더 안정적). 그래도 “정보량 × 즉시성 × 안정성”에서 가장 앞섰다.
2위 SITR — “시뮬 학습인데 전이가 의외로 잘 됐다”. 가장 인상적이었던 건, 가중치가 전부 시뮬레이션 센서로만 학습됐는데도 내 실물 DIGIT에 18장짜리 기하 캘리브레이션 이미지만 넣어주면 surface-normal map이 곧바로 깨끗하게 나왔다는 점이다. NeuralFeels의 ViT도 sim 학습인데 실센서에서 무너진 것과 대비된다 — SITR은 애초에 센서 광학을 무작위로 흔들어 학습(domain randomization) 한 덕에 도메인 갭을 흡수했다. 법선맵·분류·3-DoF 포즈가 stream_digit_sitr.py로 실시간 동작했다. Sparsh보다 아래 둔 이유는 (1) 18장 캘리브레이션이라는 사전 절차가 필요하고, (2) confusion matrix상 DIGIT(sensor_0001)이 GelSight 계열보다 정확도가 낮아 출력 신뢰도가 센서 종류에 의존하기 때문.
3위 py3DCal — “깨끗하고 해석 가능한 깊이”. 출력이 mm 단위 깊이라 바로 의미가 있고, 접촉 형상이 깔끔하게 잡혔다. 같은 깊이 추정인 NeuralFeels의 DPT와 직접 비교했을 때 품질이 더 나았다(py3DCal 자체 리포트에서도 TouchNet이 형상 품질·절대값 측면에서 우위). 원래는 느렸지만(20fps) 저해상도+GPU Poisson 최적화로 155fps까지 끌어올릴 수 있었다. SITR보다 아래 둔 건 뽑는 정보가 깊이 한 종류로 더 좁기 때문(SITR은 같은 법선/깊이 계열에 분류·포즈까지 얹는다).
4위 MidasTouch — “잠재력은 1등, 그러나 짐이 무겁다”. 표면 위 위치추정이라는 가장 고수준 출력을 내지만, 그게 동작하려면 (1) 대상 물체의 정확한 메시, (2) 그 물체로 미리 만든 codebook, (3) 센서의 6-DOF odometry(모캡/로봇 FK/VIVE 트래커)가 전부 필요하다. 추적 하드웨어 없이는 codebook 위치추정이 제대로 수렴하지 않아, 사실상 TDN의 heightmap 정도만 독립적으로 쓸 수 있었다. “pretrained만 받아서 바로”라는 기준에선 점수가 깎였다.
5위 NeuralFeels (ViT/DPT) — “깊이는 나오지만 가장 거칠다”. DIGIT RGB→heightmap이 나오긴 하나, 출력이 포화되고 절대 깊이값이 모호했다. 가중치(dpt_real.p/dpt_sim.p)가 TACTO 시뮬로만 학습된 뒤 frozen으로 실센서에 배포되는 구조라, 실센서 도메인 갭이 그대로 드러난 것으로 보인다. 또 단독으로는 background subtraction·마스킹 등 전처리에 민감했다. 깊이 추정 단독 품질에서 py3DCal에 밀렸다.
5. 정리
- 목적이 다르다는 점을 먼저 기억할 것. Sparsh=힘, py3DCal·NeuralFeels=깊이, SITR=법선맵+분류·포즈, MidasTouch=위치. “1등이 모든 면에서 최고”가 아니라 “사전학습을 바로 꽂았을 때의 즉시성·안정성” 기준의 순위다.
- 바로 쓰기 좋은 순서는 Sparsh ≥ SITR ≥ py3DCal. 셋 다 큰 재학습 없이 동작하고, 각각 힘장·법선/포즈·깊이라는 다른 정보를 깨끗하게 준다. 실제 파이프라인에선 Sparsh(힘) + py3DCal(깊이) 조합에 필요하면 SITR(법선·분류·포즈) 를 얹는 식이 실용적으로 보였다.
- sim 학습이라고 다 같지 않다. NeuralFeels의 ViT와 SITR 모두 시뮬로 학습됐지만, domain randomization으로 센서 광학을 흔들어 학습한 SITR은 실센서 전이가 됐고 단순 TACTO 학습인 NeuralFeels DPT는 무너졌다. “실물 DIGIT 데이터로 재학습”이라는 원래 고민(1. 실험 배경)의 현실적 우회로가 SITR의 zero-shot 전이였던 셈.
- MidasTouch는 6-DOF 추적이 갖춰진 셋업에서 재평가할 가치가 있다. 위치추정은 본질적으로 추적 인프라가 전제다.
참고: 이 순위는 사전학습 모델을 같은 4개 DIGIT(
D21418/D21422/D21424/D21429)에 추가 학습 없이 적용한 체감 비교다. 각 방법론을 자체 데이터로 재학습/캘리브레이션하면 결과는 달라질 수 있다.