В релиз 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.
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 выполняется на камерах с ОГРАНИЧЕННЫМ набором функций в Android 12.
scene1_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
В Android 12 была переработана функция поиска кругов в scene4/test_aspect_ratio_and_crop.py .
В более ранних версиях 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
В Android 12 включен новый тест, test_solid_color_test_pattern . Этот тест включен для всех камер и описан в следующей таблице.
| Сцена | Название теста | Первый уровень 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 face.