Ряд изменений Camera ITS включен в выпуск Android 12. На этой странице обобщены изменения, которые делятся на четыре основные категории:
Рефакторинг на Python 3
В связи с прекращением поддержки Python 2.7 в январе 2020 года вся кодовая база Camera ITS была переработана на Python 3. Для Android 12 требуются следующие версии Python и библиотеки:
- Питон 3.7.9 или Питон 3.7.10
- OpenCV3.4.2
- Numpy 1.19.2
- Matplotlib 3.3.2
- Сципи 1.5.2
- pySerial 3.5
- Подушка 8.1.0
- PyYAML5.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 test
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 test runner инициализирует 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
. - Журналы событий DUT и планшета по каждому отдельному тесту хранятся в каталоге
/tmp/CameraITS_########
что упрощает отладку, поскольку регистрируется вся информация, необходимая для отладки проблем 3A.
Тестовые изменения
В Android 12 сцены планшета — это файлы PNG, а не файлы PDF. Использование файлов PNG позволяет большему количеству моделей планшетов правильно отображать сцены.
сцена0/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] |
сцена1_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.
сцена1_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.
сцена3/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 | Утверждения |
---|---|---|
ОГРАНИЧЕННЫЙ | ВСЕ | Соотношение сторон FoV для форматов 4:3, 16:9, 2:1 |
ПОЛНЫЙ | < 31 | Соотношение сторон FoV для форматов 4:3, 16:9, 2:1 |
ПОЛНЫЙ | ≥ 31 | Обрезать Соотношение сторон FoV для форматов 4:3, 16:9, 2:1 |
УРОВЕНЬ3 | ВСЕ | Обрезать Соотношение сторон FoV для форматов 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
Новые тесты
сцена0/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.