`LeRobotDataset:v3.0`: Bringing large-scale datasets to `lerobot`
๐ ์์ฝ
Hugging Face๋ ๋ก๋ด ํ์ต์ ์ํ ํ์คํ๋ ๋ฐ์ดํฐ์ ํ์์ธ `LeRobotDataset`์ v3.0์ ์ถ์ํ์ต๋๋ค. ์ด ์ ๋ฐ์ดํธ๋ ์ฌ๋ฌ ์ํผ์๋๋ฅผ ๋จ์ผ ํ์ผ์ ๋ฌถ๊ณ ๊ด๊ณํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ ์์คํ ํ์ฅ์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉฐ, ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ ์ฆ์์์ ์ฒ๋ฆฌํ ์ ์๋ ์คํธ๋ฆฌ๋ฐ ๋ชจ๋๋ฅผ ์ง์ํฉ๋๋ค. `lerobot` ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด ์ด ์๋ก์ด ํ์์ ๋ก๋ด ๊ณตํ ๋ฐ์ดํฐ์ ๋ํ ์ก์ธ์ค๋ฅผ ๊ฐ์ ํ๊ณ ์ปค๋ฎค๋ํฐ๊ฐ ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ผ๋ก ํ๋ จํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
TL;DR ์ค๋ LeRobotDataset:v3๋ฅผ ์ถ์ํฉ๋๋ค! ์ด์ LeRobotDataset:v2 ๋ฆด๋ฆฌ์ค์์๋ ์ํผ์๋๋น ํ๋์ ํ์ผ์ ์ ์ฅํ๋๋ฐ, ์๋ฐฑ๋ง ๊ฐ์ ์ํผ์๋๋ก ๋ฐ์ดํฐ์
์ ํ์ฅํ ๋ ํ์ผ ์์คํ
์ ํ์ ๋ถ๋ชํ์ต๋๋ค. LeRobotDataset:v3๋ ๊ด๊ณํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์ํผ์๋ ํ์ผ์์ ๊ฐ๋ณ ์ํผ์๋ ์์ค์ ์ ๋ณด๋ฅผ ๊ฒ์ํ๋ฉด์ ์ฌ๋ฌ ์ํผ์๋๋ฅผ ๋จ์ผ ํ์ผ์ ๋ฌถ์ต๋๋ค. ์ ํ์์ ์คํธ๋ฆฌ๋ฐ ๋ชจ๋์์ ๋ฐ์ดํฐ์
์ ์ก์ธ์คํ๋ ๊ฒ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์ํ์ฌ ๋๊ท๋ชจ ๋ฐ์ดํฐ์
์ ์ฆ์์์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. LeRobotDataset ํ์์ ๋ชจ๋ ๋ฐ์ดํฐ์
์ ์ ํ์์ผ๋ก ๋ณํํ๋ ํ ์ค ์ ํธ๋ฆฌํฐ๋ฅผ ์ ๊ณตํ๋ฉฐ, ๋ค์ ์์ ์ ์ธ ๋ฆด๋ฆฌ์ค ์ ์ ์ด ์ด์ ํ๋ฅผ ์ปค๋ฎค๋ํฐ์ ๊ณต์ ํ๊ฒ ๋์ด ๋งค์ฐ ๊ธฐ์ฉ๋๋ค!
LeRobotDataset, v3.0
LeRobotDataset์ ๋ก๋ด ํ์ต์ ํน์ ์๊ตฌ ์ฌํญ์ ํด๊ฒฐํ๋๋ก ์ค๊ณ๋ ํ์คํ๋ ๋ฐ์ดํฐ์
ํ์์ด๋ฉฐ, ์ผ์ ์ด๋ ํ๋
, ์ฌ๋ฌ ์นด๋ฉ๋ผ ํผ๋ ๋ฐ ์๊ฒฉ ์กฐ์ ์ํ๋ฅผ ํฌํจํ ๋ชจ๋ฌ๋ฆฌํฐ ์ ๋ฐ์ ๊ฑธ์ณ ๋ก๋ด ๊ณตํ ๋ฐ์ดํฐ์ ๋ํ ํตํฉ๋๊ณ ํธ๋ฆฌํ ์ก์ธ์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ํ ๋น์ฌ์ ๋ฐ์ดํฐ์
ํ์์ ์์ง๋๋ ๋ฐ์ดํฐ ๋ฐฉ์์ ๋ํ ์ผ๋ฐ ์ ๋ณด(๋ฉํ๋ฐ์ดํฐ)๋ฅผ ์ ์ฅํ๋ฉฐ, ์ํ๋๋ ์์
์ ๋ํ ํ
์คํธ ์ค๋ช
, ์ฌ์ฉ๋ ๋ก๋ด ์ข
๋ฅ ๋ฐ ์ด๋ฏธ์ง์ ๋ก๋ด ์ํ ์คํธ๋ฆผ์ด ์ํ๋ง๋๋ ์ด๋น ํ๋ ์๊ณผ ๊ฐ์ ์ธก์ ์ธ๋ถ ์ ๋ณด๊ฐ ํฌํจ๋ฉ๋๋ค.
๋ฉํ๋ฐ์ดํฐ๋ Hugging Face Hub์์ ๋ก๋ด ๊ณตํ ๋ฐ์ดํฐ์
์ ์ธ๋ฑ์ฑํ๊ณ ๊ฒ์ํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค!
Hugging Face์์ ๊ฐ๋ฐ ์ค์ธ ๋ก๋ด ๊ณตํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ lerobot ๋ด์์ LeRobotDataset์ ๋ค์ค ๋ชจ๋ฌ, ์๊ณ์ด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ํตํฉ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ฉฐ, Hugging Face ๋ฐ Pytorch ์ํ๊ณ์ ์ํํ๊ฒ ํตํฉ๋ฉ๋๋ค.
์ด ๋ฐ์ดํฐ์
ํ์์ ์ฝ๊ฒ ํ์ฅ ๋ฐ ์ฌ์ฉ์ ์ ์ํ ์ ์๋๋ก ์ค๊ณ๋์์ผ๋ฉฐ, SO-100 ํ ๋ฐ ALOHA-2 ์ค์ ๊ณผ ๊ฐ์ ์กฐ์๊ธฐ ํ๋ซํผ, ์ค์ ํด๋จธ๋
ธ์ด๋ ๋ฐ์ดํฐ, ์๋ฎฌ๋ ์ด์
๋ฐ์ดํฐ์
, ์ฌ์ง์ด ์์จ ์ฃผํ ์๋์ฐจ ๋ฐ์ดํฐ๊น์ง ๊ด๋ฒ์ํ ์ค์ฒด์์ ๊ณต๊ฐ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฐ์ดํฐ์
์ ์ด๋ฏธ ์ง์ํฉ๋๋ค!
๋ฐ์ดํฐ์
์๊ฐํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ปค๋ฎค๋ํฐ๊ฐ ๊ธฐ์ฌํ ํ์ฌ ๋ฐ์ดํฐ์
์ ํ์ํ ์ ์์ต๋๋ค! ๐
์ด LeRobotDataset์ ์ ๋ฆด๋ฆฌ์ค๋ ๊ท๋ชจ ์ธ์๋ ์คํธ๋ฆฌ๋ฐ ๊ธฐ๋ฅ์ ์ง์ํ์ฌ ๋์คํฌ์ ์ง๋์น๊ฒ ํฐ ๋ฐ์ดํฐ ๋ชจ์์ ๋ค์ด๋ก๋ํ ํ์ ์์ด ๋๊ท๋ชจ ๋ฐ์ดํฐ์
์์ ์ฆ์์ผ๋ก ๋ฐ์ดํฐ ๋ฐฐ์น๋ฅผ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์ ์ฉ StreamingLeRobotDataset ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ v3.0์ ๋ชจ๋ ๋ฐ์ดํฐ์
์ ์คํธ๋ฆฌ๋ฐ ๋ชจ๋๋ก ์ก์ธ์คํ๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค!
์คํธ๋ฆฌ๋ฐ ๋ฐ์ดํฐ์
์ ๋ก๋ด ํ์ต์ ๋ํ ์ก์ธ์ค๋ฅผ ๋์ด๋ ๋ฐ ์ค์ํ ์ด์ ํ์ด๋ฉฐ, ์ปค๋ฎค๋ํฐ์ ๊ณต์ ํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค ๐ค
lerobot ์ค์น ๋ฐ ๋ฐ์ดํฐ์
๊ธฐ๋ก
lerobot์ Hugging Face์์ ๊ฐ๋ฐํ ์๋ ํฌ ์๋ ๋ก๋ด ๊ณตํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ์ค์ ๋ก๋ด ๊ณตํ ๋ฐ ์ต์ฒจ๋จ ๋ก๋ด ํ์ต ์๊ณ ๋ฆฌ์ฆ์ ์ง์ํฉ๋๋ค.
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ค์ ๋ก๋ด์์ ๋ก์ปฌ๋ก ๋ฐ์ดํฐ์
์ ์ง์ ๊ธฐ๋กํ๊ณ Hugging Face Hub์ ๋ฐ์ดํฐ์
์ ์ ์ฅํ ์ ์์ต๋๋ค.
ํ์ฌ ์ง์ํ๋ ๋ก๋ด์ ๋ํด ์ฌ๊ธฐ์์ ์์ธํ ์์๋ณผ ์ ์์ต๋๋ค!
LeRobotDataset:v3์ lerobot ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ผ๋ถ๋ก lerobot-v0.4.0๋ถํฐ ์ ๊ณต๋ ์์ ์ด๋ฉฐ, ์ปค๋ฎค๋ํฐ์ ์กฐ๊ธฐ์ ๊ณต์ ํ๊ฒ ๋์ด ๋งค์ฐ ๊ธฐ์ฉ๋๋ค. ๋ค์ PyPI๋ฅผ ์ฌ์ฉํ์ฌ ์ด ์ ๋ฐ์ดํฐ์
ํ์์ ์ง์ํ๋ ์ต์ lerobot-v0.3.x๋ฅผ ์ง์ ์ค์นํ ์ ์์ต๋๋ค:
pip install "https://github.com/huggingface/lerobot/archive/33cad37054c2b594ceba57463e8f11ee374fa93c.zip" # This will affect your local lerobot installation!
์ปค๋ฎค๋ํฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ ์ ์ธ ๋ฆด๋ฆฌ์ค๋ฅผ ํฅํ ์งํ ์ํฉ์ ์ฌ๊ธฐ์์ ํ๋ก์ฐํ์ธ์ ๐ค
์ ๋ฐ์ดํฐ์ ํ์์ ์ง์ํ๋ lerobot ๋ฒ์ ์ ์ค์นํ ํ์๋ ๋ค์๊ณผ ๊ฐ์ ์ง์นจ๊ณผ ํจ๊ป ์๊ฒฉ ์กฐ์์ ์ฌ์ฉํ์ฌ ์๊ทธ๋์ฒ ๋ก๋ด ํ์ธ SO-101๋ก ๋ฐ์ดํฐ์ ์ ๊ธฐ๋กํ ์ ์์ต๋๋ค:
lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/tty.usbmodem585A0076841 \
--robot.id=my_awesome_follower_arm \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 1920, height: 1080, fps: 30}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/tty.usbmodem58760431551 \
--teleop.id=my_awesome_leader_arm \
--display_data=true \
--dataset.repo_id=${HF_USER}/record-test \
--dataset.num_episodes=5 \
--dataset.single_task="Grab the black cube"
์ฌ์ฉ ์ฌ๋ก์ ๋ํ ๋ฐ์ดํฐ์ ๊ธฐ๋ก ๋ฐฉ๋ฒ์ ๋ณด๋ ค๋ฉด ๊ณต์ ๋ฌธ์๋ก ์ด๋ํ์ธ์.
(์๋ก์ด) ํ์ ๋์์ธ
LeRobotDataset์ ํต์ฌ ๋์์ธ ์ ํ์ ๊ธฐ๋ณธ ๋ฐ์ดํฐ ์ ์ฅ๊ณผ ์ฌ์ฉ์ ๋๋ฉด API๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์
๋๋ค.
์ด๋ฅผ ํตํด ํจ์จ์ ์ธ ์ง๋ ฌํ ๋ฐ ์ ์ฅ๊ณผ ๋์์ ๋ฐ์ดํฐ๋ฅผ ์ง๊ด์ ์ด๊ณ ์ฆ์ ์ฌ์ฉํ ์ ์๋ ํ์์ผ๋ก ์ ๊ณตํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ์
์ ์ธ ๊ฐ์ง ์ฃผ์ ๊ตฌ์ฑ ์์๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- ํ
์ด๋ธ ๋ฐ์ดํฐ: ์กฐ์ธํธ ์ํ ๋ฐ ์ก์
๊ณผ ๊ฐ์ ์ ์ฐจ์, ๊ณ ๋น๋ ๋ฐ์ดํฐ๋ ํจ์จ์ ์ธ Apache Parquet ํ์ผ์ ์ ์ฅ๋๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์ฑ์ํ
datasets๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์คํ๋ก๋๋์ด ๋น ๋ฅด๊ณ ๋ฉ๋ชจ๋ฆฌ ๋งคํ๋ ์ก์ธ์ค ๋๋ ์คํธ๋ฆฌ๋ฐ ๊ธฐ๋ฐ ์ก์ธ์ค๋ฅผ ์ ๊ณตํฉ๋๋ค. - ์๊ฐ ๋ฐ์ดํฐ: ๋๋์ ์นด๋ฉ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํ๋ ์์ด ์ฐ๊ฒฐ๋๊ณ MP4 ํ์ผ๋ก ์ธ์ฝ๋ฉ๋ฉ๋๋ค. ๋์ผํ ์ํผ์๋์ ํ๋ ์์ ํญ์ ๋์ผํ ๋น๋์ค๋ก ๊ทธ๋ฃนํ๋๋ฉฐ, ์ฌ๋ฌ ๋น๋์ค๋ ์นด๋ฉ๋ผ๋ณ๋ก ๊ทธ๋ฃนํ๋ฉ๋๋ค. ํ์ผ ์์คํ ์ ๋ํ ์คํธ๋ ์ค๋ฅผ ์ค์ด๊ธฐ ์ํด ๋์ผํ ์นด๋ฉ๋ผ ๋ณด๊ธฐ์ ๋ํ ๋น๋์ค ๊ทธ๋ฃน๋ ์ฌ๋ฌ ํ์ ๋๋ ํ ๋ฆฌ๋ก ๋๋ฉ๋๋ค.
- ๋ฉํ๋ฐ์ดํฐ: ๋ฐ์ดํฐ์ ํ ์ด๋ธ ๋ฐ ์๊ฐ์ ์ฐจ์์ ๋ํ ๊ด๊ณํ ๋์ ์ญํ ์ ํ๋ ๋ฐ์ดํฐ์ ์ ๊ตฌ์กฐ๋ฅผ ์ค๋ช ํ๋ JSON ํ์ผ ๋ชจ์์ ๋๋ค. ๋ฉํ๋ฐ์ดํฐ์๋ ๋ค์ํ ๊ธฐ๋ฅ ์คํค๋ง, ํ๋ ์ ์๋, ์ ๊ทํ ํต๊ณ ๋ฐ ์ํผ์๋ ๊ฒฝ๊ณ๊ฐ ํฌํจ๋ฉ๋๋ค.

์ ์ฌ์ ์ผ๋ก ์๋ฐฑ๋ง ๊ฐ์ ์ํผ์๋(์์ต/์์ญ์ต ๊ฐ์ ๊ฐ๋ณ ํ๋ ์์ผ๋ก ์ด์ด์ง)๊ฐ ํฌํจ๋ ์ ์๋ ๋ฐ์ดํฐ์ ์ ์ง์ํ๊ธฐ ์ํด ๋ค๋ฅธ ์ํผ์๋์ ๋ฐ์ดํฐ๋ฅผ ๋์ผํ ๋์ ์์ค์ ๊ตฌ์กฐ๋ก ๋ณํฉํฉ๋๋ค. ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ ์ฃผ์ด์ง ํ ์ด๋ธ ์ปฌ๋ ์ ๊ณผ ๋น๋์ค๊ฐ ๋จ์ผ ์ํผ์๋์ ๋ํ ์ ๋ณด๋ง ํฌํจํ๋ ๊ฒ์ด ์๋๋ผ ์ฌ๋ฌ ์ํผ์๋์์ ์ฌ์ฉ ๊ฐ๋ฅํ ์ ๋ณด์ ์ฐ๊ฒฐ์ ํฌํจํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ด๋ ๋ก์ปฌ ๋ฐ Hugging Face์ ๊ฐ์ ์๊ฒฉ ์ ์ฅ์ ์ ๊ณต ์ ์ฒด ๋ชจ๋์์ ํ์ผ ์์คํ ์ ๋ํ ์๋ ฅ์ ๊ด๋ฆฌ ๊ฐ๋ฅํ๊ฒ ์ ์งํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ์ฌ ํน์ ์ํผ์๋ ์ ๋ณด, ์๋ฅผ ๋ค์ด ์ฃผ์ด์ง ์ํผ์๋๊ฐ ํน์ ๋น๋์ค์์ ์์ํ๊ฑฐ๋ ๋๋๋ ํ์์คํฌํ๋ฅผ ์์งํ ์ ์์ต๋๋ค.
๋ฐ์ดํฐ์ ์ ๋ค์๊ณผ ๊ฐ์ ๋ฆฌํฌ์งํ ๋ฆฌ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
meta/info.json: ์ค์ ๋ฉํ๋ฐ์ดํฐ ํ์ผ์ ๋๋ค. ๋ชจ๋ ๊ธฐ๋ฅ(์:observation.state,action), ํด๋น ๋ชจ์ ๋ฐ ๋ฐ์ดํฐ ์ ํ์ ์ ์ํ๋ ์ ์ฒด ๋ฐ์ดํฐ์ ์คํค๋ง๋ฅผ ํฌํจํฉ๋๋ค. ๋ํ ๋ฐ์ดํฐ ๋ฐ ๋น๋์ค ํ์ผ์ ์ฐพ๊ธฐ ์ํ ๊ฒฝ๋ก ํ ํ๋ฆฟ, ๋ฐ์ดํฐ์ ์ ์ด๋น ํ๋ ์(fps), ์ฝ๋๋ฒ ์ด์ค ๋ฒ์ ๊ณผ ๊ฐ์ ์ค์ํ ์ ๋ณด๋ ์ ์ฅํฉ๋๋ค.meta/stats.json: ์ ์ฒด ๋ฐ์ดํฐ์ ์์ ๊ฐ ๊ธฐ๋ฅ์ ์ง๊ณ ํต๊ณ(ํ๊ท , ํ์ค ํธ์ฐจ, ์ต์, ์ต๋)๋ฅผ ์ ์ฅํฉ๋๋ค. ์ด๋ ๋ฐ์ดํฐ ์ ๊ทํ์ ์ฌ์ฉ๋๋ฉฐdataset.meta.stats๋ฅผ ํตํด ์ก์ธ์คํ ์ ์์ต๋๋ค.meta/tasks.jsonl: ์์ฐ์ด ์์ ์ค๋ช ๊ณผ ์ ์ ์์ ์ธ๋ฑ์ค ๊ฐ์ ๋งคํ์ ํฌํจํ๋ฉฐ, ์ด๋ ์์ ์กฐ๊ฑด๋ถ ์ ์ฑ ํ๋ จ์ ์ฌ์ฉ๋ฉ๋๋ค.meta/episodes/: ์ด ๋๋ ํ ๋ฆฌ์๋ ๊ธธ์ด, ํด๋น ์์ ๋ฐ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ์์น์ ๋ํ ํฌ์ธํฐ์ ๊ฐ์ ๊ฐ ๊ฐ๋ณ ์ํผ์๋์ ๋ํ ๋ฉํ๋ฐ์ดํฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ํ์ฅ์ฑ์ ์ํด ์ด ์ ๋ณด๋ ๋จ์ผ ๋ํ JSON ํ์ผ์ด ์๋ ์ฒญํฌํ๋ Parquet ํ์ผ์ ์ ์ฅ๋ฉ๋๋ค.data/: Parquet ํ์ผ์ ์๋ ํต์ฌ ํ๋ ์๋ณ ํ ์ด๋ธ ๋ฐ์ดํฐ๋ฅผ ํฌํจํฉ๋๋ค. ์ฑ๋ฅ์ ๊ฐ์ ํ๊ณ ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ๋ฌ ์ํผ์๋์ ๋ฐ์ดํฐ๊ฐ ๋ ํฐ ํ์ผ๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค. ํ์ผ ํฌ๊ธฐ๋ฅผ ๊ด๋ฆฌ ๊ฐ๋ฅํ๊ฒ ์ ์งํ๊ธฐ ์ํด ์ด๋ฌํ ํ์ผ์ ์ฒญํฌํ๋ ํ์ ๋๋ ํ ๋ฆฌ์ ๊ตฌ์ฑ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋จ์ผ ํ์ผ์๋ ์ผ๋ฐ์ ์ผ๋ก ํ๋ ์ด์์ ์ํผ์๋์ ๋ํ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ฉ๋๋ค.videos/: ๋ชจ๋ ์๊ฐ์ ๊ด์ฐฐ ์คํธ๋ฆผ์ ๋ํ MP4 ๋น๋์ค ํ์ผ์ ํฌํจํฉ๋๋ค.data/๋๋ ํ ๋ฆฌ์ ์ ์ฌํ๊ฒ ์ฌ๋ฌ ์ํผ์๋์ ๋น๋์ค ์์์ด ๋จ์ผ MP4 ํ์ผ๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค. ์ด ์ ๋ต์ ์ต์ ํ์ผ ์์คํ ์ ๋ ํจ์จ์ ์ธ ๋ฐ์ดํฐ์ ์ ํ์ผ ์๋ฅผ ํฌ๊ฒ ์ค์ ๋๋ค. ๊ฒฝ๋ก ๊ตฌ์กฐ(/videos/<camera_key>/<chunk>/file_...mp4)๋ฅผ ํตํด ๋ฐ์ดํฐ ๋ก๋๋ ์ฌ๋ฐ๋ฅธ ๋น๋์ค ํ์ผ์ ์ฐพ๊ณ ์ง์ ๋ ํ๋ ์์ ๋ํ ์ ํํ ํ์์คํฌํ๋ก ํ์ํ ์ ์์ต๋๋ค.
v2.1 ๋ฐ์ดํฐ์
์ v3.0์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์
LeRobotDataset:v3.0์ lerobot-v0.4.0๊ณผ ํจ๊ป ๋ฆด๋ฆฌ์ค๋ ์์ ์ด๋ฉฐ, Hugging Face Hub์ ํ์ฌ ํธ์คํ
๋ ๋ชจ๋ ๋ฐ์ดํฐ์
์ ์ v3.0์ผ๋ก ์ฝ๊ฒ ๋ณํํ ์ ์์ต๋๋ค.
python -m lerobot.datasets.v30.convert_dataset_v21_to_v30--repo-id=<HFUSER/DATASET_ID>
์ด ์ ํ์์ ์ปค๋ฎค๋ํฐ์ ์กฐ๊ธฐ์ ๊ณต์ ํ๊ฒ ๋์ด ๋งค์ฐ ๊ธฐ์ฉ๋๋ค! lerobot-v0.4.0์ ๊ฐ๋ฐํ๋ ๋์ ์ต์ lerobot-v0.3.x๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์
์ ์๋ก ์
๋ฐ์ดํธ๋ ๋ฒ์ ์ผ๋ก ๊ณ์ ๋ณํํ ์ ์์ผ๋ฉฐ, ์ด๋ ๋ค์ PyPI๋ฅผ ํตํด ์ง์ ์ง์๋ฉ๋๋ค.
pip install "https://github.com/huggingface/lerobot/archive/33cad37054c2b594ceba57463e8f11ee374fa93c.zip" # This will affect your local lerobot installation!
python -m lerobot.datasets.v30.convert_dataset_v21_to_v30 --repo-id=<HFUSER/DATASET_ID>
์ด๋ ์ฌ์ ๋ฆด๋ฆฌ์ค์ด๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ๋ถ์์ ํ ๋ฒ์ ์์ ์ฐธ๊ณ ํ์ธ์. ๋ค์ ์์ ์ ์ธ ๋ฆด๋ฆฌ์ค ๊ฐ๋ฐ ์ํ๋ฅผ ์ฌ๊ธฐ์์ ํ๋ก์ฐํ ์ ์์ต๋๋ค!
๋ณํ ์คํฌ๋ฆฝํธ convert_dataset_v21_to_v30.py๋ ์ฌ๋ฌ ์ํผ์๋ episode-0000.mp4, episode-0001.mp4, episode-0002.mp4, .../episode-0000.parquet, episode-0001.parquet, episode-0002.parquet, episode-0003.parquet, ...๋ฅผ ๋จ์ผ ํ์ผ file-0000.mp4/file-0000.parquet๋ก ์ง๊ณํ๊ณ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ ์
๋ฐ์ดํธํ์ฌ ์์ ์์ค ํ์ผ์์ ํน์ ์ํผ์๋ ์ ๋ณด๋ฅผ ๊ฒ์ํ ์ ์๋๋ก ํฉ๋๋ค.
์ฝ๋ ์์ : LeRobotDataset์ torch.utils.data.DataLoader์ ํจ๊ป ์ฌ์ฉ
์ธ ๊ฐ์ง ์ฃผ์ ๊ธฐ๋ฅ(ํ ์ด๋ธ ๋ฐ ์๊ฐ ๋ฐ์ดํฐ, ๊ด๊ณํ ๋ฉํ๋ฐ์ดํฐ)์ ๋ชจ๋ ํฌํจํ๋ Hugging Face Hub์ ๋ชจ๋ ๋ฐ์ดํฐ์ ์ ํ ์ค๋ก ์ก์ธ์คํ ์ ์์ต๋๋ค.
๊ฐํ ํ์ต(RL) ๋๋ ํ๋ ๋ณต์ (BC)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋๋ถ๋ถ์ ๋ก๋ด ํ์ต ์๊ณ ๋ฆฌ์ฆ์ ๊ด์ฐฐ ๋ฐ ํ๋ ์คํ์์ ์๋ํ๋ ๊ฒฝํฅ์ด ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, RL ์๊ณ ๋ฆฌ์ฆ์ ์ผ๋ฐ์ ์ผ๋ก ์ด์ ๊ด์ฐฐ์ ๊ธฐ๋ก o_{t-H_o:t}์ ์ฌ์ฉํ๊ณ ,
BC ์๊ณ ๋ฆฌ์ฆ์ ๋์ ์ฌ๋ฌ ํ๋์ ์ฒญํฌ๋ฅผ ํ๊ทํ๋๋ก ํ๋ จ๋ฉ๋๋ค.
๋ก๋ด ํ์ต ํ๋ จ์ ํน์ ์ฌํญ์ ์์ฉํ๊ธฐ ์ํด LeRobotDataset์ ๊ธฐ๋ณธ ์ฐฝ ์ฐ์ฐ๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ด๋ฅผ ํตํด delta_timestamps ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ๊ด์ฐฐ ์ด์ ๋ฐ ์ดํ์ ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
ํธ๋ฆฌํ๊ฒ๋ LeRobotDataset์ PyTorch DataLoader์ ํจ๊ป ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ์
์ ๊ฐ๋ณ ์ํ ์ฌ์ ๋ชจ์์ ์๋์ผ๋ก ์ผ๊ด ํ
์์ ๋จ์ผ ์ฌ์ ์ผ๋ก ์ง๊ณํ ์ ์์ต๋๋ค.
from lerobot.datasets.lerobot_dataset import LeRobotDataset
repo_id = "yaak-ai/L2D-v3"
# Hugging Face Hub์์ ๋ก๋ (๋ก์ปฌ์ ์บ์๋จ)
dataset = LeRobotDataset(repo_id)
# ์ธ๋ฑ์ค๋ก ๋ฐ์ดํฐ์
์ 100๋ฒ์งธ ํ๋ ์ ๊ฐ์ ธ์ค๊ธฐ
sample = dataset[100]
print(sample)
# ์ํ์ ํ
์ ์ฌ์ ์
๋๋ค.
# {
# 'observation.state': tensor([...]),
# 'action': tensor([...]),
# 'observation.images. front_left': tensor([C, H, W]),
# 'timestamp': tensor(1.234),
# ...
# }
delta_timestamps = {
"observation.images.front_left": [-0.2, -0.1, 0.0] # ๊ด์ฐฐ ์ 0.2 ๋ฐ 0.1์ด
}
dataset = LeRobotDataset(
repo_id
delta_timestamps=delta_timestamps
)
# ์ด์ ์ธ๋ฑ์ค์ ์ก์ธ์คํ๋ฉด ์ง์ ๋ ํค์ ๋ํ ํ๋ ์ ์คํ์ด ๋ฐํ๋ฉ๋๋ค.
sample = dataset[100]
# ์ด๋ฏธ์ง ํ
์์ ์ด์ ์๊ฐ ์ฐจ์์ด ์์ต๋๋ค.
# 'observation.images.wrist_camera'๋ T=3์ธ [T, C, H, W] ํํ์
๋๋ค.
print(sample['observation.images.front_left'].shape)
batch_size=16
# ํ๋ จ ๋ชฉ์ ์ผ๋ก ๋ฐฐ์น๋ก ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ฐ์ดํฐ์
์ DataLoader๋ก ๋ํํฉ๋๋ค.
data_loader = torch.utils.data.DataLoader(
dataset,
batch_size=batch_size
)
# 3. ํ๋ จ ๋ฃจํ์์ DataLoader๋ฅผ ๋ฐ๋ณตํฉ๋๋ค.
num_epochs = 1
device = "cuda" if torch.cuda.is_available() else "cpu"
for epoch in range(num_epochs):
for batch in data_loader:
# 'batch'๋ ๊ฐ ๊ฐ์ด ํ
์ ๋ฐฐ์น์ธ ์ฌ์ ์
๋๋ค.
# ์๋ฅผ ๋ค์ด, batch['action']์ [32, action_dim] ํํ๊ฐ ๋ฉ๋๋ค.
# delta_timestamps๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฐฐ์น ์ด๋ฏธ์ง ํ
์์
# ํํ๋ [32, T, C, H, W]๊ฐ ๋ ์ ์์ต๋๋ค.
# ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ ์ฅ์น(์: GPU)๋ก ์ด๋ํฉ๋๋ค.
observations = batch['observation.state.vehicle'].to(device)
actions = batch['action.continuous'].to(device)
images = batch['observation.images.front_left'].to(device)
# ๋ค์์ผ๋ก amazing_model.forward(batch)๋ฅผ ์ํํฉ๋๋ค.
...
์คํธ๋ฆฌ๋ฐ
๋ฐ์ดํฐ์
์ ๋ก์ปฌ์ ๋ค์ด๋ก๋ํ์ง ์๊ณ v3.0 ํ์์ ๋ชจ๋ ๋ฐ์ดํฐ์
์ ์คํธ๋ฆฌ๋ฐ ๋ชจ๋๋ก ์ฌ์ฉํ ์๋ ์์ต๋๋ค. StreamingLeRobotDataset ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
from lerobot.datasets.streaming_dataset import StreamingLeRobotDataset
# ๋ฐ์ดํฐ์
์ ๋์คํฌ์ ๋ค์ด๋ก๋ํ๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ์ง ์๊ณ Hugging Face Hub์์ ์ง์ ์คํธ๋ฆฌ๋ฐ
repo_id = "yaak-ai/L2D-v3"
dataset = StreamingLeRobotDataset(repo_id)
๊ฒฐ๋ก
LeRobotDataset v3.0์ LeRobot์์ ์ง์ํ๋ ๋ก๋ด ๊ณตํ ๋ฐ์ดํฐ์
์ ํ์ฅํ๊ธฐ ์ํ ๋๋ค๋์
๋๋ค. ๋๊ท๋ชจ ๋ก๋ด ๋ฐ์ดํฐ ๋ชจ์์ ์ ์ฅํ๊ณ ์ก์ธ์คํ๋ ํ์์ ์ ๊ณตํจ์ผ๋ก์จ ๋ก๋ด ๊ณตํ์ ๋ฏผ์ฃผํํ๋ ๋ฐ ์ง์ ์ ์ด๋ฃจ๊ณ ์์ผ๋ฉฐ, ์ปค๋ฎค๋ํฐ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ํ ๋ค์ด๋ก๋ํ์ง ์๊ณ ๋ ์๋ฐฑ๋ง ๊ฐ์ ์ํผ์๋์ ๋ํด ํ๋ จํ ์ ์๋๋ก ํฉ๋๋ค!
์ต์ lerobot-v0.3.x๋ฅผ ์ค์นํ์ฌ ์ ๋ฐ์ดํฐ์
ํ์์ ์ฌ์ฉํด ๋ณผ ์ ์์ผ๋ฉฐ, GitHub ๋๋ Discord ์๋ฒ์์ ํผ๋๋ฐฑ์ ๊ณต์ ํด ์ฃผ์ธ์! ๐ค
๊ฐ์ฌ
LeRobotDataset:v3 ๊ฐ๋ฐ ์ค ๊ท์คํ ์ง์๊ณผ ํผ๋๋ฐฑ์ ์ ๊ณตํด ์ค fantastic yaak.ai ํ์๊ฒ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. Hugging Face Hub์์ ํด๋น ์กฐ์ง์ ํ๋ก์ฐํ์ธ์! ์ฐ๋ฆฌ๋ ํญ์ ์ปค๋ฎค๋ํฐ์ ํ๋ ฅํ๊ณ ์ด๊ธฐ ๊ธฐ๋ฅ์ ๊ณต์ ํ๊ธฐ๋ฅผ ์ํฉ๋๋ค. ํ์ ์ ์ํ์๋ฉด ๋ฌธ์ํด ์ฃผ์ธ์ ๐
์๋ฌธ ์ถ์ฒ: https://huggingface.co/blog/lerobot-datasets-v3
๋๊ธ
๋๊ธ ์ฐ๊ธฐ