Примечания к выпуску пакета тестирования изображения камеры Android 12

Ряд изменений Camera ITS включен в выпуск Android 12. На этой странице обобщены изменения, которые делятся на четыре основные категории:

Рефакторинг на Python 3

В связи с прекращением поддержки Python 2.7 в январе 2020 года вся кодовая база Camera ITS была переработана на Python 3. Для Android 12 требуются следующие версии Python и библиотеки:

Основной лаунчер тестов, tools/run_all_tests.py , остался таким же, как в версиях Android 11 и ниже, и был переработан под Python 3.

Все отдельные тесты рефакторятся и используют новый класс настройки теста, определенный в tests/its_base_test.py . Большинство названий тестов и функций остаются прежними. В Android 12 все отдельные тесты теперь загружают свои сцены. Хотя загрузка сцены для каждого теста увеличивает общее время теста, она позволяет отлаживать отдельные тесты.

Более подробную информацию об изменениях в отдельных тестах см. в разделе Изменения в тестах .

Следующие модули Python подверглись рефакторингу с изменением имени:

  • pymodules/its/caps.pyutils/camera_properties_utils.py
  • pymodules/its/cv2image.pyutils/opencv_processing_utils.py
  • pymodules/its/device.pyutils/its_session_utils.py
  • pymodules/its/error.pyutils/error_util.py
  • pymodules/its/image.pyutils/image_processing_utils.py
  • pymodules/its/objects.pyutils/capture_request_utils.py
  • pymodules/its/target.pyutils/target_exposure_utils.py
  • tools/hw.pyutils/sensor_fusion_utils.py

Внедрение фреймворка Mobly test

Mobly — это тестовая среда на основе Python, поддерживающая тестовые случаи, требующие нескольких устройств с пользовательскими настройками оборудования. Camera ITS использует тестовую инфраструктуру Mobly для обеспечения лучшего контроля и регистрации тестов.

Camera ITS использует тестовую инфраструктуру Mobly для обеспечения лучшего контроля и регистрации тестов. Mobly — это тестовая среда на основе Python, поддерживающая тестовые случаи, требующие нескольких устройств с пользовательскими аппаратными настройками. Для получения дополнительной информации о Mobly см. google/mobly .

файлы config.yml

С помощью фреймворка Mobly вы можете настроить тестируемое устройство (DUT) и планшет диаграммы в классе its_base_test . Файл config.yml (YAML) используется для создания испытательного стенда Mobly. В этом файле конфигурации можно настроить несколько тестовых стендов, например, планшет и тестовый стенд слияния датчиков. В разделе контроллера каждого тестового стенда вы можете указать device_ids для идентификации соответствующих устройств Android для исполнителя теста. Помимо идентификаторов устройств, в тестовом классе передаются другие параметры, такие как brightness планшета, chart_distance , debug_mode , camera_id и scene_id . Обычные значения параметров теста:

brightness: 192  (all tablets except Pixel C)
chart_distance: 31.0  (rev1/rev1a box for FoV < 90° cameras)
chart_distance: 22.0 (rev2 test rig for FoV > 90° cameras)

Тестирование на планшете

Для тестирования на планшетах ключевое слово TABLET должно присутствовать в имени тестового стенда. Во время инициализации, Mobly test runner инициализирует TestParams и передает их отдельным тестам.

Ниже приведен пример файла config.yml для запусков на планшете.

TestBeds:
  - Name: TEST_BED_TABLET_SCENES
    # Test configuration for scenes[0:4, 6, _change]
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut
          - serial: 5B16001229
            label: tablet

    TestParams:
      brightness: 192
      chart_distance: 22.0
      debug_mode: "False"
      chart_loc_arg: ""
      camera: 0
      scene: <scene-name>  # if <scene-name> runs all scenes

Тестовый стенд можно вызвать с помощью tools/run_all_tests.py . Если значения командной строки отсутствуют, тесты запускаются со значениями файла config.yml . Кроме того, вы можете переопределить значения файлов конфигурации camera и scene в командной строке с помощью команд, аналогичных Android 11 или ниже.

Например:

python tools/run_all_tests.py
python tools/run_all_tests.py camera=1
python tools/run_all_tests.py scenes=2,1,0
python tools/run_all_tests.py camera=1 scenes=2,1,0

Тестирование слияния датчиков

Для тестирования слияния датчиков имя испытательного стенда должно включать ключевое слово SENSOR_FUSION . Правильный испытательный стенд определяется тестируемыми сценами. Android 12 поддерживает контроллеры Arduino и Canakit для слияния датчиков .

Ниже приведен пример файла config.yml для запусков слияния датчиков.

Testbeds
  - Name: TEST_BED_SENSOR_FUSION
    # Test configuration for sensor_fusion/test_sensor_fusion.py
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut

    TestParams:
      fps: 30
      img_size: 640,480
      test_length: 7
      debug_mode: "False"
      chart_distance: 25
      rotator_cntl: arduino         # cntl can be arduino or canakit
      rotator_ch: 1
      camera: 0

Для проведения испытаний на слияние датчиков с помощью испытательной установки на слияние датчиков используйте:

python tools/run_all_tests.py scenes=sensor_fusion
python tools/run_all_tests.py scenes=sensor_fusion camera=0

Несколько испытательных стендов

В файл конфигурации можно включить несколько тестовых стендов. Наиболее распространенная комбинация — иметь как тестовый стенд планшета, так и тестовый стенд слияния датчиков.

Ниже приведен пример файла config.yml с тестовыми стендами для планшета и слияния датчиков.

Testbeds
  - Name: TEST_BED_TABLET_SCENES
    # Test configuration for scenes[0:4, 6, _change]
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut
          - serial: 5B16001229
            label: tablet

    TestParams:
      brightness: 192
      chart_distance: 22.0
      debug_mode: "False"
      chart_loc_arg: ""
      camera: 0
      scene: <scene-name>  # if <scene-name> runs all scenes

  - Name: TEST_BED_SENSOR_FUSION
    # Test configuration for sensor_fusion/test_sensor_fusion.py
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut

    TestParams:
      fps: 30
      img_size: 640,480
      test_length: 7
      debug_mode: "False"
      chart_distance: 25
      rotator_cntl: arduino         # cntl can be arduino or canakit
      rotator_ch: 1
      camera: 0

Ручное тестирование

Ручное тестирование по-прежнему поддерживается в Android 12. Однако тестовый стенд должен идентифицировать тестирование как таковое с ключевым словом MANUAL в названии тестового стенда. Кроме того, тестовый стенд не может включать идентификатор планшета.

Ниже приведен пример файла config.yml для ручного тестирования.

TestBeds:
  - Name: TEST_BED_MANUAL
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut

    TestParams:
      debug_mode: "False"
      chart_distance: 31.0
      camera: 0
      scene: scene1

Тестовые сцены без планшетов

Тестирование для сцены 0 и сцены 5 можно выполнить с помощью TEST_BED_TABLET_SCENES или TEST_BED_MANUAL . Однако, если тестирование выполняется с помощью TEST_BED_TABLET_SCENES , планшет должен быть подключен, а серийный идентификатор планшета должен быть действительным, даже если планшет не используется, поскольку настройка тестового класса назначает значение серийного идентификатора для планшета.

Проведение индивидуальных тестов

Отдельные тесты можно запускать только в целях отладки, поскольку их результаты не передаются в CTS Verifier . Поскольку файлы config.yml не могут быть перезаписаны в командной строке для camera и scene , эти параметры должны быть правильными в файле config.yml для отдельного рассматриваемого теста. Кроме того, если в файле конфигурации есть более одного тестового стенда, необходимо указать тестовый стенд с помощью флага --test_bed . Например:

python tests/scene1_1/test_black_white.py --config config.yml --test_bed TEST_BED_TABLET_SCENES

Тестовые артефакты

В Android 12 тестовые артефакты для Camera ITS хранятся аналогично Android 11 или более ранним версиям, но со следующими изменениями:

  • Для ясности в каталоге тестового артефакта /tmp к случайной строке из 8 символов добавлен префикс CameraITS_ .
  • Тестовые выходные данные и ошибки сохраняются в test_log.DEBUG для каждого теста вместо test_name_stdout.txt и test_name_stderr.txt .
  • Журналы событий DUT и планшета по каждому отдельному тесту хранятся в каталоге /tmp/CameraITS_######## что упрощает отладку, поскольку регистрируется вся информация, необходимая для отладки проблем 3A.

Тестовые изменения

В Android 12 сцены планшета — это файлы PNG, а не файлы PDF. Использование файлов PNG позволяет большему количеству моделей планшетов правильно отображать сцены.

сцена0/test_jitter.py

Тест test_jitter выполняется на физических скрытых камерах в Android 12.

сцена1_1/test_black_white.py

Для Android 12 test_black_white обладает функциональностью как test_black_white , так и test_channel_saturation .

В следующей таблице описаны два отдельных теста в Android 11.

Название теста Первый уровень API Утверждения
сцена1_1/test_black_white.py ВСЕ Короткая выдержка, низкое усиление значений RGB ~[0, 0, 0]
Длительная выдержка, высокие значения RGB усиления ~[255, 255, 255]
сцена1_1/test_channel_saturation.py 29 Уменьшен допуск на различия [255, 255, 255] для устранения цветового оттенка на белых изображениях.

В следующей таблице описывается объединенный тест scene1_1/test_black_white.py в Android 12.

Название теста Первый уровень API Утверждения
сцена1_1/test_black_white.py ВСЕ Короткая выдержка, низкое усиление значений RGB ~[0, 0, 0]
Длительная выдержка, высокие значения RGB усиления ~[255, 255, 255] и уменьшенный допуск между значениями для устранения цветового оттенка на белых изображениях.

scene1_1/test_burst_sameness_manual.py

Тест test_burst_sameness_manual выполняется на физических скрытых камерах в Android 12.

сцена1_2/test_tonemap_sequence.py

Тест test_tonemap_sequence работает на ОГРАНИЧЕННОМ количестве камер в Android 12.

сцена1_2/test_yuv_plus_raw.py

Тест test_yuv_plus_raw выполняется на физических скрытых камерах в Android 12.

scene2_a/test_format_combos.py

Тест test_format_combos работает на ОГРАНИЧЕННЫХ камерах в Android 12.

сцена3/test_flip_mirror.py

Тест test_flip_mirror работает на ОГРАНИЧЕННЫХ камерах в Android 12.

scene4/test_aspect_ratio_and_crop.py

Поиск кругов в scene4/test_aspect_ratio_and_crop.py был переработан в Android 12.

В более ранних версиях Android использовался метод, который включал поиск дочернего контура (круга) внутри родительского контура (квадрата) с фильтрами по размеру и цвету. В Android 12 используется метод, который включает поиск всех контуров и последующую фильтрацию путем поиска наиболее округлых объектов. Чтобы отсеять ложные круги на дисплее, требуется минимальная площадь контура, а контур круга должен быть черным.

Контуры и критерии их выбора показаны на следующем рисунке.

Концептуальный рисунок контуров и критериев выбора

Рисунок 1. Концептуальный рисунок контуров и критериев выбора

Метод Android 12 проще и решает проблему с обрезкой ограничивающей рамки в некоторых планшетах. Все кандидаты на круги регистрируются для целей отладки.

В Android 12 тест обрезки выполняется для устройств FULL и LEVEL3 . В Android 11 и более ранних версиях утверждения теста обрезки для устройств FULL пропускаются.

В следующей таблице перечислены утверждения для test_aspect_ratio_and_crop.py , которые соответствуют заданному уровню устройства и первому уровню API.

Уровень устройства Первый уровень API Утверждения
ОГРАНИЧЕННЫЙ ВСЕ Соотношение сторон
FoV для форматов 4:3, 16:9, 2:1
ПОЛНЫЙ < 31 Соотношение сторон
FoV для форматов 4:3, 16:9, 2:1
ПОЛНЫЙ ≥ 31 Обрезать
Соотношение сторон
FoV для форматов 4:3, 16:9, 2:1
УРОВЕНЬ3 ВСЕ Обрезать
Соотношение сторон
FoV для форматов 4:3, 16:9, 2:1

scene4/test_multi_camera_alignment.py

Метод undo_zoom() для захватов YUV в scene4/test_multi_camera_alignment.py был переработан для более точного учета обрезки на сенсорах, которые не соответствуют соотношению сторон захвата.

Код Python 2 для Android 11

zoom_ratio = min(1.0 * yuv_w / cr_w, 1.0 * yuv_h / cr_h)
circle[i]['x'] = cr['left'] + circle[i]['x'] / zoom_ratio
circle[i]['y'] = cr['top'] + circle[i]['y'] / zoom_ratio
circle[i]['r'] = circle[i]['r'] / zoom_ratio

Код Python 3 для Android 12

yuv_aspect = yuv_w / yuv_h
relative_aspect = yuv_aspect / (cr_w/cr_h)
if relative_aspect > 1:
  zoom_ratio = yuv_w / cr_w
  yuv_x = 0
  yuv_y = (cr_h - cr_w / yuv_aspect) / 2
else:
  zoom_ratio = yuv_h / cr_h
  yuv_x = (cr_w - cr_h * yuv_aspect) / 2
  yuv_y = 0
circle['x'] = cr['left'] + yuv_x + circle['x'] / zoom_ratio
circle['y'] = cr['top'] + yuv_y + circle['y'] / zoom_ratio
circle['r'] = circle['r'] / zoom_ratio

sensor_fusion/test_sensor_fusion.py

В Android 12 добавлен метод обнаружения особенностей на изображениях для теста слияния датчиков.

В версиях ниже Android 12 для поиска 240 лучших характеристик используется все изображение, которое затем маскируется до 20% в центре, чтобы избежать эффекта роллинг-шаттера, при этом минимальное количество характеристик составляет 30.

Если функций, найденных этим методом, недостаточно, Android 12 сначала маскирует область обнаружения функций до 20% в центре и ограничивает максимальное количество функций до двухкратного превышения минимального требуемого количества функций.

На следующем изображении показана разница между обнаружением функций Android 11 и Android 12. Повышение минимального порогового значения требований к функциям приводит к обнаружению функций низкого качества и отрицательно влияет на измерения.

разница в обнаружении функций между Android 11 и Android 12 sensor_fusion обнаружение функций

Рисунок 2. Разница в обнаружении функций между Android 11 и Android 12

Новые тесты

сцена0/test_solid_color_test_pattern.py

Новый тест test_solid_color_test_pattern включен для Android 12. Этот тест включен для всех камер и описан в следующей таблице.

Сцена Название теста Первый уровень API Описание
0 тестовый_сплошной_цвет_тестовый_шаблон 31 Подтверждает вывод сплошного цветного изображения и возможность программирования цвета изображения.

Для поддержки режима конфиденциальности камеры необходимо включить тестовые шаблоны сплошного цвета. Тест test_solid_color_test_pattern подтверждает вывод изображения YUV сплошного цвета с цветом, определенным выбранным шаблоном, а цвет изображения изменяется в соответствии со спецификацией.

Параметры

  • cameraPrivacyModeSupport : определяет, поддерживает ли камера режим конфиденциальности.
  • android.sensor.testPatternMode : Устанавливает режим тестового шаблона. Этот тест использует SOLID_COLOR .
  • android.sensor.testPatternData : устанавливает значения тестового шаблона R, Gr, Gb, G для режима тестового шаблона.

Описание тестового шаблона сплошного цвета см. в разделе SENSOR_TEST_PATTERN_MODE_SOLID_COLOR .

Метод

Кадры YUV захватываются для заданных параметров, и содержимое изображения проверяется. Тестовый шаблон выводится непосредственно с датчика изображения, поэтому не требуется конкретная сцена. Если поддерживается PER_FRAME_CONTROL , захватывается один кадр YUV для каждой протестированной настройки. Если PER_FRAME_CONTROL не поддерживается, захватываются четыре кадра, и только последний кадр анализируется для максимального охвата теста в LIMITED камерах.

Захваты YUV настроены на полностью насыщенные BLACK , WHITE , RED , GREEN и BLUE тестовые шаблоны. Поскольку определение тестового шаблона соответствует шаблону Байера датчика, цветовые каналы должны быть установлены для каждого цвета, как показано в следующей таблице.

Цвет testPatternData (RGGB)
ЧЕРНЫЙ (0, 0, 0, 0)
БЕЛЫЙ (1, 1, 1, 1)
КРАСНЫЙ (1, 0, 0, 0)
ЗЕЛЕНЫЙ (0, 1, 1, 0)
СИНИЙ (0, 0, 0, 1)

Таблица утверждений

В следующей таблице описаны тестовые утверждения для test_solid_color_test_pattern.py .

Камера
Первый уровень API
Тип камеры Цвета утверждены
31 Байер ЧЕРНЫЙ, БЕЛЫЙ, КРАСНЫЙ, ЗЕЛЕНЫЙ, СИНИЙ
31 МОНОНУКЛЕОЗ ЧЁРНЫЙ, БЕЛЫЙ
< 31 Байер/МОНО ЧЕРНЫЙ

Тесты класса производительности

scene2_c/test_camera_launch_perf_class.py

Проверяет, что время запуска камеры составляет менее 500 мс для обеих основных камер — передней и задней — при использовании сцены лица scene2_c.

scene2_c/test_jpeg_capture_perf_class.py

Проверяет, что задержка захвата изображения JPEG 1080p составляет менее 1 секунды для обеих основных камер — передней и задней — с использованием сцены лица scene2_c.