Android 12 版本中包含許多相機 ITS更改。本頁總結了分為四大類的變化:
重構為 Python 3
由於 2020 年 1 月 Python 2.7 被棄用,整個 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
- 枕頭 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
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 的測試框架,支持需要具有自定義硬件設置的多個設備的測試用例。 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 之外,其他參數,例如平板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
完成測試,則必須連接數位板並且即使未使用數位板,數位板序列號也必須有效,因為測試類設置為數位板分配了序列號值。
運行單個測試
單個測試只能出於調試目的運行,因為它們的結果不會報告給CTS Verifier 。因為config.yml
文件不能在camera
和scene
的命令行中被覆蓋,所以這些參數在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.txt
和test_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_white
和test_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 中,裁剪測試針對FULL
和LEVEL3
設備運行。 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 功能檢測之間的區別。提高最小特徵要求閾值會導致檢測到質量較差的特徵並對測量產生負面影響。
圖 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 捕獲設置為完全飽和的BLACK
、 WHITE
、 RED
、 GREEN
和BLUE
測試模式。由於測試圖案定義是根據傳感器拜耳圖案定義的,因此必須為每種顏色設置顏色通道,如下表所示。
顏色 | 測試模式數據 (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 秒。