LeRobot documentation

Hướng dẫn mã hóa video trực tiếp

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

Hướng dẫn mã hóa video trực tiếp

1. Tổng quan

Việc mã hóa video dạng streaming loại bỏ vòng lặp PNG truyền thống trong quá trình ghi bộ dữ liệu video. Thay vì:

  1. Chụp khung hình -> ghi PNG ra đĩa -> (khi kết thúc tập) đọc các tệp PNG -> mã hóa thành MP4 -> xóa các tệp PNG

Các khung hình có thể được mã hóa theo thời gian thực trong quá trình thu thập:

  1. Chụp khung hình -> đưa vào hàng đợi cho luồng mã hóa -> mã hóa trực tiếp thành MP4

Điều này giúp save_episode() gần như tức thì (video đã được mã hóa xong trước khi episode kết thúc) và loại bỏ thời gian chờ chặn trước đó xảy ra giữa các episode, đặc biệt là khi có nhiều camera trong các episode dài.

2. Điều chỉnh tham số

Tham sốCờ CLILoạiMặc địnhMô tả
streaming_encoding--dataset.streaming_encodingboolFalseBật mã hóa thời gian thực trong quá trình thu
vcodec--dataset.rgb_encoder.vcodecstr"libsvtav1"Bộ mã hóa video. "auto" tự động phát hiện trình mã hóa phần cứng tốt nhất
encoder_threads--dataset.encoder_threadsint \| NoneNone (tự động)Số luồng cho mỗi instance encoder. None sẽ để vcoded tự quyết định
encoder_queue_maxsize--dataset.encoder_queue_maxsizeint30Số khung hình đệm tối đa cho mỗi camera (~1 giây ở 30fps). Tiêu tốn RAM

3. Cân nhắc về hiệu năng

Streaming encoding có nghĩa là CPU mã hóa video trong khi vòng lặp ghi hình đang chạy, chứ không phải sau đó. Điều này tạo ra một ngân sách CPU phải được chia sẻ giữa:

  • Vòng lặp điều khiển (đọc camera, điều khiển robot, ghi dữ liệu không phải video)
  • Threads mã hóa (một pool cho mỗi camera)
  • Chạy lại trực quan hóa (nếu được bật)
  • Hệ điều hành và các tiến trình khác

Tác động của Độ phân giải & Số lượng Camera

Cài đặtThông lượng (px/giây)Tải mã hóa CPUGhi chú
2camsx 640x480x3 @30fps55MThấpHoạt động trên hầu hết các hệ thống
2camsx 1280x720x3 @30fps165MTrung bìnhThoải mái trên các hệ thống hiện đại
2camsx 1920x1080x3 @30fps373MCaoYêu cầu CPU cao cấp mạnh mẽ

encoder_threads Điều chỉnh

Tham số này kiểm soát số lượng luồng mà mỗi phiên bản encoder sử dụng bên trong:

  • Giá trị cao hơn (ví dụ: 4-5): Mã hóa nhanh hơn, nhưng sử dụng nhiều lõi CPU hơn cho mỗi camera. Phù hợp với các hệ thống cao cấp có nhiều lõi.
  • Giá trị thấp hơn (ví dụ: 1-2): Ít CPU hơn cho mỗi camera, giải phóng nhân cho việc thu thập và trực quan hóa. Phù hợp với ảnh độ phân giải thấp và CPU mạnh.
  • None (mặc định): Để codec tự quyết định. Thông tin có sẵn trong nhật ký của codec.

Backpressure và Bỏ Khung

Mỗi camera có một hàng đợi có giới hạn (encoder_queue_maxsize, mặc định là 30 khung hình). Khi bộ mã hóa không theo kịp:

  1. Hàng đợi bị đầy (tiêu tốn RAM)
  2. Các khung mới sẽ bị bỏ qua (không bị chặn) — vòng lặp ghi hình tiếp tục không bị gián đoạn
  3. Một cảnh báo được ghi lại: "Encoder queue full for {camera}, dropped N frame(s)"
  4. Vào cuối mỗi tập, tổng số khung hình bị bỏ qua cho mỗi camera sẽ được báo cáo

Các triệu chứng của việc Encoder bị tụt lại

  • Hệ thống bị giật và đơ: tất cả CPU đều ở mức 100%
  • Cảnh báo khung bị bỏ trong nhật ký hoặc số khung/FPS thấp hơn dự kiến trong bộ dữ liệu được ghi
  • Chuyển động robot giật cục: Nếu CPU quá tải nghiêm trọng, ngay cả vòng lặp ghi hình cũng có thể bị ảnh hưởng
  • Độ trễ chạy lại tích lũy: Trực quan hóa bị tụt lại so với thời gian thực

4. Mã hóa tăng tốc bằng phần cứng

Khi nào nên sử dụng

Sử dụng mã hóa phần cứng khi:

  • CPU là nút thắt cổ chai (bị rơi khung hình, robot giật, độ trễ rerun)
  • Bạn có phần cứng tương thích (GPU hoặc bộ mã hóa chuyên dụng)
  • Bạn đang ghi hình với thông lượng cao (độ phân giải cao hoặc với nhiều camera)

Chọn Codec

CodecSử dụng CPUKích thước tệpChất lượngGhi chú
libsvtav1 (mặc định)CaoNhỏ nhấtTốt nhấtMặc định. Nén tốt nhất nhưng tốn CPU nhất
h264Trung bìnhlớn hơn ~30-50%TốtPhần mềm H.264. CPU thấp hơn
Bộ mã hóa phần cứngRất ThấpLớn nhấtTốtChuyển tải sang phần cứng chuyên dụng. Tốt nhất cho các hệ thống bị giới hạn CPU

Bộ mã hóa phần cứng khả dụng

Bộ mã hóaNền tảngPhần cứngGiá trị CLI
h264_videotoolboxmacOSApple Silicon / Intel--dataset.rgb_encoder.vcodec=h264_videotoolbox
hevc_videotoolboxmacOSApple Silicon / Intel--dataset.rgb_encoder.vcodec=hevc_videotoolbox
h264_nvencLinux/WindowsGPU NVIDIA--dataset.rgb_encoder.vcodec=h264_nvenc
hevc_nvencLinux/WindowsGPU NVIDIA--dataset.rgb_encoder.vcodec=hevc_nvenc
h264_vaapiLinuxGPU Intel/AMD--dataset.rgb_encoder.vcodec=h264_vaapi
h264_qsvLinux/WindowsIntel Quick Sync--dataset.rgb_encoder.vcodec=h264_qsv
autoBất kỳKiểm tra hệ thống để tìm các trình mã hóa phần cứng khả dụng. Nếu không tìm thấy trình mã hóa phần cứng, sẽ chuyển sang libsvtav1--dataset.rgb_encoder.vcodec=auto

Để sử dụng các bộ mã hóa được tăng tốc bằng phần cứng, bạn có thể cần nâng cấp trình điều khiển GPU của mình.

libsvtav1 là mặc định vì nó cung cấp hiệu suất huấn luyện tốt nhất; các vcodecs khác có thể giảm mức sử dụng CPU và nhanh hơn, nhưng chúng thường tạo ra các tệp lớn hơn và có thể ảnh hưởng đến thời gian huấn luyện.

5. Khắc phục sự cố

Triệu chứngNguyên nhân có thểSửa
Hệ thống bị đơ hoặc chuyển động của robot bị giật hoặc hình ảnh trực quan hóa Rerun bị trễCPU thiếu hụt (tải sử dụng 100%)Đóng các ứng dụng khác, giảm thông lượng mã hóa, giảm encoder_threads, sử dụng h264, sử dụng display_data=False. Nếu CPU vẫn ở mức 100% thì có thể phần cứng không đủ cho cấu hình của bạn, hãy cân nhắc --dataset.streaming_encoding=false hoặc mã hóa phần cứng (--dataset.rgb_encoder.vcodec=auto)
Cảnh báo “Encoder queue full” hoặc các khung hình bị bỏ trong bộ dữ liệuEncoder không theo kịp (Tràn hàng đợi)Nếu CPU không đạt 100%: tăng encoder_threads, tăng encoder_queue_maxsize hoặc sử dụng mã hóa phần cứng (--dataset.rgb_encoder.vcodec=auto).
Sử dụng RAM caoHàng đợi đầy nhanh hơn mã hóaencoder_threads quá thấp hoặc CPU không đủ. Giảm encoder_queue_maxsize hoặc sử dụng mã hóa phần cứng
Các tệp video lớnSử dụng bộ mã hóa phần cứng hoặc H.264Đánh đổi kỳ vọng. Chuyển sang libsvtav1 nếu CPU cho phép
save_episode() vẫn còn chậmstreaming_encoding là FalseĐặt --dataset.streaming_encoding=true
Lỗi crash luồng EncoderCodec không khả dụng hoặc cài đặt không hợp lệKiểm tra xem vcodec đã được cài đặt chưa, hãy thử --dataset.rgb_encoder.vcodec=auto
Bộ dữ liệu được ghi thiếu các khung hìnhSự thiếu hụt CPU/GPU hoặc các đợt tăng tải đột ngộtNếu ~5% các khung hình bị thiếu, hệ thống của bạn có khả năng đang quá tải — hãy làm theo các khuyến nghị ở trên. Nếu ít khung hình bị thiếu hơn (~2%), chúng có thể do các đợt tăng tải tạm thời thỉnh thoảng xảy ra (thường là khi khởi động) và có thể được coi là bình thường.

6. Cấu hình được khuyến nghị

Các ước tính này mang tính thận trọng; chúng tôi khuyến nghị bạn kiểm tra chúng trên hệ thống của mình—bắt đầu với tải thấp và tăng dần.

Hệ thống cao cấp: 12+ lõi hiện đại (24+ luồng)

Thông lượng khoảng ~250-500M px/sec nên là mức thoải mái trên CPU. Để có kết quả tốt hơn, hãy thử mã hóa phần cứng nếu có sẵn.

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

Hệ thống tầm trung: 8+ lõi hiện đại (16+ luồng) hoặc Apple Silicon

Thông lượng khoảng ~80-300M px/giây nên có thể đạt được trên CPU.

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

Hệ thống tài nguyên thấp: 4+ lõi hiện đại (8+ luồng) hoặc Raspberry Pi 5

Trên các hệ thống có tài nguyên rất hạn chế, việc mã hóa theo dạng streaming có thể cạnh tranh quá mạnh với vòng lặp ghi hình. Việc tắt tính năng này sẽ quay lại phương pháp dựa trên PNG, trong đó quá trình mã hóa diễn ra giữa các episode (có tính chặn, nhưng không gây nhiễu cho quá trình ghi hình). Ngoài ra, hãy cân nhắc ghi hình với thông lượng thấp hơn để giảm tải cho cả quá trình ghi hình lẫn mã hóa. Bạn cũng nên xem xét đổi codec sang h264 và sử dụng mã hóa theo lô.

# 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. Ghi chú kết

Hiệu năng cuối cùng phụ thuộc vào cấu hình cụ thể của bạn — số khung hình mỗi giây, độ phân giải, số lõi CPU và tải, bộ nhớ khả dụng, độ dài episode, và trình mã hóa bạn chọn. Luôn kiểm thử với khối lượng công việc mục tiêu, lưu ý đến khả năng của CPU & hệ thống và điều chỉnh encoder_threads, encoder_queue_maxsize, và vcodec một cách hợp lý. Mặc dù vậy, một cấu hình thực tế phổ biến (cho nhiều ứng dụng) là ba camera ở 640×480x3 @30fps; cấu hình này thường chạy ổn với các cài đặt mã hóa video streaming mặc định trên các hệ thống hiện đại. Luôn xác minh bộ dữ liệu đã ghi của bạn có hoạt động bình thường không bằng cách so sánh thời lượng video với thời lượng episode từ CLI và xác nhận số dòng bằng FPS × thời lượng CLI.

Update on GitHub