Android 12 相机图像测试套件发行说明

Android 12 版本中包含许多相机 ITS更改。本页总结了这些变化,分为四大类:

重构为 Python 3

由于 2020 年 1 月弃用了 Python 2.7,整个相机 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 的测试框架,支持需要具有自定义硬件设置的多个设备的测试用例。相机 ITS 使用 Mobly 测试基础设施来更好地控制和记录测试。

相机 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进行测试,则必须连接平板电脑,并且即使未使用平板电脑,平板电脑序列 ID 也必须有效,因为测试类设置会为平板电脑分配序列 ID 值。

运行单独的测试

单独的测试只能出于调试目的而运行,因为它们的结果不会报告给CTS Verifier 。由于无法在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 中,相机 ITS 的测试工件的存储方式与 Android 11 或更低版本类似,但有以下更改:

  • 为清楚起见,测试工件/tmp目录已将CameraITS_添加到 8 个字符的随机字符串前面。
  • 每个测试的测试输出和错误都存储在test_log.DEBUG中,而不是test_name_stdout.txttest_name_stderr.txt中。
  • 每个单独测试的 DUT 和平板电脑日志都存储在/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 中的有限相机上运行。

scene1_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 中,裁剪测试针对FULLLEVEL3设备运行。 Android 11 或更低版本会跳过FULL设备的裁剪测试断言。

下表列出了与给定设备级别和第一个 API 级别相对应的test_aspect_ratio_and_crop.py的断言。

设备级第一 API 级别断言
有限的全部纵横比
4:3、16:9、2:1 格式的 FoV
满的< 31纵横比
4:3、16:9、2:1 格式的 FoV
满的≥31庄稼
纵横比
4:3、16:9、2:1 格式的 FoV
等级3全部庄稼
纵横比
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

传感器融合/test_sensor_fusion.py

在Android 12中,为传感器融合测试添加了检测图像特征的方法。

在低于 Android 12 的版本中,使用整个图像来查找最佳 240 个特征,然后将其屏蔽到中心 20%,以避免卷帘快门效果,最低特征要求为 30 个特征。

如果此方法找到的特征不足,Android 12 首先将特征检测区域向中心屏蔽 20%,并将最大特征限制为最小特征要求的两倍。

下图显示了 Android 11 和 Android 12 功能检测之间的差异。提高最小特征要求阈值会导致检测到质量较差的特征并对测量产生负面影响。

Android 11和Android 12之间的特征检测差异sensor_fusion特征检测

图 2. Android 11 和 Android 12 之间的功能检测差异

新测试

scene0/test_solid_color_test_pattern.py

针对 Android 12 启用了新测试test_solid_color_test_pattern 。此测试针对所有相机启用,如下表所述。

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

颜色测试模式数据 (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

验证具有 scene2_c 面部场景的前置和后置主摄像头的摄像头启动时间均小于 500 毫秒。

scene2_c/test_jpeg_capture_perf_class.py

验证具有 scene2_c 面部场景的前置和后置主摄像头的 1080p JPEG 捕获延迟均小于 1 秒。