В версию Android 12 включен ряд изменений в Camera ITS . На этой странице представлен обзор изменений, которые можно разделить на четыре основные категории:
Рефакторинг на Python 3
В связи с прекращением поддержки Python 2.7 в январе 2020 года вся кодовая база Camera ITS была переработана на Python 3. Для Android 12 требуются следующие версии Python и библиотеки:
- Python 3.7.9 или Python 3.7.10
- OpenCV 3.4.2
- Numpy 1.19.2
- Matplotlib 3.3.2
- Scipy 1.5.2
- pySerial 3.5
- Подушка 8.1.0
- PyYAML 5.3.1
 Основной тестовый лаунчер, tools/run_all_tests.py , остался таким же, как в версиях Android 11 и ниже, и был переработан под Python 3.
 Все отдельные тесты переработаны и используют новый класс настройки теста, определённый в tests/its_base_test.py . Названия и функциональность большинства тестов остались прежними. В Android 12 все отдельные тесты теперь загружают свои сцены. Хотя загрузка сцен для каждого теста увеличивает общее время тестирования, это позволяет отлаживать отдельные тесты.
Более подробную информацию об изменениях в отдельных тестах см. в разделе Изменения в тестах .
Следующие модули Python подверглись рефакторингу с изменением имени:
-  pymodules/its/caps.py→utils/camera_properties_utils.py
-  pymodules/its/cv2image.py→utils/opencv_processing_utils.py
-  pymodules/its/device.py→utils/its_session_utils.py
-  pymodules/its/error.py→utils/error_util.py
-  pymodules/its/image.py→utils/image_processing_utils.py
-  pymodules/its/objects.py→utils/capture_request_utils.py
-  pymodules/its/target.py→utils/target_exposure_utils.py
-  tools/hw.py→utils/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. Повышение минимального порога требований к функциям приводит к обнаружению функций низкого качества и отрицательно влияет на результаты измерений.

Рисунок 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.
