Android 12 版本包含多項 Camera ITS 變更。本頁面將歸納出四種廣泛類別的異動:
重構為 Python 3
由於 Python 2.7 已於 2020 年 1 月淘汰,因此我們將整個 Camera ITS 程式碼庫重構為 Python 3。Android 12 必須使用下列 Python 版本和程式庫:
- Python 3.7.9 或 Python 3.7.10
- OpenCV 3.4.2
- Numpy 1.19.2
- Matplotlib 3.3.2
- Scipy 1.5.2
- pySerial 3.5
- Pillow 8.1.0
- PyYAML 5.3.1
主要測試啟動器 tools/run_all_tests.py
與 Android 11 以下版本相同,並重構為 Python 3。
所有個別測試都會經過重構,並使用 tests/its_base_test.py
中定義的新測試設定類別。大多數測試名稱和功能維持不變。
在 Android 12 中,所有個別測試現在都會載入場景。雖然每個測試的場景載入作業會增加整體測試時間,但可讓您偵錯個別測試。
如要進一步瞭解個別測試的變更,請參閱「測試變更」。
下列 Python 模組已重構,並變更名稱:
pymodules/its/caps.py
→utils/camera_properties_utils.py
pymodules/its/cv2image.py
→utils/opencv_processing_utils.py
pymodules/its/device.py
→utils/its_session_utils.py
pymodules/its/error.py
→utils/error_util.py
pymodules/its/image.py
→utils/image_processing_utils.py
pymodules/its/objects.py
→utils/capture_request_utils.py
pymodules/its/target.py
→utils/target_exposure_utils.py
tools/hw.py
→utils/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 之外,平板電腦 brightness
、chart_distance
、debug_mode
、camera_id
和 scene_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 以下版本的指令,在指令列中覆寫 camera
和 scene
設定檔值。
例如:
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_SCENES
或 TEST_BED_MANUAL
測試場景 0 和場景 5。不過,如果使用 TEST_BED_TABLET_SCENES
進行測試,即使未使用平板電腦,平板電腦也必須連線,且平板電腦序號 ID 必須有效,因為測試類別設定會為平板電腦指派序號 ID 值。
執行個別測試
個別測試只能用於偵錯,因為測試結果不會回報給 CTS Verifier。由於無法在 camera
和 scene
的指令列中覆寫 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.txt
和test_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_white
和 test_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 中,系統會針對 FULL
和 LEVEL3
裝置執行裁剪測試。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 功能偵測的差異。提高最低特徵需求門檻會導致系統偵測到品質不佳的特徵,並對評估結果造成負面影響。
圖 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 擷取內容會設為完全飽和的 BLACK
、WHITE
、RED
、GREEN
和 BLUE
測試模式。由於測試模式定義是依據感應器 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 秒。