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

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

Рефакторинг на 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

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

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

файлы config.yml

С помощью фреймворка Mobly вы можете настроить тестируемое устройство (DUT) и планшет для диаграммы в классе its_base_test . Для создания тестового стенда Mobly используется файл config.yml (YAML). В этом конфигурационном файле можно настроить несколько тестовых стендов, например, планшет и тестовый стенд для слияния датчиков. В разделе контроллера каждого тестового стенда можно указать 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 инициализирует 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 .
  • Журналы регистрации проверяемого устройства и планшета для каждого отдельного теста хранятся в каталоге /tmp/CameraITS_######## что упрощает отладку, поскольку регистрируется вся информация, необходимая для отладки проблем 3A.

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

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

scene0/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]
scene1_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.

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

scene3/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 Утверждения
ОГРАНИЧЕННЫЙ ВСЕ Соотношение сторон
Угол обзора для форматов 4:3, 16:9, 2:1
ПОЛНЫЙ < 31 Соотношение сторон
Угол обзора для форматов 4:3, 16:9, 2:1
ПОЛНЫЙ ≥ 31 Обрезать
Соотношение сторон
Угол обзора для форматов 4:3, 16:9, 2:1
УРОВЕНЬ3 ВСЕ Обрезать
Соотношение сторон
Угол обзора для форматов 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

Новые тесты

scene0/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.