В релиз 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_1test_black_white.py | ВСЕ | Короткая выдержка, низкие значения RGB с усилением ~[0, 0, 0] Длительная выдержка, высокие значения RGB ~[255, 255, 255] |
scene1_1test_channel_saturation.py | 29 | Снижен допуск на различия [255, 255, 255] для устранения цветового оттенка в белых изображениях. |
В следующей таблице описан объединённый тест scene1_1/test_black_white.py в Android 12.
| Название теста | Первый уровень API | Утверждения |
|---|---|---|
scene1_1test_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 11 и более ранних версиях для поиска 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 | 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 . Поскольку определение тестового шаблона соответствует шаблону Байера сенсора, цветовые каналы для каждого цвета должны быть заданы, как показано в следующей таблице.
| Цвет | 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.