OMX ์ƒ์ž ์•ˆ์— ์‹ ๋ฐœ ๋„ฃ๊ธฐ ยท ACT ์‹œ์—ฐ์ž๋ณ„ ๋น„๊ต (2026-11-03)

๊ฐ™์€ ์ž‘์—…์„ ๋‘ ์‚ฌ๋žŒ์ด ๊ฐ๊ฐ 10๋ฒˆ์”ฉ ์‹œ์—ฐํ•œ ๋ฐ์ดํ„ฐ๋กœ ACT๋ฅผ ํ•™์Šตํ•œ ๋ชจ๋ธ๊ณผ ์‹คํ–‰ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

  • ๋ฐ์ดํ„ฐ: Yuzriha00/shoebox_a(์‹œ์—ฐ์ž a, 10๊ฐœ, 10,787ํ”„๋ ˆ์ž„), Yuzriha00/shoebox_b(์‹œ์—ฐ์ž b, 10๊ฐœ, 16,086ํ”„๋ ˆ์ž„)
  • 30 fps, ์นด๋ฉ”๋ผ top(์œ„์ชฝ)ยทwrist(์†๋ชฉ), state 6(๊ด€์ ˆ 5 + ๊ทธ๋ฆฌํผ ์œ„์น˜)
  • ๊ฐ ๋ฐ์ดํ„ฐ์—์„œ ์‹œ์—ฐ 1๊ฐœ(9๋ฒˆ)๋Š” val loss ๊ณ„์‚ฐ์šฉ์œผ๋กœ ํ•™์Šต์—์„œ ๋บ์Šต๋‹ˆ๋‹ค. ํ•™์Šต์—๋Š” a 9๊ฐœ / b 9๊ฐœ / a+b 18๊ฐœ๋ฅผ ์ผ์Šต๋‹ˆ๋‹ค.

๋“ค์–ด ์žˆ๋Š” ๋ชจ๋ธ

ํ•™์Šต์ด ๋๋‚œ ๋ชจ๋ธ๋งŒ ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€๋Š” ํ•™์Šต์ด ๋๋‚˜๋ฉด ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ./infer.sh๋ฅผ ์ธ์ž ์—†์ด ์‹คํ–‰ํ•˜๋ฉด ์ง€๊ธˆ ๋“ค์–ด ์žˆ๋Š” ๋ฒˆํ˜ธ๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค.

๋ฒˆํ˜ธ ํด๋” ํ•™์Šต ๋ฐ์ดํ„ฐ ์ž…๋ ฅ step
1โ€“6 act_shoebox_a_<N>step ์‹œ์—ฐ์ž a 9๊ฐœ top + wrist, state 6 600~3600
7โ€“15 act_shoebox_b_<N>step ์‹œ์—ฐ์ž b 9๊ฐœ top + wrist, state 6 600~5400
16โ€“30 act_shoebox_ab_<N>step a + b 18๊ฐœ top + wrist, state 6 600~9000
31โ€“36 act_shoebox_a_moge_<N>step ์‹œ์—ฐ์ž a 9๊ฐœ top + top_depth + wrist, state 6 600~3600
37โ€“45 act_shoebox_b_moge_<N>step ์‹œ์—ฐ์ž b 9๊ฐœ top + top_depth + wrist, state 6 600~5400
46โ€“60 act_shoebox_ab_moge_<N>step a + b 18๊ฐœ top + top_depth + wrist, state 6 600~9000
  • ๋ฒˆํ˜ธ = ./infer.sh <๋ฒˆํ˜ธ>์— ์“ฐ๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค. ๊ฐ ์ค„ ์•ˆ์—์„œ 600 step ์ˆœ์„œ์ž…๋‹ˆ๋‹ค(์˜ˆ: 1 = a 600 step, 6 = a 3600 step).
  • top_depth๋Š” ์œ„์ชฝ ์นด๋ฉ”๋ผ ์˜์ƒ์„ MoGe-2 ViT-B(ํ† ํฐ 1200)๋กœ ์ถ”์ •ํ•œ ๊ฑฐ๋ฆฌ๋ฅผ 0.79~2.65 m ๋ฒ”์œ„์˜ ํ‘๋ฐฑ ์˜์ƒ์œผ๋กœ ๋งŒ๋“  ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ฐ€๊นŒ์šธ์ˆ˜๋ก ํฐ์ƒ‰). ์‹คํ–‰ํ•  ๋•Œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • ์‹ค๋ฌผ ์„ฑ๊ณต๋ฅ : (ํ…Œ์ŠคํŠธ ํ›„ ๊ธฐ๋ก)

val loss

val loss = ํ•™์Šต์— ์“ฐ์ง€ ์•Š์€ ์‹œ์—ฐ์—์„œ, ๋ชจ๋ธ์ด ์˜ˆ์ธกํ•œ ๋™์ž‘ 100์Šคํ…์ด ์‹œ์—ฐ๊ณผ ์–ผ๋งˆ๋‚˜ ๋‹ค๋ฅธ์ง€(L1, ์ •๊ทœํ™” ๋‹จ์œ„, ๋‚ฎ์„์ˆ˜๋ก ์‹œ์—ฐ๊ณผ ๋น„์Šท). ์‹ค๋ฌผ์—์„œ ๋Œ๋ฆด ๋•Œ์ฒ˜๋Ÿผ ๊ณ„์‚ฐํ–ˆ์Šต๋‹ˆ๋‹ค(๋ฌด์ž‘์œ„ ์š”์†Œยท์ด๋ฏธ์ง€ ์ฆ๊ฐ• ์—†์Œ). ํ•™์Šต ๋กœ๊ทธ์˜ loss์™€๋Š” ๊ณ„์‚ฐ์ด ๋‹ฌ๋ผ ๋ฐ”๋กœ ๋น„๊ตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

  • a ํ•™์Šต / b ํ•™์Šต = ํ•™์Šต์— ์“ด ์‹œ์—ฐ(a 0๋ฒˆ, b 10๋ฒˆ) โ€” ๋น„๊ต์šฉ
  • a val / b val = ํ•™์Šต์—์„œ ๋บ€ ์‹œ์—ฐ(a 9๋ฒˆ, b 19๋ฒˆ)
  • ๊ตต์€ ๊ฐ’ = ๊ทธ ๋ชจ๋ธ์—์„œ val์ด ๊ฐ€์žฅ ๋‚ฎ์€ step (a๋Š” a val, b๋Š” b val, ab๋Š” ๋‘ val ํ‰๊ท  ๊ธฐ์ค€)
๋ฒˆํ˜ธ ๋ชจ๋ธ step a ํ•™์Šต a val b ํ•™์Šต b val
1 a 600 0.145 0.285 1.277 0.913
2 a 1200 0.102 0.282 1.238 0.894
3 a 1800 0.094 0.286 1.254 0.908
4 a 2400 0.091 0.285 1.263 0.916
5 a 3000 0.089 0.286 1.256 0.913
6 a 3600 0.088 0.286 1.258 0.915

ํ•™์Šต ์ •๋ณด (lerobot 0.4.4)

ํ•ญ๋ชฉ ๊ฐ’
์‹œ์ž‘์  ResNet18 ImageNet ๊ฐ€์ค‘์น˜
batch ยท step 256 (32ร—8๋กœ ๋‚˜๋ˆ  ๊ณ„์‚ฐ) ยท a 3600 / b 5400 / ab 9000 (๋ชจ๋‘ ๋ฐ์ดํ„ฐ ์•ฝ 95ํšŒ ๋ฐ˜๋ณต), 600๋งˆ๋‹ค ์ €์žฅ
ํ•™์Šต๋ฅ  cosine ์ตœ๋Œ€ 4e-5 (์ด๋ฏธ์ง€ ์ธ์ฝ”๋” 1e-5), warmup 100 โ†’ 1e-6
chunk 100
๊ธฐํƒ€ ์ด๋ฏธ์ง€ ์ฆ๊ฐ•(์ƒ‰ยท์„ ๋ช…๋„ยทํšŒ์ „ ยฑ5ยฐยท์ด๋™ ยฑ5%), grad clip 10, ๊ทธ๋ฆฌํผ ์ „๋ฅ˜ ์•ˆ ์”€

ํ•™์Šต ๋ฐ์ดํ„ฐยทํ•™์Šต ์ฝ”๋“œ

training/ ํด๋”์— ํ•™์Šต ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“  ์ฝ”๋“œ, ํ•™์Šต ์Šคํฌ๋ฆฝํŠธ, val loss ๊ณ„์‚ฐ ์ฝ”๋“œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋ฒ•์€ training/README.md๋ฅผ ๋ณด์„ธ์š”.

  • ์›๋ณธ 2๊ฐœ โ†’ ํ•ฉ์น˜๊ธฐ โ†’ MoGe depth ์ถ”๊ฐ€ โ†’ val ์‹œ์—ฐ ๋นผ๊ธฐ: bash training/make_datasets.sh
  • ํ•™์Šต: bash training/train_act.sh <a|b|ab|a_moge|b_moge|ab_moge>
  • val loss: python -I training/tools/val_loss.py ...

์‹คํ–‰ ๋ฐฉ๋ฒ•

์ด ์ €์žฅ์†Œ์— ์‹คํ–‰ ์ฝ”๋“œ(lerobot 0.4.4์šฉ)๊ฐ€ ๊ฐ™์ด ๋“ค์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒˆํ˜ธ๋กœ ๋ชจ๋ธ์„ ๊ณจ๋ผ ์‹คํ–‰ํ•˜๊ณ , GPU(cuda) ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

pip install "lerobot[dynamixel]==0.4.4"
# MoGe (31~60๋ฒˆ): PyPI์— ์—†์–ด์„œ GitHub์—์„œ ์„ค์น˜
pip install opencv-python-headless scipy trimesh
pip install --no-deps git+https://github.com/EasternJournalist/utils3d.git git+https://github.com/microsoft/MoGe.git

hf download Sungah/omx_shoebox_act --local-dir omx_shoebox_act
cd omx_shoebox_act
chmod +x infer.sh inference.sh   # hf download๋Š” ์‹คํ–‰ ๊ถŒํ•œ์„ ์ง€์›€ (์•ˆ ํ•˜๋ฉด bash infer.sh ๋กœ ์‹คํ–‰)
./infer.sh               # ๋ชจ๋ธ ๋ฒˆํ˜ธ ๋ชฉ๋ก
./infer.sh 2             # a 1200 step
  • MoGe ๋ชจ๋ธ์€ ์ฒ˜์Œ ์‹คํ–‰ํ•  ๋•Œ Hugging Face์—์„œ Ruicheng/moge-2-vitb-normal ๊ฐ€์ค‘์น˜๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

infer.sh๊ฐ€ ์ž๋™์œผ๋กœ ํ•˜๋Š” ์ผ

  • ๋กœ๋ด‡ ํƒ€์ž…์„ ๋ชจ๋ธ์— ๋งž์ถฅ๋‹ˆ๋‹ค.
    • MoGe ๋ชจ๋ธ(depth_info.json์ด ์žˆ์Œ): omx_follower_grip_depth (๊ทธ๋ฆฌํผ ์ „๋ฅ˜๋Š” ๋„ฃ์ง€ ์•Š์Œ)
    • ๊ทธ ์™ธ: omx_follower
  • MoGe ๋ชจ๋ธ์€ ์ •์ฑ…์ด ์ƒˆ๋กœ ์˜ˆ์ธกํ•˜๋Š” ํ”„๋ ˆ์ž„์—์„œ๋งŒ ์œ„์ชฝ ์นด๋ฉ”๋ผ ์˜์ƒ์œผ๋กœ depth๋ฅผ ๋ฐ”๋กœ ๋งŒ๋“ค์–ด ๋„ฃ์Šต๋‹ˆ๋‹ค.
    • ACT๋Š” n_action_steps=50์ด๋ผ 50ํ”„๋ ˆ์ž„(์•ฝ 1.7์ดˆ)๋งˆ๋‹ค ํ•œ ๋ฒˆ ์˜ˆ์ธกํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ”„๋ ˆ์ž„๋งŒ depth ๊ณ„์‚ฐ ์‹œ๊ฐ„(RTX A6000์—์„œ ํ•œ ์žฅ์— ์•ฝ 31~46 ms)๋งŒํผ ๋Šฆ์–ด์ง‘๋‹ˆ๋‹ค.
    • ์˜ˆ์ „ ๋ฐฉ์‹(๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๊ณ„์† ๊ณ„์‚ฐ, 2~3ํ”„๋ ˆ์ž„ ๋Šฆ์Œ)์€ --robot.depth_sync=false๋กœ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‹คํ–‰ ์‹œ๊ฐ„์€ 90์ดˆ๊ฐ€ ๊ธฐ๋ณธ์ž…๋‹ˆ๋‹ค(์‹œ์—ฐ ๊ธธ์ด a 3142์ดˆ, b 5057์ดˆ).

๊ณตํ†ต ์„ค์ •

  • ํฌํŠธยท์นด๋ฉ”๋ผ๋Š” inference.sh ๋งจ ์œ„ "ํ˜„์žฅ ์„ค์ •"์„ ๊ณ ์น˜๊ฑฐ๋‚˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋„˜๊น๋‹ˆ๋‹ค.
    • ์˜ˆ: ROBOT_PORT=/dev/ttyACM1 TOP_CAM=/dev/video4 WRIST_CAM=/dev/video6 ./infer.sh 2
  • GPU๋ฅผ ๋ฐ”๊พธ๋ ค๋ฉด: POLICY_DEVICE=cuda:0 DEPTH_DEVICE=cuda:0 ./infer.sh 32
  • ํ•™์Šต ๋•Œ์™€ ๊ฐ™์•„์•ผ ํ•˜๋Š” ๊ฒƒ: fps(30), ์œ„์ชฝยท์†๋ชฉ ์นด๋ฉ”๋ผ ์œ„์น˜ยท๊ฐ๋„, ์ƒ์žยท์‹ ๋ฐœ ๋ฐฐ์น˜
    • depth ๋ฒ”์œ„(0.79~2.65 m)๋„ ์นด๋ฉ”๋ผ๊ฐ€ ๊ฐ™์€ ์ž๋ฆฌ์— ์žˆ๋‹ค๋Š” ์ „์ œ์ž…๋‹ˆ๋‹ค.
  • ํ•œ ์Šคํ… ์ด๋™๋Ÿ‰์€ --robot.max_relative_target=10์œผ๋กœ ์ œํ•œ๋ผ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์‹คํ–‰๋งˆ๋‹ค ์งง์€ ํ‰๊ฐ€ ๊ธฐ๋ก์ด outputs/eval/ ์•„๋ž˜์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค(Hub ์—…๋กœ๋“œ ์•ˆ ํ•จ).

ํŒŒ์ผ

ํŒŒ์ผ ๋‚ด์šฉ
infer.sh ๋ฒˆํ˜ธ๋กœ ๋ชจ๋ธ ๊ณจ๋ผ ์‹คํ–‰
inference.sh lerobot-record ์˜ต์…˜ ์ „์ฒด(ํฌํŠธยท์นด๋ฉ”๋ผ ์„ค์ •)
omx_run.py lerobot-record + ์•„๋ž˜ ๋กœ๋ด‡ ํƒ€์ž… ๋“ฑ๋ก
omx_depth_robot.py omx_follower_grip_depth: MoGe depth ์นด๋ฉ”๋ผ ์ถ”๊ฐ€, ์˜ˆ์ธก ํ”„๋ ˆ์ž„์—์„œ๋งŒ ๊ณ„์‚ฐ
omx_grip_robot.py omx_follower_grip (์ด ์ €์žฅ์†Œ ๋ชจ๋ธ์€ ์•ˆ ์”€, omx_run.py๊ฐ€ ๋“ฑ๋ก๋งŒ ํ•จ)
omx_box.py ๋ฐ•์Šค ๋ฒˆํ˜ธ one-hot (์ด ์ €์žฅ์†Œ ๋ชจ๋ธ์€ ์•ˆ ์”€, omx_run.py๊ฐ€ BOX๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ import)
act_ensemble.py (์„ ํƒ) ACT k์Šคํ… temporal ensembling
training/ ํ•™์Šต ๋ฐ์ดํ„ฐ ๋งŒ๋“ค๊ธฐยทํ•™์Šตยทval loss ์Šคํฌ๋ฆฝํŠธ (training/README.md)
weights/resnet18-f37072fd.pth ResNet18 ImageNet ๊ฐ€์ค‘์น˜(์ธํ„ฐ๋„ท ์—†์ด ์‹คํ–‰ํ•  ๋•Œ)
models/*/omx_info.json ๊ทธ๋ฆฌํผ ์ „๋ฅ˜ ์‚ฌ์šฉ ์—ฌ๋ถ€(๋ชจ๋‘ false)
models/*_moge_*/depth_info.json depth ๋ฒ”์œ„ยทMoGe ๋ชจ๋ธ ์„ค์ •
Downloads last month

-

Downloads are not tracked for this model. How to track
Video Preview
loading