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 必須有效,因為測試類別設定會指派平板電腦的序號值。

執行個別測試

個別測試只能用於偵錯,因為其結果不會回報給 CTS Verifier。由於 config.yml 檔案無法在 camerascene 的指令列中覆寫,因此這些參數必須在 config.yml 檔案中正確設定,才能進行個別測試。此外,如果設定檔中有多個測試 b,則必須使用 --test_bed 標記指定 testbed。例如:

python tests/scene1_1/test_black_white.py --config config.yml --test_bed TEST_BED_TABLET_SCENES

測試構件

在 Android 12 中,相機 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 檔案可讓更多平板電腦型號正確顯示場景。

show0/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 中的合併測試情境 1_1/test_black_white.py。

測試名稱 第一個 API 級別 斷言
scene1_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 的實體隱藏攝影機上執行。

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 的有限相機上執行。

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 秒 裁剪
顯示比例
FoV (4:3、16:9、2:1 格式)
LEVEL3 全部 裁剪
顯示比例
4:3、16:9、2:1 格式的視野

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 功能偵測的差異。提高最低功能需求門檻會導致系統偵測到品質不佳的功能,進而影響評估結果。

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。這項測試適用於所有攝影機,並在下表中說明。

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 Bayer 黑色、白色、紅色、綠色、藍色
31 單色 黑色、白色
< 31 Bayer/單色 黑隊

效能類別測試

scene2_c/test_camera_launch_perf_class.py

使用 scene2_c 人臉場景,驗證前後置主要鏡頭的啟動時間是否低於 500 毫秒。

scene2_c/test_jpeg_capture_perf_class.py

使用場景 2_c 的臉部場景,驗證前置和後置主鏡頭的 1080p JPEG 擷取延遲時間是否低於 1 秒。