# Исследование сжатия видеопотока в Lab026–Lab027 ## 1. Назначение исследований Lab026, Lab026B и Lab027 исследуют способы уменьшения полезной нагрузки видеоканала для системы управления ровером через ретранслятор. На рассматриваемом этапе измеряется только полезная нагрузка, формируемая средствами покадрового кодирования изображения. Исследования не включают радиопередачу и не определяют профиль как автоматически безопасный для управления. Последовательность исследований: ```text Lab026 | +-- разрешение кадра +-- частота кадров +-- color / grayscale +-- JPEG Quality | v Контрольный профиль: 320x180, grayscale, 2 fps, JPEG Q40 | +--> Lab026B: 4-битная яркость и индексированный цвет | +--> Lab027: раздельная передача общего кадра BASE и области ROI ``` ## 2. Исходное видео Во всех трёх лабораторных использован один файл: ```text data/raw/lab026_rover_source.mp4 ``` | Параметр | Значение | |---|---:| | Размер файла | 7 790 985 байт | | Разрешение | 1280x720 | | Частота кадров | 30.000000 кадр/с | | Число кадров | 623 | | Длительность | 20.766667 с | | Приблизительный файловый битрейт | 3001.343 кбит/с | ## 3. Метод покадрового JPEG-сжатия Lab026 и JPEG-режимы последующих лабораторных используют независимое покадровое сжатие: ```text исходный кадр | +--> изменение разрешения | +--> преобразование color / grayscale по параметрам профиля | +--> cv2.imencode(..., JPEG Quality) | +--> размер JPEG в байтах | +--> cv2.imdecode(...) | +--> расчёт PSNR ``` JPEG кодируется и декодируется в памяти. Отдельные JPEG-файлы на диск не сохраняются. Межкадровое предсказание не используется. Кадры для заданной частоты выбираются по временной шкале. В общем виде: ```text frame_time = frame_index / source_fps кадр выбирается, если: frame_time + 1e-9 >= next_sample_time после выбора: next_sample_time += 1 / target_fps ``` ## 4. Lab026: разрешение, FPS, grayscale и JPEG Quality ### 4.1. Изменение FPS Условия серии: 640x360, grayscale, JPEG Q50. | Целевой FPS | Выбрано кадров | Payload, кбит/с | PSNR, дБ | |---:|---:|---:|---:| | 30 | 623 | 3936.913 | 37.350 | | 10 | 208 | 1402.877 | 36.370 | | 5 | 104 | 702.043 | 36.353 | | 2 | 42 | 284.084 | 36.320 | | 1 | 21 | 142.273 | 36.288 | | 0.5 | 11 | 73.821 | 36.372 | | 0.2 | 5 | 35.247 | 35.860 | ### 4.2. Изменение разрешения Условия серии: 5 кадр/с, grayscale, JPEG Q50. | Разрешение | Выбрано кадров | Payload, кбит/с | PSNR, дБ | |---|---:|---:|---:| | 1280x720 | 104 | 2121.333 | 39.608 | | 960x540 | 104 | 1314.376 | 38.632 | | 640x360 | 104 | 702.043 | 36.353 | | 480x270 | 104 | 431.824 | 36.172 | | 320x180 | 104 | 227.294 | 35.069 | | 160x90 | 104 | 80.918 | 33.586 | ### 4.3. Color, grayscale и JPEG Quality Условия серии: 640x360, 5 кадр/с. | Режим | JPEG Quality | Payload, кбит/с | PSNR, дБ | |---|---:|---:|---:| | color | 90 | 2113.639 | 39.694 | | color | 70 | 1117.677 | 36.029 | | color | 50 | 823.307 | 34.439 | | color | 30 | 605.629 | 32.766 | | color | 20 | 471.731 | 31.299 | | grayscale | 90 | 1809.440 | 42.575 | | grayscale | 70 | 957.219 | 38.032 | | grayscale | 50 | 702.043 | 36.353 | | grayscale | 30 | 511.658 | 34.702 | | grayscale | 20 | 392.150 | 33.304 | ### 4.4. Контрольный профиль В качестве контрольного профиля принят: | Параметр | Значение | |---|---:| | Разрешение | 320x180 | | Цветовой режим | grayscale | | Частота | 2 кадр/с | | JPEG Quality | 40 | | Выбрано кадров | 42 | | Payload bitrate | 80.283660 кбит/с | | Средний PSNR | 34.362114 дБ | Этот профиль используется как baseline в Lab026B и как контрольная точка для Lab027. ## 5. Lab026B: глубина 4 бита на пиксель ### 5.1. Исследованные представления Под 4-битной яркостью понимается индекс `0...15`, то есть 16 уровней серого. Восстановленное значение формируется по тому же индексу в диапазоне `0...255`. Под 4-битным индексированным цветом понимается один индекс `0...15` на пиксель и палитра не более 16 RGB-цветов на кадр. Это не RGB444: RGB444 использует по 4 бита на каждый из трёх каналов, то есть 12 бит на пиксель. Исследованы пять режимов: | Режим | Представление | |---|---| | `gray8_jpeg` | Контрольный grayscale JPEG Q40 | | `gray4_jpeg` | 16 уровней серого, восстановление в `uint8`, JPEG Q40 | | `gray4_packed_zlib` | Два 4-битных индекса в байте, zlib level 9, заголовок 16 байт | | `color16_png` | До 16 цветов, без дизеринга, индексированный PNG | | `color16_packed_zlib` | 4-битные индексы, zlib level 9, заголовок 16 байт, палитра 48 байт | ### 5.2. Результаты при 320x180 и 2 кадр/с | Режим | Payload, кбит/с | Средний PSNR, дБ | |---|---:|---:| | `gray8_jpeg` | 80.283660 | 34.362114 | | `gray4_jpeg` | 88.417849 | 32.588941 | | `gray4_packed_zlib` | 169.916148 | 34.397012 | | `color16_png` | 143.121669 | 25.384724 | | `color16_packed_zlib` | 140.568347 | 25.384724 | ### 5.3. Зафиксированный отрицательный результат В Lab026B уменьшение глубины до 4 бит не позволило повысить разрешение кадра в пределах 100 кбит/с. До 100 кбит/с прошли только два профиля: | Профиль | Разрешение | Payload, кбит/с | Средний PSNR, дБ | |---|---|---:|---:| | `320x180_gray8_jpeg_2fps` | 320x180 | 80.283660 | 34.362114 | | `320x180_gray4_jpeg_2fps` | 320x180 | 88.417849 | 32.588941 | Профилей с разрешением больше 320x180 и payload не более 80.283660 кбит/с не получено. Цветных `color16`-профилей до 100 кбит/с также не получено. ## 6. Lab027: многомасштабная передача BASE + ROI ### 6.1. Принцип В Lab027 один профиль состоит из двух независимых JPEG-потоков: ```text исходный полноразмерный кадр | +--> BASE | полный grayscale-кадр | собственные разрешение, FPS и JPEG Quality | +--> ROI вырезка из исходного кадра собственные разрешение, FPS и JPEG Quality приёмная реконструкция 640x360: декодированный BASE | +--> масштабирование до 640x360 | +--> наложение последнего декодированного ROI в геометрическое положение области интереса ``` BASE и ROI обновляются независимо по временной шкале. Между обновлениями удерживается последнее декодированное состояние каждого потока. ### 6.2. Фиксированная ROI Нормализованные координаты: ```text x_min = 0.20 x_max = 0.80 y_min = 0.42 y_max = 1.00 ``` Для исходного кадра 1280x720 используются координаты: ```text x = 256...1024 y = 302...720 ``` Область занимает центральные 60% ширины и нижние 58% высоты кадра. ROI фиксирована и не использует автоматическое распознавание дороги, нейронные сети или детекторы объектов. ### 6.3. Результаты ROI-профилей | Профиль | BASE | ROI | BASE, кбит/с | ROI, кбит/с | Total, кбит/с | Full PSNR, дБ | ROI PSNR, дБ | |---|---|---|---:|---:|---:|---:|---:| | `base240_1fps_q25_roi320_2fps_q35` | 240x135, 1 FPS, Q25 | 320x180, 2 FPS, Q35 | 19.592167 | 73.683467 | 93.275634 | 19.657187 | 19.574377 | | `base240_0_5fps_q25_roi320_2fps_q35` | 240x135, 0.5 FPS, Q25 | 320x180, 2 FPS, Q35 | 10.150112 | 73.683467 | 83.833579 | 18.613817 | 19.574377 | | `base160_1fps_q25_roi320_2fps_q35` | 160x90, 1 FPS, Q25 | 320x180, 2 FPS, Q35 | 11.511525 | 73.683467 | 85.194992 | 19.701304 | 19.574377 | | `base240_1fps_q25_roi448_1fps_q30` | 240x135, 1 FPS, Q25 | 448x252, 1 FPS, Q30 | 19.592167 | 56.932392 | 76.524559 | 19.098790 | 17.871555 | | `base240_0_5fps_q25_roi448_1fps_q30` | 240x135, 0.5 FPS, Q25 | 448x252, 1 FPS, Q30 | 10.150112 | 56.932392 | 67.082504 | 18.113877 | 17.871555 | | `base320_1fps_q30_roi320_1fps_q35` | 320x180, 1 FPS, Q30 | 320x180, 1 FPS, Q35 | 33.862343 | 36.738491 | 70.600835 | 19.121457 | 17.888190 | | `base240_1fps_q20_roi320_1fps_q30` | 240x135, 1 FPS, Q20 | 320x180, 1 FPS, Q30 | 17.180610 | 33.306453 | 50.487063 | 19.107784 | 17.873870 | | `base160_0_5fps_q20_roi320_2fps_q30` | 160x90, 0.5 FPS, Q20 | 320x180, 2 FPS, Q30 | 5.323917 | 66.820546 | 72.144462 | 18.664976 | 19.549559 | Контрольный baseline при повторении в Lab027 составил 80.270177 кбит/с. Контрольное значение из Lab026, используемое для сравнения, равно 80.283660 кбит/с. ### 6.4. Основной режим В качестве основного режима в этом описании зафиксирован профиль: ```text base160_1fps_q25_roi320_2fps_q35 ``` | Компонент | Параметры | |---|---| | BASE | 160x90, 1 кадр/с, JPEG Q25 | | ROI | 320x180, 2 кадр/с, JPEG Q35 | | BASE bitrate | 11.511525 кбит/с | | ROI bitrate | 73.683467 кбит/с | | Total payload bitrate | 85.194992 кбит/с | | Mean reconstructed full PSNR | 19.701304 дБ | | Mean reconstructed ROI PSNR | 19.574377 дБ | ### 6.5. Аварийный режим В качестве аварийного режима в этом описании зафиксирован профиль: ```text base240_1fps_q20_roi320_1fps_q30 ``` | Компонент | Параметры | |---|---| | BASE | 240x135, 1 кадр/с, JPEG Q20 | | ROI | 320x180, 1 кадр/с, JPEG Q30 | | BASE bitrate | 17.180610 кбит/с | | ROI bitrate | 33.306453 кбит/с | | Total payload bitrate | 50.487063 кбит/с | | Mean reconstructed full PSNR | 19.107784 дБ | | Mean reconstructed ROI PSNR | 17.873870 дБ | ## 7. Расчёт payload bitrate Для одного JPEG-потока: ```text total_payload_bytes = сумма размеров выбранных JPEG-кадров payload_bitrate_bps = total_payload_bytes * 8 / source_duration_seconds payload_bitrate_kbps = payload_bitrate_bps / 1000 ``` Для Lab027: ```text total_payload_bytes = total_base_bytes + total_roi_bytes base_bitrate_kbps = total_base_bytes * 8 / source_duration_seconds / 1000 roi_bitrate_kbps = total_roi_bytes * 8 / source_duration_seconds / 1000 total_payload_bitrate_kbps = base_bitrate_kbps + roi_bitrate_kbps ``` Lab026B использует тот же принцип подсчёта полезной нагрузки, но размер кадра определяется выбранным режимом: JPEG, индексированный PNG либо упакованные и сжатые zlib индексы вместе с предусмотренными заголовком и палитрой. ## 8. Неучтённые накладные расходы радиоканала В приведённые значения payload bitrate пока не включены: - заголовки радиопакетов и служебные поля радиопротокола; - преамбула; - CRC; - FEC; - фрагментация кадров по радиопакетам; - межпакетные интервалы; - повторные передачи; - команды управления. Значения также не включают оценку задержки полного тракта. PSNR и статические сравнительные изображения не заменяют ручную оценку пригодности изображения. Фиксированная ROI не гарантирует попадания препятствия в область интереса. ## 9. Итоговый рабочий видеорежим после Lab027C–Lab027E Динамические сравнения Lab027C и Lab027D подтвердили, что раздельное асинхронное обновление BASE и ROI заметно оператору. Синхронное формирование обеих частей из одного исходного кадра устранило их визуальное рассогласование. Частота 2 кадр/с оказалась недостаточной, а 3 кадр/с по результатам ручной оценки признаны приемлемыми. В качестве рабочего компромисса выбран следующий профиль: | Компонент | Рабочие параметры | |---|---| | BASE | 240x135, grayscale, JPEG Q23 | | ROI | 320x180, grayscale, JPEG Q33 | | Обновление | синхронное и атомарное | | Частота составного изображения | 3 кадр/с | | JPEG payload | 156.342279 кбит/с | | Оценка с 10% overhead и FEC 2/3 | 257.964761 кбит/с | | Оценка с 10% overhead и FEC 1/2 | 343.953014 кбит/с | Расчёт иллюстративных канальных скоростей: ```text channel_rate_fec_2_3_kbps = payload_kbps * 1.10 / (2 / 3) channel_rate_fec_1_2_kbps = payload_kbps * 1.10 / (1 / 2) ``` JPEG Q20 для BASE и Q30 для ROI признаны приемлемыми. Профиль Q23/Q33 выбран как рабочий компромисс качества и потока. Визуальная разница между Q23/Q33 и Q25/Q35 практически отсутствует, поэтому увеличение потока для Q25/Q35 не дало заметного преимущества при ручной оценке. При скорости ровера 25 км/ч линейная скорость равна примерно 6.944 м/с. При трёх составных кадрах в секунду ровер проходит: ```text 6.944 м/с / 3 кадр/с = 2.315 м/кадр ``` То есть между соседними составными изображениями ровер перемещается примерно на 2.31 м. Эта оценка не включает задержку кодирования, радиоканала, ретранслятора, декодирования и реакции оператора. Lab027E дополнительно использовала playback 0.5x для локальной визуальной имитации более медленного движения сцены. Замедление применялось только при создании операторского preview и не является частью передаваемого радиоканального формата. Реальная скорость автомобиля в исходном видео неизвестна.