В версию Android 12 включен ряд изменений Camera ITS . На этой странице обобщены изменения, которые можно разделить на четыре широкие категории:
Рефакторинг на Python 3
В связи с прекращением поддержки Python 2.7 в январе 2020 года вся кодовая база Camera ITS была переработана на Python 3. Для Android 12 требуются следующие версии и библиотеки Python:
- Питон 3.7.9 или Питон 3.7.10
- ОпенКВ 3.4.2
- Нампи 1.19.2
- Матплотлиб 3.3.2
- Сципи 1.5.2
- pySerial 3.5
- Подушка 8.1.0
- ПиЯМЛ 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
. Файл 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 инициализирует 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
выполняется на камерах LIMITED в Android 12.
сцена1_2/test_yuv_plus_raw.py
Тест test_yuv_plus_raw
выполняется на физических скрытых камерах в Android 12.
Scene2_a/test_format_combos.py
Тест test_format_combos
выполняется на камерах LIMITED в Android 12.
Scene3/test_flip_mirror.py
Тест test_flip_mirror
выполняется на камерах LIMITED в 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
Код Android 12 Python 3
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
датчик_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 | 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
. Поскольку определение тестового шаблона соответствует шаблону Байера датчика, цветовые каналы должны быть установлены для каждого цвета, как показано в следующей таблице.
Цвет | тестпаттерндата (РГГБ) |
---|---|
ЧЕРНЫЙ | (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.