LeRobot documentation
Yayın Video Kodlama Kılavuzu
Yayın Video Kodlama Kılavuzu
1. Genel Bakış
Video akış kodlaması, video veri seti kaydı sırasında geleneksel PNG gidiş-dönüşünü ortadan kaldırır. Bunun yerine:
- Kare yakala -> PNG'yi diske yaz -> (epizot sonunda) PNG'leri oku -> MP4'e kodla -> PNG'leri sil
Kareler, yakalama sırasında gerçek zamanlı olarak kodlanabilir:
- Kare yakala -> kodlayıcı iş parçacığına kuyruğa al -> doğrudan MP4'e kodla
Bu, save_episode() işlemini neredeyse anında hale getirir (video, bölüm bitmeden önce zaten kodlanmıştır) ve özellikle uzun bölümlerde birden fazla kamera kullanıldığında bölümler arasında daha önce yaşanan engellenen bekleme süresini ortadan kaldırır.
2. Ayar Parametreleri
| Parametre | CLI Bayrağı | Tür | Varsayılan | Açıklama |
|---|---|---|---|---|
streaming_encoding | --dataset.streaming_encoding | bool | False | Yakalama sırasında gerçek zamanlı kodlamayı etkinleştirin |
vcodec | --dataset.rgb_encoder.vcodec | str | "libsvtav1" | Video codec. "auto" en iyi donanım kodlayıcısını algılar |
encoder_threads | --dataset.encoder_threads | int \| None | None (otomatik) | Her kodlayıcı örneği için iş parçacığı sayısı. None, vcoded'in karar vermesine izin verir |
encoder_queue_maxsize | --dataset.encoder_queue_maxsize | int | 30 | Kamera başına tamponlanan maksimum kare sayısı (~30fps'de 1 sn). RAM tüketir |
3. Performans Düşünceleri
Streaming kodlama, CPU'nun videoyu yakalama döngüsünün içinde, sonrasında değil kodladığı anlamına gelir. Bu, aşağıdakiler arasında paylaşılması gereken bir CPU bütçesi oluşturur:
- Kontrol döngüsü (kameraları okuma, robotu kontrol etme, video dışı verileri yazma)
- Encoder iş parçacıkları (kamera başına bir havuz)
- Görselleştirmeyi yeniden çalıştır (eğer etkinse)
- İşletim sistemi ve diğer süreçler
Çözünürlük ve Kamera Sayısının Etkisi
| Kurulum | Geçirgenlik (px/sn) | CPU Kodlama Yükü | Notlar |
|---|---|---|---|
| 2camsx 640x480x3 @30fps | 55M | Düşük | Çoğu sistemde çalışır |
| 2camsx 1280x720x3 @30fps | 165M | Orta | Modern sistemlerde rahat |
| 2camsx 1920x1080x3 @30fps | 373M | Yüksek | Güçlü, üst düzey bir CPU gerektirir |
encoder_threads Ayarları
Bu parametre, her kodlayıcı örneğinin içsel olarak kaç iş parçacığı kullandığını kontrol eder:
- Daha yüksek değerler (ör. 4-5): Daha hızlı kodlama, ancak kamera başına daha fazla CPU çekirdeği kullanır. Çekirdeği çok olan üst düzey sistemler için uygundur.
- Daha düşük değerler (ör. 1-2): Kamera başına daha az CPU kullanımı, çekim ve görselleştirme için çekirdekleri serbest bırakır. Düşük çözünürlüklü görüntüler ve yetenekli CPU'lar için uygundur.
None(varsayılan): Kararı codec'in vermesini sağlar. Codec günlüklerinde mevcut bilgiler.
Backpressure ve Kare Düşürme
Her kameranın sınırlı bir kuyruğu vardır (encoder_queue_maxsize, varsayılan 30 kare). Kodlayıcı yetişemediğinde:
- Kuyruk dolar (RAM tüketir)
- Yeni kareler atılır (bloklanmaz) — yakalama döngüsü kesintisiz devam eder
- Bir uyarı kaydedilir:
"Encoder queue full for {camera}, dropped N frame(s)" - Bölüm sonunda, kamera başına toplam düşen kareler raporlanır
Encoder'ın Geride Kalmasının Belirtileri
- Sistem takılıyor ve donuyor: tüm CPU'lar %100
- Kayıt edilen veri setinde beklenenden düşük kare/FPS veya günlükte atlanan kare uyarıları
- Titrek robot hareketi: CPU aşırı yüklüyse, yakalama döngüsü bile etkilenebilir
- Biriken yeniden çalıştırma gecikmesi: Görselleştirme gerçek zamanlılığı geride kalır
4. Donanım Hızlandırmalı Kodlama
Ne Zaman Kullanılır
Aşağıdaki durumlarda HW kodlamayı kullanın:
- CPU darboğaz oluşturuyor (kare düşmesi, takılan robot, rerun gecikmesi)
- Uyumlu donanımınız var (GPU veya özel kodlayıcı)
- Yüksek verimle (yüksek çözünürlükte veya çok sayıda kamera ile) kayıt yapıyorsunuz
Kodlayıcı Seçimi
| Codec | CPU Kullanımı | Dosya Boyutu | Kalite | Notlar |
|---|---|---|---|---|
libsvtav1 (varsayılan) | Yüksek | En küçük | En iyi | Varsayılan. En iyi sıkıştırma ancak en yüksek CPU yoğunluğu |
h264 | Orta | ~%30-50 daha büyük | İyi | Yazılım H.264. Daha düşük CPU |
| Donanım kodlayıcıları | Çok Düşük | En büyük | İyi | Özel donanıma aktarır. CPU kısıtlamalı sistemler için en iyisidir |
Kullanılabilir Donanım Kodlayıcıları
| Encoder | Platform | Donanım | CLI Değeri |
|---|---|---|---|
h264_videotoolbox | macOS | Apple Silicon / Intel | --dataset.rgb_encoder.vcodec=h264_videotoolbox |
hevc_videotoolbox | macOS | Apple Silicon / Intel | --dataset.rgb_encoder.vcodec=hevc_videotoolbox |
h264_nvenc | Linux/Windows | NVIDIA GPU | --dataset.rgb_encoder.vcodec=h264_nvenc |
hevc_nvenc | Linux/Windows | NVIDIA GPU | --dataset.rgb_encoder.vcodec=hevc_nvenc |
h264_vaapi | Linux | Intel/AMD GPU | --dataset.rgb_encoder.vcodec=h264_vaapi |
h264_qsv | Linux/Windows | Intel Quick Sync | --dataset.rgb_encoder.vcodec=h264_qsv |
auto | Herhangi | Sistemde kullanılabilir donanım kodlayıcılarını sorgular. Donanım kodlayıcı bulunamazsa libsvtav1 kullanılır | --dataset.rgb_encoder.vcodec=auto |
HW hızlandırmalı kodlayıcıları kullanmak için GPU sürücülerinizi yükseltmeniz gerekebilir.
libsvtav1, en iyi eğitim performansını sağladığı için varsayılandır; diğer vcodecs CPU kullanımını azaltabilir ve daha hızlı olabilir, ancak genellikle daha büyük dosyalar üretir ve eğitim süresini etkileyebilir.
5. Sorun Giderme
| Belirti | Muhtemel Neden | Düzelt |
|---|---|---|
| Sistem donması veya robot hareketinin takılması veya Rerun görselleştirme gecikmesi | CPU aç (yükleme kullanımı %100) | Diğer uygulamaları kapatın, kodlama verimliliğini azaltın, encoder_threads değerini düşürün, h264 kullanın, display_data=False kullanın. CPU yine de %100'de kalıyorsa, bu durum kurulumunuz için yetersiz olabilir; --dataset.streaming_encoding=false veya donanım kodlamasını (--dataset.rgb_encoder.vcodec=auto) düşünün. |
| Veri setinde “Encoder queue full” uyarıları veya düşen kareler | Encoder yetişemiyor (Kuyruk taşması) | CPU %100'de değilse: encoder_threads değerini artırın, encoder_queue_maxsize değerini artırın veya donanım kodlamasını kullanın (--dataset.rgb_encoder.vcodec=auto). |
| Yüksek RAM kullanımı | Kuyruk, kodlamadan daha hızlı doluyor | encoder_threads çok düşük veya CPU yetersiz. encoder_queue_maxsize değerini azaltın veya donanım kodlaması kullanın |
| Büyük video dosyaları | HW kodlayıcı veya H.264 kullanma | Beklenen ödünleşim. CPU izin veriyorsa libsvtav1'e geçin |
save_episode() hâlâ yavaş | streaming_encoding False değerine ayarlanmıştır | --dataset.streaming_encoding=true değerini ayarlayın |
| Encoder iş parçacığı çökmesi | Kodlayıcı kullanılamıyor veya geçersiz ayarlar | vcodec'in yüklü olduğunu kontrol edin, --dataset.rgb_encoder.vcodec=auto deneyin |
| Kaydedilen veri setinde kareler eksik | CPU/GPU açlığı veya ara sıra yük sıçramaları | Karelerin ~%5'i eksikse, sisteminiz büyük olasılıkla aşırı yüklüdür — yukarıdaki önerileri izleyin. Daha az kare eksikse (~%2), bunlar muhtemelen ara sıra oluşan geçici yük sıçramalarından (genellikle başlangıçta) kaynaklanmaktadır ve beklenen bir durum olarak kabul edilebilir. |
6. Önerilen Yapılandırmalar
Bu tahminler muhafazakârdır; bunları kendi kurulumunuzda test etmenizi öneririz—düşük bir yükle başlayıp kademeli olarak artırın.
Yüksek Uçlu Sistemler: modern 12+ çekirdek (24+ iş parçacığı)
CPU'da ~250-500M px/sn aralığında bir bant genişliği rahat olmalıdır. Daha iyi sonuçlar için, kullanılabilirse HW kodlamayı deneyin.
# 3camsx 1280x720x3 @30fps: Defaults work well. Optionally increase encoder parallelism.
# 2camsx 1920x1080x3 @30fps: Defaults work well. Optionally increase encoder parallelism.
lerobot-record --dataset.encoder_threads=5 ...
# 3camsx 1920x1080x3 @30fps: Might require some tuning.Orta Segment Sistemler: modern 8+ çekirdek (16+ iş parçacığı) veya Apple Silicon
CPU'da ~80-300M px/sn arasında bir bant genişliği mümkün olmalıdır.
# 3camsx 640x480x3 @30fps: Defaults work well. Optionally decrease encoder parallelism.
# 2camsx 1280x720x3 @30fps: Defaults work well. Optionally decrease encoder parallelism.
lerobot-record --dataset.encoder_threads=2 ...
# 2camsx 1920x1080x3 @30fps: Might require some tuning.Düşük Kaynaklı Sistemler: modern 4+ çekirdek (8+ iş parçacığı) veya Raspberry Pi 5
Çok kısıtlı sistemlerde, akış kodlaması yakalama döngüsüyle aşırı derecede çelişebilir. Bu özelliği devre dışı bırakmak, kodlamanın bölümler arasında gerçekleştiği PNG tabanlı yönteme geri düşülmesini sağlar (engelleyici olsa da yakalamayı etkilemez). Alternatif olarak, hem yakalama hem de kodlama yükünü azaltmak için daha düşük bir verimle kayıt yapın. Ayrıca, kodeği h264 olarak değiştirmeyi ve toplu kodlamayı kullanmayı da düşünün.
# 2camsx 640x480x3 @30fps: Requires some tuning.
# Use H.264, disable streaming, consider batching encoding
lerobot-record --dataset.rgb_encoder.vcodec=h264 --dataset.streaming_encoding=false ...7. Kapanış notu
Performans, kesin kurulumunuza bağlıdır: kare/saniye, çözünürlük, CPU çekirdek sayısı ve yükü, kullanılabilir bellek, bölüm uzunluğu ve seçtiğiniz kodlayıcı. Hedef iş yükünüzle her zaman test edin, CPU & sistem yeteneklerinizi göz önünde bulundurun ve encoder_threads, encoder_queue_maxsize ile vcodec değerlerini makul bir şekilde ayarlayın. Bununla birlikte, yaygın bir pratik yapılandırma (birçok uygulama için) 640×480x3 @30fps çözünürlükte üç kameradır; bu, modern sistemlerde varsayılan akış video kodlama ayarlarıyla genellikle sorunsuz çalışır. Kaydedilen veri setinizin sağlıklı olduğunu, video süresini CLI bölüm süresiyle karşılaştırarak ve satır sayısının FPS × CLI süresine eşit olduğunu doğrulayarak her zaman kontrol edin.