Ряд изменений Camera ITS включен в выпуск Android 12. На этой странице представлены изменения, которые можно разделить на четыре основные категории:
Рефакторинг на 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
- Нампи 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
CameraITS_
добавлено к 8-символьной случайной строке для ясности. - Результаты теста и ошибки сохраняются в
test_log.DEBUG
для каждого теста вместоtest_name_stdout.txt
иtest_name_stderr.txt
. - Logcats 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] |
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.
scene1_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.
сцена4/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 |
сцена4/test_multi_camera_alignment.py
Метод undo_zoom()
для YUV-захватов в scene4/test_multi_camera_alignment.py
был переработан для более точного учета кадрирования на датчиках, которые не соответствуют соотношению сторон снимка.
Код Android 11 Python 2
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
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 | 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.