LeRobot documentation
Video kodlama parametreleri
Video kodlama parametreleri
Video depolama etkinleştirildiğinde, LeRobot her kamera akışını zaman adımı başına bir görüntü dosyası kaydetmek yerine bir MP4 dosyası olarak saklar. Video kodlaması zaman ekseninde sıkıştırma yapar; bu da genellikle PNG yığınına kıyasla veri seti boyutunu ve G/Ç'yi azaltırken, her oynatıcı ve yükleyicinin anladığı MP4 formatını korur.
MP4'e çerçeveleri kodlamak tam bir FFmpeg hattıdır: kodlayıcı seçimi, piksel formatı, GOP/anahtar kareler, kalite-hız dengesi ve isteğe bağlı ek kodlayıcı bayrakları. Bu ayarların çoğu, PyAV üzerinden geçirilen, iç içe geçmiş RGBEncoderConfig (lerobot.configs.video.RGBEncoderConfig) olan rgb_encoder aracılığıyla kullanıcı tarafından ayarlanabilir.
Bu parametreleri --dataset.rgb_encoder.<field> ile CLI üzerinden ayarlayabilirsiniz (ör. lerobot-record veya lerobot-rollout ile). Aynı blok, o çalıştırmadaki her kamera video akışına uygulanır.
rgb_encoder'ın herhangi bir etki gösterebilmesi için video depolamanın açık olması gerekir — Python API'lerindeuse_videos=Trueveya CLI'da--dataset.video=true(kayıt varsayılanı). Video kapalıyken girdiler görüntü olarak kalır vergb_encoderyok sayılır.
For details on when frames are written vs. encoded (streaming vs. post-episode), queues, and other top-level --dataset.* switches, see Streaming Video Encoding. For an encoding-parameter comparison and experiments, see the video-benchmark Space.
Örnek
lerobot-record \
--robot.type=so100_follower \
--robot.port=/dev/tty.usbmodem58760431541 \
--robot.cameras="{laptop: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
--robot.id=black \
--teleop.type=so100_leader \
--teleop.port=/dev/tty.usbmodem58760431551 \
--teleop.id=blue \
--dataset.repo_id=<my_username>/<my_dataset_name> \
--dataset.num_episodes=2 \
--dataset.single_task="Grab the cube" \
--dataset.streaming_encoding=true \
--dataset.encoder_threads=2 \
--dataset.rgb_encoder.vcodec=h264 \
--dataset.rgb_encoder.preset=fast \
--dataset.rgb_encoder.extra_options='{"tune": "film", "profile:v": "high", "bf": 2}' \
--display_data=trueParametre ayarları
Varsayılan değerler, tipik robotik veri setleri için sıkıştırma oranı, görsel kalite ve çözümleme/arama hızı arasında denge kuracak şekilde ayarlanmıştır. Bunları değiştirmek hem kaydı (CPU yükü, kare düşmeleri) hem de eğitimi (çözümleme verimliliği, görüntü kalitesi) etkileyebilir.
Bu parametreleri yalnızca belirli bir nedeniniz varsa geçersiz kılın ve yeni ayarlara güvenmeden önce hattınızdaki etkiyi ölçün.
Aşağıdaki tüm bayraklar, CLI'de --dataset.rgb_encoder. önekiyle başlar.
| Parametre | Tür | Varsayılan | Açıklama |
|---|---|---|---|
vcodec | str | "libsvtav1" | Video codec adı. "auto", sabit bir tercih listesinden ilk kullanılabilir donanım kodlayıcısını seçer; yoksa libsvtav1 kullanılır. |
pix_fmt | str | "yuv420p" | Çıktı piksel biçimi. Seçilen codec'in FFmpeg derlemenizde desteklenmesi gerekir. |
g | int | 2 | GOP boyutu — her g karede bir anahtar kare. FFmpeg seçeneği olarak g olarak yayınlanır. |
crf | int veya float | 30 | Kodlayıcı başına eşlenen soyut kalite değeri (bkz. eşleme). Eşleme monoton ise, daha düşük değer daha yüksek kaliteye / daha büyük çıktıya karşılık gelir. |
preset | int veya str | 12 * | Encoder hız ön ayarı; anlamı codec'e göre değişir. * Ayarlanmamış ve vcodec=libsvtav1 ise, LeRobot varsayılan olarak 12 kullanır. |
fast_decode | int | 0 | libsvtav1: 0–2, svtav1-params ile geçirilir. h264 / hevc (yazılımsal): >0 ise tune=fastdecode ayarlanır. Diğer codec'ler: genellikle kullanılmaz. |
video_backend | str | "pyav" | Şu anda video kodlama için yalnızca "pyav" uygulanmıştır. |
extra_options | dict | {} | Yukarıdaki yapılandırılmış alanlardan sonra birleştirilen ek FFmpeg veya codec'e özgü seçenekler. Bu alanlar tarafından zaten ayarlanmış anahtarları geçersiz kılamaz. |
Derinlik akışları
Derinlik haritaları (Intel RealSense, Reachy 2), RGB akışlarının yanında kendi video akışları olarak saklanır. Ham derinlik (uint16 milimetre veya float32 metre), 8 bitlik bir codec ile korunamaz; bu nedenle LeRobot, derinlik sensörlerinin 1/depth hata profiliyle uyumlu olacak şekilde varsayılan olarak logaritmik olarak, her haritayı 12 bitlik bir koda ([0, 4095]) kantize eder, ardından bunu yüksek bit derinliğine sahip bir piksel formatına (gray12le) paketler ve 12 bitlik bir codec ile kodlar.
float32 m →
depth_max] aralığına → Kantize et 12-bit kodlar 0–4095
log (varsayılan) veya lineer → Paketle gray12le
düzlemine → Kodla HEVC
Main 12
akış →
Derinlik hattını paralel bir depth_encoder bloğu (DepthEncoderConfig) üzerinden yapılandırın. Bu blok, RGBEncoderConfig alanlarının tamamını (vcodec, pix_fmt, crf, …) paylaşır ve --dataset.depth_encoder.<field> ile ayarlanan dört kuantizör ayarı ekler:
lerobot-record \
... \
--dataset.depth_encoder.vcodec=hevc \
--dataset.depth_encoder.depth_min=0.05 \
--dataset.depth_encoder.depth_max=5.0 \
--dataset.depth_encoder.use_log=true| Parametre | Tür | Varsayılan | Açıklama |
|---|---|---|---|
vcodec | str | "hevc" | HEVC Main 12 (12 bit destekli bir codec, MP4 ile uyumlu). |
extra_options | dict | {"x265-params": "lossless=1"} | Derinlik varsayılan olarak kayıpsızdır (tam tur); crf yok sayılır. Daha küçük kayıplı bir akış için extra_options={} geçirin ve crf ayarlayın. |
pix_fmt | str | "gray12le" | Kantize kodları taşımak için kullanılan tek kanallı 12-bit piksel formatı. |
depth_min | float | 0.01 | Metre cinsinden derinlik, kuantum 0'a eşlenir. Aşağıdaki değerler, çözümleme sırasında kırpılır. |
depth_max | float | 10.0 | Metre cinsinden derinlik, kuantum 4095'e eşlenir. Üstündeki değerler çözümlenirken kırpılır. |
shift | float | 3.5 | Sıfıra yakın sayısal kararlılık için logaritmik kuantizasyonda kullanılan ön-log ofseti (metre). depth_min + shift > 0 koşulunu sağlamalıdır. |
use_log | bool | True | true ise, logaritmik uzayda kuantizasyon yapılır (tipik derinlik sensörleri için önerilir). Düzgün/lineer kuantizasyon için false olarak ayarlayın. |
depth_min,depth_maxveshiftparametreleri, girdi derinliğinin birimi ne olursa olsun her zaman metre cinsinden yorumlanır. Girdiler otomatik olarak algılanır: tamsayı dizileri (ör. doğrudan bir RealSense’ten gelenuint16milimetreler) milimetre, kayan nokta dizileri ise metre olarak kabul edilir.depth_min/depth_maxdeğerlerini sensörünüzün gerçek çalışma aralığını kapsayacak şekilde seçin — bu aralığın dışındaki kuantalar doygunluğa ulaşır ve bu durum, sınırlardaki detayları bozabilir.
Derinlik özellikleri, meta/info.json içinde "is_depth_map": true ile işaretlenir ve kuantizatör ayarları (video.depth_min, video.depth_max, video.shift, video.use_log) kalıcı olarak saklanır; bu sayede yükleme sırasında derinlik fiziksel birimlere geri kuantize edilebilir.
Yükleme sırasında çıktı birimi
depth_encoder, kayıt zamanı ile ilgili bir konudur. Derinlik haritalarının yükleme sırasında (ör. eğitim sırasında) dekuantize edileceği birim, okuma zamanı bayrağı olan --dataset.depth_output_unit ile ayrı olarak ayarlanır:
lerobot-train \
--dataset.repo_id=<my_username>/<my_dataset_name> \
--dataset.depth_output_unit=m \
--policy.type=act| Parametre | Tür | Varsayılan | Açıklama |
|---|---|---|---|
depth_output_unit | str | "mm" | Fiziksel birim derinlik haritaları yüklenirken şu şekilde dekuantize edilir: "mm" (milimetre) veya "m" (metre). |
Bu tamamen bir çözümleme zamanı sunum tercihidir — depolanan videoyu veya onun meta verilerini değiştirmez, bu nedenle aynı veri seti yeniden kodlama yapılmadan
mmveyamolarak okunabilir. Derinlik kamerası olmayan veri setleri üzerinde hiçbir etkisi yoktur.
Veri seti meta verilerinde kalıcılık
Bir video akışının ilk bölümü kodlandıktan sonra, kodlayıcı yapılandırması, dosyadan algılanan değerlerin yanı sıra her video özelliği altında meta/info.json içindeki veri seti meta verilerine kalıcı olarak yazılır. observation.images.<camera> video özelliği için info.json içindeki düzen şöyledir:
{
"features": {
"observation.images.laptop": {
"dtype": "video",
"shape": [480, 640, 3],
"info": {
"video.height": 480,
"video.width": 640,
"video.codec": "h264",
"video.pix_fmt": "yuv420p",
"video.fps": 30,
"video.channels": 3,
"is_depth_map": false,
"video.g": 2,
"video.crf": 30,
"video.preset": "fast",
"video.fast_decode": 0,
"video.video_backend": "pyav",
"video.extra_options": { "tune": "film", "profile:v": "high", "bf": 2 }
}
}
}
}info bloğuna iki kaynak katkıda bulunur:
| Kaynak | Nereden geldiği | Alanlar |
|---|---|---|
| Yakalanan | Kodlanmış MP4'ten PyAV ile geri okuyun. | video.height, video.width, video.codec, video.pix_fmt, video.fps, video.channels, is_depth_map, audio.* |
| Encoder'dan türetilen | RGBEncoderConfig / DepthEncoderConfig içinden alınmıştır. | video.g, video.crf, video.preset, video.fast_decode, video.video_backend, video.extra_options |
Bu blok, ilk epizottan bir kez doldurulur. Veri setindeki her epizodun aynı
rgb_encoderile kodlandığı varsayılır. Kayıt sırasında kodlayıcı ayarlarının değiştirilmesi desteklenmez —info.jsonyalnızca ilk epizot için kullanılan parametreleri yansıtır.
Veri kümelerini birleştirme
merge_datasets ile veri kümelerini birleştirirken, video dosyaları olduğu gibi birleştirilir (yeniden kodlama yapılmaz) ve info.json içindeki kodlayıcı alanları anahtar bazında birleştirilir:
| Birleştirme kuralı | Alanlar | Davranış |
|---|---|---|
| Eşleşmeli | video.codec, video.pix_fmt, video.height, video.width, video.fps | Stream-derived alanlar kaynaklar arasında eşleşmelidir, aksi takdirde FFmpeg'in concat demuxer'ı başarısız olur. |
| Geçici olarak birleştirildi | video.g, video.crf, video.preset, video.fast_decode, video.extra_options | Encoder-tuning alanları. Tüm kaynaklar aynı değeri veriyorsa değer korunur; aksi halde null (veya video.extra_options için {}) olarak ayarlanır ve bir uyarı günlüğe kaydedilir. |