LeRobot documentation

Video kodlama parametreleri

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.6.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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'lerinde use_videos=True veya CLI'da --dataset.video=true (kayıt varsayılanı). Video kapalıyken girdiler görüntü olarak kalır ve rgb_encoder yok 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=true

Parametre 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.

ParametreTürVarsayılanAçıklama
vcodecstr"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_fmtstr"yuv420p"Çıktı piksel biçimi. Seçilen codec'in FFmpeg derlemenizde desteklenmesi gerekir.
gint2GOP boyutu — her g karede bir anahtar kare. FFmpeg seçeneği olarak g olarak yayınlanır.
crfint veya float30Kodlayı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.
presetint veya str12 *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_decodeint0libsvtav1: 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_backendstr"pyav"Şu anda video kodlama için yalnızca "pyav" uygulanmıştır.
extra_optionsdict{}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.

Ham derinlik uint16 mm
float32 m
→
Kayıt zamanı Kırp [depth_min,
depth_max] aralığına
→ Kantize et 12-bit kodlar 0–4095
log (varsayılan) veya lineer
→ Paketle gray12le
düzlemine
→ Kodla HEVC
Main 12
→ MP4 depolanan
akış
→
Yükleme zamanı Kantizasyonu kaldır mm / m olarak

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
ParametreTürVarsayılanAçıklama
vcodecstr"hevc"HEVC Main 12 (12 bit destekli bir codec, MP4 ile uyumlu).
extra_optionsdict{"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_fmtstr"gray12le"Kantize kodları taşımak için kullanılan tek kanallı 12-bit piksel formatı.
depth_minfloat0.01Metre cinsinden derinlik, kuantum 0'a eşlenir. Aşağıdaki değerler, çözümleme sırasında kırpılır.
depth_maxfloat10.0Metre cinsinden derinlik, kuantum 4095'e eşlenir. Üstündeki değerler çözümlenirken kırpılır.
shiftfloat3.5Sı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_logboolTruetrue 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_max ve shift parametreleri, 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 gelen uint16 milimetreler) milimetre, kayan nokta dizileri ise metre olarak kabul edilir. depth_min / depth_max değ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
ParametreTürVarsayılanAçıklama
depth_output_unitstr"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 mm veya m olarak 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:

KaynakNereden geldiğiAlanlar
YakalananKodlanmış 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üretilenRGBEncoderConfig / 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_encoder ile kodlandığı varsayılır. Kayıt sırasında kodlayıcı ayarlarının değiştirilmesi desteklenmez — info.json yalnı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ıAlanlarDavranış
Eşleşmelivideo.codec, video.pix_fmt, video.height, video.width, video.fpsStream-derived alanlar kaynaklar arasında eşleşmelidir, aksi takdirde FFmpeg'in concat demuxer'ı başarısız olur.
Geçici olarak birleştirildivideo.g, video.crf, video.preset, video.fast_decode, video.extra_optionsEncoder-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.
Update on GitHub