В версию 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.