Примечания к выпуску пакета тестирования изображения камеры 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 . Файл 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 инициализирует 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.

Scene1_1/test_black_white.py

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

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

Название теста Первый уровень API Утверждения
Scene1_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 Утверждения
Scene1_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 выполняется на камерах LIMITED в Android 12.

сцена1_2/test_yuv_plus_raw.py

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

Scene2_a/test_format_combos.py

Тест test_format_combos выполняется на камерах LIMITED в Android 12.

Scene3/test_flip_mirror.py

Тест test_flip_mirror выполняется на камерах LIMITED в 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 был переработан для более точного учета обрезки на датчиках, которые не соответствуют соотношению сторон захвата.

Код Android 11 Python 2

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

Код Android 12 Python 3

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

датчик_fusion/test_sensor_fusion.py

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

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

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

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

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

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

Новые тесты

Scene0/test_solid_color_test_pattern.py

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

Сцена Название теста Первый уровень API Описание
0 test_solid_color_test_pattern 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 . Поскольку определение тестового шаблона соответствует шаблону Байера датчика, цветовые каналы должны быть установлены для каждого цвета, как показано в следующей таблице.

Цвет тестпаттерндата (РГГБ)
ЧЕРНЫЙ (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.