Android 12 相機圖像測試套件發行說明

Android 12 版本中包含許多相機 ITS更改。本頁總結了分為四大類的變化:

重構為 Python 3

由於 2020 年 1 月 Python 2.7 被棄用,整個 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 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_mode模式、 camera_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

沒有平板電腦的測試場景

可以使用TEST_BED_TABLET_SCENESTEST_BED_MANUAL對場景 0 和場景 5 進行測試。但是,如果使用TEST_BED_TABLET_SCENES完成測試,則必須連接數位板並且即使未使用數位板,數位板序列號也必須有效,因為測試類設置為數位板分配了序列號值。

運行單個測試

單個測試只能出於調試目的運行,因為它們的結果不會報告給CTS Verifier 。因為config.yml文件不能在camerascene的命令行中被覆蓋,所以這些參數在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.txttest_name_stderr.txt中。
  • 每個單獨測試的 DUT 和平板電腦 logcat 都存儲在/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_whitetest_channel_saturation的功能。

下表描述了 Android 11 中的兩個單獨測試。

測試名稱第一個 API 級別斷言
場景1_1/test_black_white.py全部短曝光,低增益 RGB 值 ~[0, 0, 0]
長時間曝光,高增益 RGB 值 ~[255, 255, 255]
場景1_1/test_channel_saturation.py 29降低 [255, 255, 255] 差異的容差,以消除白色圖像中的色彩色調。

下表描述了 Android 12 中的合併測試 scene1_1/test_black_white.py。

測試名稱第一個 API 級別斷言
場景1_1/test_black_white.py全部短曝光,低增益 RGB 值 ~[0, 0, 0]
長時間曝光,高增益 RGB 值 ~[255, 255, 255] 並降低值之間的容差以消除白色圖像中的色彩色調。

場景1_1/test_burst_sameness_manual.py

test_burst_sameness_manual測試在 Android 12 中的物理隱藏攝像頭上運行。

場景1_2/test_tonemap_sequence.py

test_tonemap_sequence測試在 Android 12 的有限攝像頭上運行。

場景1_2/test_yuv_plus_raw.py

test_yuv_plus_raw測試在 Android 12 中的物理隱藏攝像頭上運行。

場景2_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 中,裁剪測試針對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

場景4/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%,並將最大特徵限制為最小特徵要求的2倍。

下圖顯示了 Android 11 和 Android 12 功能檢測之間的區別。提高最小特徵要求閾值會導致檢測到質量較差的特徵並對測量產生負面影響。

Android 11和Android 12在特徵檢測上的區別sensor_fusion特徵檢測

圖 2. Android 11 和 Android 12 的特徵檢測差異

新測試

場景0/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測試模式。由於測試圖案定義是根據傳感器拜耳圖案定義的,因此必須為每種顏色設置顏色通道,如下表所示。

顏色測試模式數據 (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拜耳/MONO黑色的

性能等級測試

scene2_c/test_camera_launch_perf_class.py

驗證具有 scene2_c 人臉場景的前後主攝像頭的攝像頭啟動時間均小於 500 毫秒。

scene2_c/test_jpeg_capture_perf_class.py

驗證具有 scene2_c 面部場景的前後主攝像頭的 1080p JPEG 捕獲延遲小於 1 秒。