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 必須有效,因為測試類別設定會指派平板電腦的序號值。
執行個別測試
個別測試只能用於偵錯,因為其結果不會回報給 CTS Verifier。由於 config.yml
檔案無法在 camera
和 scene
的指令列中覆寫,因此這些參數必須在 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.txt
和test_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_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 中的合併測試情境 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 中,系統會針對 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 秒 | 裁剪 顯示比例 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 功能偵測的差異。提高最低功能需求門檻會導致系統偵測到品質不佳的功能,進而影響評估結果。
圖 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 | 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 秒。