Android 12 相机图像测试套件版本说明

Android 12 版本中包含许多 Camera ITS 变更。本页总结了归为四个大类的变更:

重构为 Python 3

由于 Python 2.7 于 2020 年 1 月弃用,因此整个 Camera ITS 代码库都重构为 Python 3。Android 12 中需要以下 Python 版本和库:

主测试启动器 tools/run_all_tests.py 与 Android 11 或更低版本相同,并已重构为 Python 3。

所有单个测试都已重构,并使用在 tests/its_base_test.py 中定义的新测试设置类。大多数测试名称和功能保持不变。在 Android 12 中,所有单个测试现在都加载其场景。虽然每个测试的场景加载都会增加总体测试时间,但它可以调试单个测试。

如需详细了解单个测试变更,请参阅测试变更

以下 Python 模块已重构,名称已更改:

  • pymodules/its/caps.pyutils/camera_properties_utils.py
  • pymodules/its/cv2image.pyutils/opencv_processing_utils.py
  • pymodules/its/device.pyutils/its_session_utils.py
  • pymodules/its/error.pyutils/error_util.py
  • pymodules/its/image.pyutils/image_processing_utils.py
  • pymodules/its/objects.pyutils/capture_request_utils.py
  • pymodules/its/target.pyutils/target_exposure_utils.py
  • tools/hw.pyutils/sensor_fusion_utils.py

采用 Mobly 测试框架

Mobly 是一个基于 Python 的测试框架,支持需要多台设备和自定义硬件设置的测试用例。Camera ITS 使用 Mobly 测试基础架构,以便更好地控制和记录测试。

Camera ITS 使用 Mobly 测试基础架构,以便更好地控制和记录测试。Mobly 是一个基于 Python 的测试框架,支持需要多台设备和自定义硬件设置的测试用例。如需详细了解 Mobly,请参阅 google/mobly

config.yml 文件

借助 Mobly 框架,您可以在 its_base_test 类中设置被测设备 (DUT) 和图表平板电脑。config.yml (YAML) 文件用于创建 Mobly 测试平台。可以在此配置文件中配置多个测试平台,例如,平板电脑和传感器融合测试平台。在每个测试平台的控制器部分中,您可以指定 device_ids 以标识要用于测试运行程序的相应 Android 设备。除了设备 ID 之外,其他参数(例如平板电脑 brightnesschart_distancedebug_modecamera_idscene_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 文件值运行。此外,您可以使用类似于 Android 11 或更低版本的命令,在命令行中替换 camerascene 配置文件值。

例如:

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 在测试平台名称中将测试标识为手动测试。此外,测试平台不能包含平板电脑 ID。

以下是手动测试的 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_SCENESTEST_BED_MANUAL 完成。但是,如果使用 TEST_BED_TABLET_SCENES 进行测试,则即使不使用平板电脑,也必须连接平板电脑,并且平板电脑序列号必须有效,因为测试类设置会为平板电脑分配序列号值。

运行单个测试

只能出于调试目的运行单个测试,因为其结果不会报告给 CTS 验证程序。由于无法在命令行中为 camerascene 覆盖 config.yml 文件,因此这些参数在相关单个测试的 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.txttest_name_stderr.txt 中。
  • 来自每个单独测试的 DUT 和平板电脑 logcat 都存储在 /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_whitetest_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] 差异的容差,以消除白色图像中的色偏。

下表介绍了 Android 12 中合并的测试 scene1_1/test_black_white.py。

测试名称 首次 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 测试在 Android 12 中的 LIMITED 摄像头上运行。

scene1_2/test_yuv_plus_raw.py

test_yuv_plus_raw 测试在 Android 12 中的物理隐藏摄像头上运行。

scene2_a/test_format_combos.py

test_format_combos 测试在 Android 12 中的 LIMITED 摄像头上运行。

scene3/test_flip_mirror.py

test_flip_mirror 测试在 Android 12 中的 LIMITED 摄像头上运行。

scene4/test_aspect_ratio_and_crop.py

在 Android 12 中,重构了在 scene4/test_aspect_ratio_and_crop.py 中查找圆形的方法。

早期的 Android 版本使用一种方法,该方法涉及在父轮廓(正方形)内查找子轮廓(圆形),并使用尺寸和颜色过滤器。Android 12 使用一种方法,该方法涉及查找所有轮廓,然后通过查找最像圆形的特征进行过滤。为了滤除显示屏上的伪圆形,对最小轮廓区域有要求,并且圆形的轮廓必须为黑色。

下图显示了轮廓及其选择标准。

Conceptual drawing of contours and selection criteria

图 1. 轮廓和选择标准的概念图

Android 12 方法更简单,可解决某些显示平板电脑中边界框剪裁的问题。所有圆形候选对象都记录下来以进行调试。

在 Android 12 中,裁剪测试针对 FULLLEVEL3 设备运行。Android 11 或更低版本跳过了 FULL 设备的裁剪测试断言。

下表列出了与给定设备级别和首次 API 级别对应的 test_aspect_ratio_and_crop.py 的断言。

设备级别 首次 API 级别 断言
LIMITED 全部 纵横比
4:3、16:9、2:1 格式的 FoV
FULL < 31 纵横比
4:3、16:9、2:1 格式的 FoV
FULL ≥ 31 裁剪
纵横比
4:3、16:9、2:1 格式的 FoV
LEVEL3 全部 裁剪
纵横比
4:3、16:9、2:1 格式的 FoV

scene4/test_multi_camera_alignment.py

重构了 scene4/test_multi_camera_alignment.py 中 YUV 捕获的 undo_zoom() 方法,以更准确地考虑传感器上与捕获纵横比不匹配的裁剪。

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 特征检测之间的差异。提高最低特征要求阈值会导致检测到质量较差的特征,并对测量产生负面影响。

difference in feature detection between Android 11
and Android 12
sensor_fusion feature detection

图 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 捕获设置为完全饱和的 BLACKWHITEREDGREENBLUE 测试图案。由于测试图案定义是每个传感器拜耳图案,因此必须为每种颜色设置颜色通道,如下表所示。

颜色 testPatternData (RGGB)
BLACK (0, 0, 0, 0)
WHITE (1, 1, 1, 1)
RED (1, 0, 0, 0)
GREEN (0, 1, 1, 0)
BLUE (0, 0, 0, 1)

断言表

下表介绍了 test_solid_color_test_pattern.py 的测试断言。

相机
首次 API 级别
相机类型 断言的颜色
31 Bayer BLACK、WHITE、RED、GREEN、BLUE
31 MONO BLACK、WHITE
< 31 Bayer/MONO BLACK

性能等级测试

scene2_c/test_camera_launch_perf_class.py

验证前置和后置主摄像头的相机启动时间是否少于 500 毫秒(使用 scene2_c 人脸场景)。

scene2_c/test_jpeg_capture_perf_class.py

验证前置和后置主摄像头的 1080p JPEG 捕获延迟是否少于 1 秒(使用 scene2_c 人脸场景)。