Android 12 Camera Image Test Suite 版本資訊

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 為基礎的測試架構,支援需要多個裝置和自訂硬體設定的測試案例。相機 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

測試沒有平板電腦的場景

您可以使用 TEST_BED_TABLET_SCENESTEST_BED_MANUAL 測試場景 0 和場景 5。不過,如果使用 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 中,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 的「有限」攝影機上執行。

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

Android 12 已重構 scene4/test_aspect_ratio_and_crop.py 中的圓圈尋找作業。

舊版 Android 採用一種方法,在父項輪廓 (正方形) 內尋找子項輪廓 (圓形),並使用大小和顏色篩選器。Android 12 採用一種方法,先找出所有輪廓,然後找出最圓形的特徵進行篩選。如要過濾螢幕上多餘的圓圈,必須達到最低輪廓面積,且圓圈輪廓必須為黑色。

輪廓及其選取條件如下圖所示。

輪廓和選取條件的概念圖

圖 1. 輪廓和選取條件的概念圖

Android 12 方法較簡單,可解決部分螢幕平板電腦的裁剪邊界框問題。系統會記錄所有候選圓圈,以利進行偵錯。

在 Android 12 中,系統會針對 FULLLEVEL3 裝置執行裁剪測試。Android 11 以下版本會略過 FULL 裝置的裁剪測試斷言。

下表列出test_aspect_ratio_and_crop.py的斷言,這些斷言對應於特定裝置層級和第一個 API 層級。

裝置層級 第一個 API 級別 斷言
LIMITED 全部 顯示比例
4:3、16:9、2:1 格式的視野
完整 < 31 顯示比例
4:3、16:9、2:1 格式的視野
完整 ≥ 31 裁剪
顯示比例
4:3、16:9、2:1 格式的視野
LEVEL3 全部 裁剪
顯示比例
4:3、16:9、2:1 格式的視野

scene4/test_multi_camera_alignment.py

方法 undo_zoom() 已重構,可更準確地計算感應器上的裁剪內容,這些感應器與擷取的長寬比不符。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 功能偵測的差異。提高最低特徵需求門檻會導致系統偵測到品質不佳的特徵,並對評估結果造成負面影響。

Android 11 和 Android 12 之間的感應器融合功能偵測差異

圖 2. Android 11 和 Android 12 的功能偵測差異

新測試

scene0/test_solid_color_test_pattern.py

Android 12 已啟用新測試 test_solid_color_test_pattern。所有攝影機都會啟用這項測試,詳情請參閱下表。

Scene 測試名稱 第一個 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 測試模式。由於測試模式定義是依據感應器 Bayer 模式,因此必須為每個顏色設定色彩通道,如下表所示。

顏色 testPatternData (RGGB)
黑隊 (0, 0, 0, 0)
白隊 (1, 1, 1, 1)
RED (1, 0, 0, 0)
綠色 (0, 1, 1, 0)
藍色 (0, 0, 0, 1)

斷言表

下表說明 test_solid_color_test_pattern.py 的測試斷言。

相機
第一個 API 級別
攝影機類型 已聲明顏色
31 拜耳 黑色、白色、紅色、綠色、藍色
31 MONO 黑色、白色
< 31 Bayer/MONO 黑隊

效能類別測試

scene2_c/test_camera_launch_perf_class.py

確認前置和後置主鏡頭的啟動時間均少於 500 毫秒,且場景為 scene2_c 臉部場景。

scene2_c/test_jpeg_capture_perf_class.py

驗證前置和後置主鏡頭在 scene2_c 臉部場景中,1080p JPEG 擷取延遲時間是否少於 1 秒。