Files
SDR-Rover/docs/video_compression_research_lab026_lab027.md
2026-07-24 17:54:27 +03:00

406 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Исследование сжатия видеопотока в Lab026Lab027
## 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. Итоговый рабочий видеорежим после Lab027CLab027E
Динамические сравнения 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 и не является
частью передаваемого радиоканального формата. Реальная скорость
автомобиля в исходном видео неизвестна.