Lab027: optimize synchronized ROI video stream
This commit is contained in:
405
docs/video_compression_research_lab026_lab027.md
Normal file
405
docs/video_compression_research_lab026_lab027.md
Normal file
@@ -0,0 +1,405 @@
|
||||
# Исследование сжатия видеопотока в 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 и не является
|
||||
частью передаваемого радиоканального формата. Реальная скорость
|
||||
автомобиля в исходном видео неизвестна.
|
||||
Reference in New Issue
Block a user