LeRobot documentation
LeRobotDataset v3.0
LeRobotDataset v3.0
LeRobotDataset v3.0, robot öğrenme verileri için standart bir biçimdir. Çok modlu zaman serisi verilerine, sensomotor sinyallere ve çoklu kamera videolarına birleşik erişim sağlar; ayrıca Hugging Face Hub üzerinde indeksleme, arama ve görselleştirme için zengin meta veriler sunar.
Bu biçimdeki bir veri setinin düzeni hakkında okumadan önce ne içerdiğini görmek için birini LeRobot Dataset Visualizer'da açın: kamera kayıtları, senkronize durum ve eylem grafikleri ve her bölüm, tarayıcıda. Explore a Dataset in the Browser'a bakın.
Bu belgeler sizi şunlara yönlendirecektir:
- v3.0 tasarımını ve dizin düzenini anlama
- Bir veri seti kaydedin ve Hub'a gönderin
- Eğitim için veri setlerini
LeRobotDatasetile yükleyin - İndirmeden
StreamingLeRobotDatasetkullanarak veri kümelerini akış olarak kullanın - Eğitim sırasında veri artırma için görüntü dönüşümleri uygulayın
- Mevcut
v2.1veri setleriniv3.0sürümüne taşıma - Lance gibi diğer
LeRobotDatasetbiçimleri ve uygulamalarıyla deneyler yapın
v3'te yenilikler
- Dosya tabanlı depolama: Parquet/MP4 dosyası başına birçok bölüm (v2, bölüm başına bir dosya kullanıyordu).
- İlişkisel meta veriler: Bölüm sınırları ve aramalar, dosya adları yerine meta veriler üzerinden çözümlenir.
- Hub yerel akış:
StreamingLeRobotDatasetile veri setlerini doğrudan Hub'dan tüketin. - Daha düşük dosya sistemi baskısı: Daha az, daha büyük dosyalar ⇒ daha hızlı başlatma ve ölçeklendirmede daha az sorun.
- Birleşik organizasyon: Veri ve videolar arasında tutarlı yol şablonlarına sahip temiz dizin düzeni.
- Veri seti depolama arka uçları: Veri setleri, nesne depolamadan doğrudan rastgele erişim ve indeksleme için LanceDB tabloları olarak da depolanabilir (bkz. LanceDB veri seti arka ucu).
Kurulum
LeRobotDataset v3.0, lerobot >= 0.4.0 sürümünde yer alır. Yüklemek için Yükleme Kılavuzu'nu izleyin.
Bir veri seti kaydet
SO-101 ile bir veri seti kaydetmek ve Hub'a göndermek için aşağıdaki komutu çalıştırın:
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" \
--dataset.streaming_encoding=true \
--dataset.encoder_threads=2
# Optional: --dataset.rgb_encoder.vcodec=autoDaha fazla ayrıntı için kayıt kılavuzuna bakın.
Biçim tasarımı
v3'ün temel ilkelerinden biri depolamayı kullanıcı API'sinden ayırmaktır: veriler verimli bir şekilde (az sayıda büyük dosya) saklanırken, genel API sezgisel bir bölüm düzeyinde erişim sunar.
v3 üç sütuna dayanır:
- Tablo verileri: Apache Parquet içinde saklanan düşük boyutlu, yüksek frekanslı sinyaller (durumlar, eylemler, zaman damgaları). Erişim,
datasetsyığını üzerinden bellek eşlemeli (memory-mapped) veya akış (streamed) olarak yapılır. - Görsel veriler: Kamera kareleri birleştirilip MP4 formatında kodlanır. Aynı epizottan gelen kareler gruplanır; videolar, pratik boyutlar için kamera başına parçalara ayrılır.
- Meta veriler: Şema (özellik adları, dtypes, şekiller), kare hızları, normalizasyon istatistikleri ve epot bölümlemesi (ortak Parquet/MP4 dosyalarına yönelik başlangıç/bitiş ofsetleri) hakkında bilgi veren JSON/Parquet kayıtları.
Milyonlarca epizoda ölçeklenmek için, birden fazla epizottan gelen tablo satırları ve video kareleri birleştirilerek daha büyük dosyalara aktarılır. Epizota özgü görünümler, dosya sınırları yerine meta veriler aracılığıyla yeniden oluşturulur.
Dizin düzeni (basitleştirilmiş)
meta/info.json: kanonik şema (özellikler, şekiller/tipler), FPS, kod tabanı sürümü ve veri/video parçalarını bulmak için yol şablonları.meta/stats.json: normalizasyon için kullanılan küresel özellik istatistikleri (ortalama/std/min/max);dataset.meta.statsolarak sunulur.meta/tasks.parquet: görev koşullu politikalar için tam sayı kimliklerine eşlenmiş doğal dil görev tanımları.meta/episodes/: ölçeklenebilirlik için chunked Parquet olarak saklanan bölüm başına kayıtlar (uzunluklar, görevler, ofsetler).data/: kare kare Parquet parçaları; her dosya genellikle çok sayıda bölüm içerir.videos/: kamera başına MP4 parçaları; her dosya genellikle çok sayıda bölüm içerir.
Eğitim için bir veri seti yükleyin
LeRobotDataset, PyTorch tensörlerinden oluşan Python sözlükleri döndürür ve torch.utils.data.DataLoader ile entegre çalışır. Kullanımını gösteren bir kod örneği aşağıdadır:
import torch
from lerobot.datasets import LeRobotDataset
repo_id = "yaak-ai/L2D-v3"
# 1) Load from the Hub (cached locally)
dataset = LeRobotDataset(repo_id)
# 2) Random access by index
sample = dataset[100]
print(sample)
# {
# 'observation.state': tensor([...]),
# 'action': tensor([...]),
# 'observation.images.front_left': tensor([C, H, W]),
# 'timestamp': tensor(1.234),
# ...
# }
# 3) Temporal windows via delta_timestamps (seconds relative to t)
delta_timestamps = {
"observation.images.front_left": [-0.2, -0.1, 0.0] # 0.2s and 0.1s before current frame
}
dataset = LeRobotDataset(repo_id, delta_timestamps=delta_timestamps)
# Accessing an index now returns a stack for the specified key(s)
sample = dataset[100]
print(sample["observation.images.front_left"].shape) # [T, C, H, W], where T=3
# 4) Wrap with a DataLoader for training
batch_size = 16
data_loader = torch.utils.data.DataLoader(dataset, batch_size=batch_size)
device = "cuda" if torch.cuda.is_available() else "cpu"
for batch in data_loader:
observations = batch["observation.state"].to(device)
actions = batch["action"].to(device)
images = batch["observation.images.front_left"].to(device)
# model.forward(batch)Eğitim sırasında bir veri setini akıt
Önce veri setinin Parquet ve video dosyalarını indirmeden eğitim yapmak için --dataset.streaming=true ayarlayın. Epizodlar, sınırlı bir bellek içi havuza anlık olarak getirilir ve seçilen her kare, her epokta tam olarak bir kez ziyaret edilir:
lerobot-train \
--dataset.repo_id=yaak-ai/L2D-v3 \
--dataset.streaming=true \
--policy.type=act \
--output_dir=outputs/train/act_streamingAynı okuyucu, Python için, Hub veri kümeleri için ve HF Storage Bucket içinde saklanan veri kümeleri için kullanılabilir:
from lerobot.datasets import StreamingLeRobotDataset
dataset = StreamingLeRobotDataset("yaak-ai/L2D-v3")
bucket_dataset = StreamingLeRobotDataset("my-org/my-bucket", repo_type="bucket")CLI'den --dataset.repo_type=bucket veya --dataset.root=hf://buckets/my-org/my-bucket ile bir bucket seçin.
İşçilerin ve parçaların (shard) akış eşzamanlılığına, MP4 yan dizin dosyasına (sidecar index), bellek ayarlarına, devam etme ve sorun giderme konularına nasıl eşlendiğini görmek için Eğitim Veri Seti Akışı bölümüne bakın.
Görüntü dönüşümleri
Görüntü dönüşümleri, modelin dayanıklılığını ve genelleme yeteneğini artırmak için eğitim sırasında kamera karelerine uygulanan veri artırma yöntemleridir. LeRobot; parlaklık, kontrast, doygunluk, ton ve keskinlik ayarları dahil olmak üzere çeşitli dönüşümleri destekler.
Veri seti oluşturma/kayıt sırasında dönüştürme kullanma
Şu anda dönüşümler yalnızca eğitim sırasında uygulanır, kayıt sırasında değil. Bir veri seti oluştururken veya kaydederken, ham görüntüler dönüşümler olmadan saklanır. Bu sayede, verileri yeniden kaydetmeden daha sonra farklı artırma yöntemleriyle deney yapabilirsiniz.
Mevcut veri setlerine dönüştürme ekleme (API)
Eğitim için bir veri seti yüklerken image_transforms parametresini kullanın:
from lerobot.datasets import LeRobotDataset
from lerobot.transforms import ImageTransforms, ImageTransformsConfig, ImageTransformConfig
# Option 1: Use default transform configuration (disabled by default)
transforms_config = ImageTransformsConfig(
enable=True, # Enable transforms
max_num_transforms=3, # Apply up to 3 transforms per frame
random_order=False, # Apply in standard order
)
transforms = ImageTransforms(transforms_config)
dataset = LeRobotDataset(
repo_id="your-username/your-dataset",
image_transforms=transforms
)
# Option 2: Create custom transform configuration
custom_transforms_config = ImageTransformsConfig(
enable=True,
max_num_transforms=2,
random_order=True,
tfs={
"brightness": ImageTransformConfig(
weight=1.0,
type="ColorJitter",
kwargs={"brightness": (0.7, 1.3)} # Adjust brightness range
),
"contrast": ImageTransformConfig(
weight=2.0, # Higher weight = more likely to be selected
type="ColorJitter",
kwargs={"contrast": (0.8, 1.2)}
),
"sharpness": ImageTransformConfig(
weight=0.5, # Lower weight = less likely to be selected
type="SharpnessJitter",
kwargs={"sharpness": (0.3, 2.0)}
),
}
)
dataset = LeRobotDataset(
repo_id="your-username/your-dataset",
image_transforms=ImageTransforms(custom_transforms_config)
)
# Option 3: Use pure torchvision transforms
from torchvision.transforms import v2
torchvision_transforms = v2.Compose([
v2.ColorJitter(brightness=0.2, contrast=0.2, saturation=0.2, hue=0.1),
v2.GaussianBlur(kernel_size=3, sigma=(0.1, 2.0)),
])
dataset = LeRobotDataset(
repo_id="your-username/your-dataset",
image_transforms=torchvision_transforms
)Kullanılabilir dönüştürme türleri
Bir dönüştürmenin type'i, torchvision.transforms.v2'den herhangi bir sınıf olabilir, örneğin:
ColorJitter: Parlaklık, kontrast, doygunluk ve tonu ayarlarSharpnessJitter: Görüntü keskinliğini rastgele ayarlarRandomAffine,RandomRotation: Geometrik jitterGaussianNoise,MotionBlur,JPEGCompression,GaussianPatchBrightness,RandomShadow,CoarseDropout,GammaCorrection,PlanckianJitter: Gerçek robotlarda görülen kamera ve aydınlatma efektleriIdentity: Dönüşüm yok (test için faydalı)
Diğer herhangi bir torchvision.transforms.v2 sınıfı da bir type olarak adlandırılabilir (örneğin RandomResizedCrop veya GaussianBlur); bu dönüşüm örnekler tek tek uygulanır. Ayrıca bir torchvision dönüşümünü doğrudan image_transforms parametresine de iletebilirsiniz.
Her dönüştürme artık toplu (batched) olarak çalışır ve aynı toplu dönüştürmeler her iki arka uçta da çalıştırılır. Örnek başına sınıflar (SharpnessJitter, GaussianNoise, MotionBlur, GaussianPatchBrightness, RandomShadow, CoarseDropout, GammaCorrection, PlanckianJitter, RandomSubsetApply) ve make_transform_from_config, Batched* karşılıkları üzerinde kullanımdan kaldırılmış ön uçlar olarak içe aktarılabilir kalmaya devam eder ve kullanıldıklarında uyarı verir; bunlar gelecekteki bir sürümde kaldırılacaktır. ImageTransforms, (C, H, W) veya (T, C, H, W) tensörünü kabul eden düz bir torch.nn.Module'dür. Bir dönüştürmeyi type ile adlandıran yapılandırmalar etkilenmez.
Mevcut tarifler için davranış değişikliği. Eğitim, kareleri
uint8olarak okur veColorJitter,RandomAffineileRandomRotationdışındaki LeRobot dönüşümleri, daha önce kayan noktalı olmayan girdileri değiştirmeden döndürüyordu. Bu nedenleGaussianNoise,MotionBlur,GaussianPatchBrightness,RandomShadow,CoarseDropout,GammaCorrectionveyaPlanckianJitteretkinleştiren tarifler, bu dönüşümler olmadan eğitim yapıyordu. Artık her iki arka uçta da uygulanıyorlar, bu nedenle böyle bir tarif, daha öncekinden farklı şekilde eğitim alıyor: istediği artırmayı alıyor. Zaten uygulanan dönüşümler, yuvarlama dışında değişmedi; çünkü toplu yol, her dönüşümden sonra değil, yalnızca sonunda bir kez yuvarlama yaparak kayan nokta aralığında hesaplama yapıyor.
Yapılandırma seçenekleri
enable: Dönüşümleri etkinleştirme/devre dışı bırakma (varsayılan:False)max_num_transforms: Kare başına uygulanan maksimum dönüşüm sayısı (varsayılan:3)random_order: Dönüşümleri standart sıralama yerine rastgele sırayla uygula (varsayılan:False)weight: Her dönüştürme için örneklemleme olasılığı (daha yüksek = daha olası, ağırlıkların toplamı 1 değilse normalize edilirler)kwargs: Dönüşüme özgü parametreler (ör. parlaklık aralığı)backend: Eğitim sırasında dönüşümlerin nerede çalıştığı,"dataloader"(varsayılan) veya"gpu"; aşağıya bakıngpu_compile:"gpu"arka ucunda, toplu dönüştürmeleritorch.compileile derler (varsayılan:True)gpu_chunk_size:"gpu"arka ucunda, geçici belleği sınırlamak için bu kadar örnek bir anda artırılır (varsayılan:32)
GPU üzerinde dönüştürme çalıştırma
Varsayılan olarak dönüşümler, DataLoader işçilerinde örnek başına çalışır. Birden fazla kamera kullanıldığında bu, işçilerin yaptığı en maliyetli işlem olur ve GPU veri beklemek durumunda kalır. İşçilerin yalnızca çözümleme yapmasını ve aynı dönüşümleri her partiye politika cihazında uygulamasını sağlamak için backend=gpu ayarlayın:
lerobot-train \
--dataset.repo_id=your-username/your-dataset \
--dataset.image_transforms.enable=true \
--dataset.image_transforms.backend=gpu \
--policy.type=act \
--policy.device=cudaRastgeleleştirme değişmez: her örnek kendi dönüşümlerini ve parametrelerini çeker ve bir kameranın geçmişindeki kareler bunları paylaşır. Artırma yalnızca eğitim toplularına, politika ön işleyicisinden önce uygulanır; değerlendirme topluları, rollouts ve kaydedilen checkpoint'ler değiştirilmez.
Bilmeniz gerekenler:
- Hızlandırıcı gerektirir;
--policy.device=cpureddedilir. Kendiimage_transformsçağrılabilirine sahip elle oluşturulan bir veri seti de reddedilir, çünkü bunlar işçilerde çalışır. - Dataloader altyapısının desteklediği her dönüştürme türünü destekler. Toplu (batched) uygulaması olmayan türler (
JPEGCompressionveColorJitter,RandomAffine,RandomRotationileIdentityhariç torchvision sınıfları), hızlanma elde edilemediğinden, parti içinde örnek başına bir kez uygulanır;JPEGCompressionayrıca CPU üzerinden gidip gelir. Kare boyutunu değiştiren bir dönüştürme, birden fazla örnekten oluşan bir partide reddedilir. --seedile yeniden üretilebilir, her işlem farklı bir tohumla başlatılır. Artırma, politikanın rastgele akışını tüketmez vegpu_compileilegpu_chunk_sizeuygulanan şeyi değiştirmez.- Her iki arka uç da aynı toplu dönüştürmeleri float olarak çalıştırır ve yalnızca sonunda bir kez yuvarlar; bu nedenle aynı parametrelerle bir arka uçta artırılmış bir örnek, diğer arka uçta artırılmış aynı örneğe eşittir.
gpu_compile, her görüntü şekli için bir kez 15-30 sn sürer. Zirve bellek, parti görüntülerinin yaklaşık iki float kopyası ve bir parçanın birkaç kopyası kadardır; bellek daralırsagpu_chunk_sizedeğerini düşürün.random_order=true, dönüştürme süresinimax_num_transformsile çarpar.
v2.1 → v3.0 sürümüne geçiş
Dönüştürücü, bölüm başına dosyaları daha büyük parçalarda birleştirir ve bölüm ofsetlerini/metaları yazar. Veri setinizi aşağıdaki talimatları kullanarak dönüştürün.
# Convert an existing v2.1 dataset hosted on the Hub:
python -m lerobot.scripts.convert_dataset_v21_to_v30 --repo-id=<HF_USER/DATASET_ID>Neler yapar
- Parquet dosyalarını birleştirir:
episode_000000.parquet,episode_000001.parquet, … →file-000.parquet, … - mp4 dosyalarını birleştirir:
episode_000000.mp4,episode_000001.mp4, … →file-000.mp4, … meta/episodes/*(parçalı Parquet) dosyalarını, bölüm başına uzunluklar, görevler ve bayt/kare ofsetleri ile günceller.
Sık Karşılaşılan Sorunlar
Her zaman push işleminden önce finalize() çağırın
Veri kümeleri oluştururken veya kaydederken, parquet yazarlarını doğru şekilde kapatmak için mutlaka dataset.finalize() çağrısını yapmalısınız. Daha fazla ayrıntı için PR #1903 adresine bakın.
from lerobot.datasets import LeRobotDataset
# Create dataset and record episodes
dataset = LeRobotDataset.create(...)
for episode in range(num_episodes):
# Record frames
for frame in episode_data:
dataset.add_frame(frame)
dataset.save_episode()
# Call finalize() when done recording and before push_to_hub()
dataset.finalize() # Closes parquet writers, writes metadata footers
dataset.push_to_hub()Bu neden gerekli?
Dataset v3.0, verimlilik için tamponlu meta verilerle artımlı parquet yazımı kullanır. finalize() yöntemi:
- Önbelleğe alınan bölüm (episode) meta verilerini diske yazar
- Parquet dosyalarının bozuk olmaması için footer metadata'sını yazmak üzere parquet yazarlarını kapatır
- Veri setinin yüklenmesi için geçerli olduğunu sağlar
finalize() çağrılmadığı takdirde parquet dosyalarınız eksik kalır ve veri seti düzgün şekilde yüklenmez.
Diğer formatlar ve uygulamalar
LanceDB veri seti arka ucu
v3 bir veri seti ayrıca LanceDB tabloları olarak da saklanabilir. LanceDB, yapay zekâ erişim desenleri için Lance biçimi üzerine inşa edilmiş çok modlu bir veri gölüdür: herhangi bir satıra ve video baytlarına hızlı rastgele erişim, aynı tablolar üzerinde skaler, vektör ve tam metin indeksleri; böylece EDA, madencilik, kürasyon ve eğitim doğrudan nesne depolamadan çalışır. Yerleşim, meta/ dizinini değiştirmez ve tabular veriler için bir frames tablosu ile MP4 dosyalarını blob olarak içeren bir videos tablosu ekler. meta/info.json içindeki "storage_format": "lance" değeri okuyucuyu seçer; LeRobotDataset API'si, öğeler ve eğitim hattı değiştirilmez.
- GPU'lar beslenirken doğrudan Hub veya HF Storage Buckets'tan eğitim yapın. Rastgele kareler yerinde okunur, yalnızca her batch'in ihtiyaç duyduğu baytlar çekilir; böylece her batch küresel bir karıştırma olur ve hiçbir şey önceden indirilmez.
- Yaklaşık bir dosya kopyalama maliyetiyle dönüştürün. Videolar yeniden kodlanmadığından, öğeler kaynakla birebir aynıdır. DROID 34 dakikada dönüştürür.
- Kopyasız özellik mühendisliği. Eğiticinin okuduğu tablolara, videoları yeniden yazmadan veya veri setini kopyalamadan puanlar, gömlemeler veya düzeltilmiş etiketler gibi sütunlar ekleyin, ardından bunları indekslerle filtreleyin ve aramada kullanın. Okuyucu, tanımadığı sütunları yok sayar.
Bunun nasıl çalıştığına, kıyaslamalara ve örneklerine dair bilgi için LanceDB LeRobot kılavuzu'na bakın.
Kamera özellikleri video tabanlı olmalıdır. Kamera karelerini görüntü olarak depolayan veri setleri okuyucu tarafından desteklenmez ve dönüştürmeden önce video olarak yeniden kodlanmalıdır.
Lance veri kümelerini okumak için lancedb ek paketi (pip install "lerobot[lancedb]") gereklidir. Biçim salt okunurdur: veri kümelerini varsayılan biçimde kaydedip düzenleyin, ardından lerobot-lancedb paketiyle dönüştürün:
pip install "lerobot-lancedb"
lerobot-lance-convert --repo-id lerobot/pusht --out ./pusht-lance # or --root <local dataset dir>Yükleme aynı sınıfı kullanır:
from lerobot.datasets import LeRobotDataset
# Hub dataset repo
dataset = LeRobotDataset("lance-format/pusht-lance")
# HF Storage Bucket, read in place
dataset = LeRobotDataset("my-org/pusht-lance", repo_type="bucket")
# the same bucket as a root URI (other object store URIs work the same way)
dataset = LeRobotDataset("lerobot/pusht", root="hf://buckets/my-org/pusht-lance")HF Storage Bucket seçenekleri lerobot-train ile çalışır:
lerobot-train \ --dataset.repo_id=my-org/pusht-lance \ --dataset.repo_type=bucket \ --policy.type=act
Görselleştirme her iki görüntüleyiciyle de çalışır. lerobot-dataset-viz --repo-id lance-format/pusht-lance --episode-index 0 bir bölümü normalde olduğu gibi Rerun'da açar ve --display-mode foxglove bunu Foxglove'a WebSocket üzerinden sunar. Her iki durumda da yalnızca ekrandaki kareler alınır; MCAP dışa aktarımı veya indirme yapılmaz.