Bản phát hành Android 12 có một số thay đổi về Camera ITS. Trang này tóm tắt các thay đổi thuộc 4 danh mục rộng:
Cải tiến sang Python 3
Do Python 2.7 ngừng hoạt động vào tháng 1 năm 2020, toàn bộ mã nguồn Camera ITS đã được tái cấu trúc sang Python 3. Android 12 yêu cầu các phiên bản và thư viện Python sau:
- Python 3.7.9 hoặc 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
Trình chạy kiểm thử chính (tools/run_all_tests.py) vẫn giống như các phiên bản Android 11 trở xuống và được tái cấu trúc sang Python 3.
Tất cả các bài kiểm thử riêng lẻ đều được tái cấu trúc và sử dụng lớp thiết lập kiểm thử mới được xác định trong tests/its_base_test.py. Hầu hết tên và chức năng của bài kiểm thử vẫn giống nhau.
Trong Android 12, tất cả các bài kiểm thử riêng lẻ hiện đều tải cảnh của chúng. Mặc dù việc tải cảnh cho mỗi bài kiểm thử làm tăng thời gian kiểm thử tổng thể, nhưng việc này cho phép gỡ lỗi các bài kiểm thử riêng lẻ.
Để biết thêm thông tin về các thay đổi đối với từng bài kiểm thử, hãy xem Thay đổi về kiểm thử.
Các mô-đun Python sau đây được tái cấu trúc với tên thay đổi:
pymodules/its/caps.py→utils/camera_properties_utils.pypymodules/its/cv2image.py→utils/opencv_processing_utils.pypymodules/its/device.py→utils/its_session_utils.pypymodules/its/error.py→utils/error_util.pypymodules/its/image.py→utils/image_processing_utils.pypymodules/its/objects.py→utils/capture_request_utils.pypymodules/its/target.py→utils/target_exposure_utils.pytools/hw.py→utils/sensor_fusion_utils.py
Áp dụng khung kiểm thử Mobly
Mobly là một khung kiểm thử dựa trên Python , hỗ trợ các trường hợp kiểm thử yêu cầu nhiều thiết bị có thiết lập phần cứng tuỳ chỉnh. Camera ITS sử dụng cơ sở hạ tầng kiểm thử Mobly để kiểm soát và ghi nhật ký các bài kiểm thử tốt hơn.
Camera ITS sử dụng cơ sở hạ tầng kiểm thử Mobly để kiểm soát và ghi nhật ký các bài kiểm thử tốt hơn. Mobly là một khung kiểm thử dựa trên Python, hỗ trợ các trường hợp kiểm thử yêu cầu nhiều thiết bị có thiết lập phần cứng tuỳ chỉnh. Để biết thêm thông tin về Mobly, hãy xem google/mobly.
Tệp config.yml
Với khung Mobly, bạn có thể thiết lập một thiết bị đang kiểm thử (DUT) và một bảng biểu đồ trong lớp its_base_test. Tệp config.yml (YAML) được dùng để tạo một testbed Mobly. Bạn có thể định cấu hình nhiều testbed trong tệp cấu hình này, chẳng hạn như một máy tính bảng và một testbed kết hợp cảm biến. Trong phần bộ điều khiển của mỗi testbed, bạn có thể chỉ định device_ids để xác định các thiết bị Android thích hợp cho trình chạy kiểm thử. Ngoài mã thiết bị, các tham số khác như brightness (độ sáng), chart_distance (khoảng cách biểu đồ), debug_mode (chế độ gỡ lỗi), camera_id (mã máy ảnh) và scene_id (mã cảnh) của máy tính bảng được truyền trong lớp kiểm thử. Các giá trị tham số kiểm thử phổ biến là:
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)
Kiểm thử dựa trên máy tính bảng
Đối với kiểm thử dựa trên máy tính bảng, từ khoá TABLET phải có trong tên testbed. Trong quá trình khởi chạy, trình chạy kiểm thử Mobly sẽ khởi chạy TestParams và truyền các tham số này đến các bài kiểm thử riêng lẻ.
Sau đây là tệp config.yml mẫu cho các lần chạy dựa trên máy tính bảng.
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
Bạn có thể gọi testbed bằng tools/run_all_tests.py. Nếu không có giá trị dòng lệnh, các bài kiểm thử sẽ chạy với các giá trị tệp config.yml.
Ngoài ra, bạn có thể ghi đè các giá trị tệp cấu hình camera và scene tại dòng lệnh bằng các lệnh tương tự như Android 11 trở xuống.
Ví dụ:
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
Kiểm thử kết hợp cảm biến
Đối với kiểm thử kết hợp cảm biến,
tên testbed phải chứa từ khoá
SENSOR_FUSION. Testbed chính xác được xác định bởi các cảnh được kiểm thử. Android 12 hỗ trợ cả bộ điều khiển Arduino
và Canakit
để kết hợp cảm biến.
Sau đây là tệp config.yml mẫu cho các lần chạy kết hợp cảm biến.
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
Để chạy các bài kiểm thử kết hợp cảm biến bằng giàn kiểm thử kết hợp cảm biến, hãy sử dụng:
python tools/run_all_tests.py scenes=sensor_fusion
python tools/run_all_tests.py scenes=sensor_fusion camera=0
Nhiều testbed
Bạn có thể đưa nhiều testbed vào tệp cấu hình. Sự kết hợp phổ biến nhất là có cả testbed máy tính bảng và testbed kết hợp cảm biến.
Sau đây là tệp config.yml mẫu có cả testbed máy tính bảng và testbed kết hợp cảm biến.
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
Kiểm thử theo cách thủ công
Android 12 tiếp tục hỗ trợ kiểm thử theo cách thủ công.
Tuy nhiên, testbed phải xác định kiểm thử như vậy bằng từ khoá MANUAL trong tên testbed. Ngoài ra, testbed không thể chứa mã máy tính bảng.
Sau đây là tệp config.yml mẫu cho kiểm thử theo cách thủ công.
TestBeds:
- Name: TEST_BED_MANUAL
Controllers:
AndroidDevice:
- serial: 8A9X0NS5Z
label: dut
TestParams:
debug_mode: "False"
chart_distance: 31.0
camera: 0
scene: scene1
Kiểm thử cảnh không có máy tính bảng
Bạn có thể kiểm thử cảnh 0 và cảnh 5 bằng TEST_BED_TABLET_SCENES hoặc TEST_BED_MANUAL. Tuy nhiên, nếu kiểm thử được thực hiện bằng TEST_BED_TABLET_SCENES, thì máy tính bảng phải được kết nối và mã sê-ri của máy tính bảng phải hợp lệ ngay cả khi máy tính bảng không được sử dụng vì quá trình thiết lập lớp kiểm thử sẽ gán giá trị mã sê-ri cho máy tính bảng.
Chạy các bài kiểm thử riêng lẻ
Bạn chỉ có thể chạy các bài kiểm thử riêng lẻ cho mục đích gỡ lỗi vì kết quả của chúng không được
báo cáo cho Trình xác minh CTS. Vì không thể ghi đè các tệp config.yml tại dòng lệnh cho camera và scene, nên các tham số này phải chính xác trong tệp config.yml cho bài kiểm thử riêng lẻ được đề cập. Ngoài ra, nếu có nhiều testbed trong tệp cấu hình, bạn phải chỉ định testbed bằng cờ --test_bed. Ví dụ:
python tests/scene1_1/test_black_white.py --config config.yml --test_bed TEST_BED_TABLET_SCENES
Dữ liệu kiểm thử
Trong Android 12, dữ liệu kiểm thử cho Camera ITS được lưu trữ tương tự như Android 11 trở xuống nhưng có các thay đổi sau:
- Thư mục dữ liệu kiểm thử
/tmpcóCameraITS_được thêm vào chuỗi ngẫu nhiên gồm 8 ký tự để cho rõ ràng. - Kết quả và lỗi kiểm thử được lưu trữ trong
test_log.DEBUGcho mỗi bài kiểm thử thay vìtest_name_stdout.txtvàtest_name_stderr.txt. - DUT và logcat máy tính bảng từ mỗi bài kiểm thử riêng lẻ được lưu trữ trong thư mục
/tmp/CameraITS_########, giúp đơn giản hoá việc gỡ lỗi vì tất cả thông tin cần thiết để gỡ lỗi các vấn đề về 3A đều được ghi lại.
Thay đổi về kiểm thử
Trong Android 12, các cảnh máy tính bảng là tệp PNG chứ không phải tệp PDF. Việc sử dụng tệp PNG cho phép nhiều mẫu máy tính bảng hiển thị cảnh đúng cách hơn.
scene0/test_jitter.py
Bài kiểm thử test_jitter chạy trên các camera ẩn thực trong Android 12.
scene1_1/test_black_white.py
Đối với Android 12, test_black_white có chức năng của cả test_black_white và test_channel_saturation.
Bảng sau đây mô tả 2 bài kiểm thử riêng lẻ trong Android 11.
| Tên bài kiểm thử | Cấp độ API đầu tiên | Xác nhận |
|---|---|---|
| scene1_1/test_black_white.py | TẤT CẢ | Độ phơi sáng ngắn, giá trị RGB có độ lợi thấp ~[0, 0, 0] Độ phơi sáng dài, giá trị RGB có độ lợi cao ~[255, 255, 255] |
| scene1_1/test_channel_saturation.py | 29 | Giảm dung sai đối với sự khác biệt [255, 255, 255] để loại bỏ sắc thái màu trong hình ảnh màu trắng. |
Bảng sau đây mô tả bài kiểm thử đã hợp nhất, scene1_1/test_black_white.py, trong Android 12.
| Tên bài kiểm thử | Cấp độ API đầu tiên | Xác nhận |
|---|---|---|
| scene1_1/test_black_white.py | TẤT CẢ | Độ phơi sáng ngắn, giá trị RGB có độ lợi thấp ~[0, 0, 0] Độ phơi sáng dài, giá trị RGB có độ lợi cao ~[255, 255, 255] và giảm dung sai giữa các giá trị để loại bỏ sắc thái màu trong hình ảnh màu trắng. |
scene1_1/test_burst_sameness_manual.py
Bài kiểm thử test_burst_sameness_manual chạy trên các camera ẩn thực trong Android 12.
scene1_2/test_tonemap_sequence.py
Bài kiểm thử test_tonemap_sequence chạy trên các camera LIMITED trong Android 12.
scene1_2/test_yuv_plus_raw.py
Bài kiểm thử test_yuv_plus_raw chạy trên các camera ẩn thực trong Android 12.
scene2_a/test_format_combos.py
Bài kiểm thử test_format_combos chạy trên các camera LIMITED trong Android 12.
scene3/test_flip_mirror.py
Bài kiểm thử test_flip_mirror chạy trên các camera LIMITED trong Android 12.
scene4/test_aspect_ratio_and_crop.py
Việc tìm vòng tròn trong scene4/test_aspect_ratio_and_crop.py đã được tái cấu trúc trong Android 12.
Các phiên bản Android trước đây sử dụng một phương thức liên quan đến việc tìm đường viền con (vòng tròn) bên trong đường viền mẹ (hình vuông) bằng các bộ lọc cho kích thước và màu sắc. Android 12 sử dụng một phương thức liên quan đến việc tìm tất cả các đường viền, sau đó lọc bằng cách tìm các đối tượng có tính chất vòng tròn nhất. Để loại bỏ các vòng tròn giả trên màn hình, cần có diện tích đường viền tối thiểu và đường viền của vòng tròn phải có màu đen.
Các đường viền và tiêu chí lựa chọn của chúng được minh hoạ trong hình sau.
Hình 1. Bản vẽ khái niệm về các đường viền và tiêu chí lựa chọn
Phương thức Android 12 đơn giản hơn và giúp giải quyết vấn đề về việc cắt hộp giới hạn trong một số máy tính bảng hiển thị. Tất cả các ứng viên vòng tròn đều được ghi lại cho mục đích gỡ lỗi.
Trong Android 12, bài kiểm thử cắt được chạy cho các thiết bị FULL và LEVEL3. Các phiên bản Android 11 trở xuống bỏ qua các xác nhận kiểm thử cắt cho các thiết bị FULL.
Bảng sau đây liệt kê các xác nhận cho test_aspect_ratio_and_crop.py tương ứng với một cấp độ thiết bị và cấp độ API đầu tiên nhất định.
| Cấp độ thiết bị | Cấp độ API đầu tiên | Xác nhận |
|---|---|---|
| LIMITED | TẤT CẢ | Tỷ lệ khung hình FoV cho các định dạng 4:3, 16:9, 2:1 |
| FULL | < 31 | Tỷ lệ khung hình FoV cho các định dạng 4:3, 16:9, 2:1 |
| FULL | ≥ 31 | Cắt Tỷ lệ khung hình FoV cho các định dạng 4:3, 16:9, 2:1 |
| LEVEL3 | TẤT CẢ | Cắt Tỷ lệ khung hình FoV cho các định dạng 4:3, 16:9, 2:1 |
scene4/test_multi_camera_alignment.py
Phương thức undo_zoom() cho các lần chụp YUV trong scene4/test_multi_camera_alignment.py đã được tái cấu trúc để tính toán chính xác hơn việc cắt trên các cảm biến không khớp với tỷ lệ khung hình của lần chụp.
Mã Python 2 của Android 11
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
Mã Python 3 của Android 12
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
Trong Android 12, một phương thức phát hiện đối tượng trong hình ảnh được thêm vào cho bài kiểm thử kết hợp cảm biến.
Trong các phiên bản thấp hơn Android 12, toàn bộ hình ảnh được dùng để tìm 240 đối tượng tốt nhất, sau đó được che phủ thành 20% ở giữa để tránh hiệu ứng cửa trập cuốn với yêu cầu tối thiểu là 30 đối tượng.
Nếu các đối tượng được tìm thấy bằng phương thức này không đủ, Android 12 sẽ che phủ vùng phát hiện đối tượng thành 20% ở giữa trước tiên và giới hạn số lượng đối tượng tối đa gấp đôi yêu cầu tối thiểu về đối tượng.
Hình ảnh sau đây cho thấy sự khác biệt giữa tính năng phát hiện đối tượng của Android 11 và Android 12. Việc nâng ngưỡng yêu cầu tối thiểu về đối tượng sẽ dẫn đến việc phát hiện các đối tượng có chất lượng kém và ảnh hưởng tiêu cực đến các phép đo.
Hình 2. Sự khác biệt trong tính năng phát hiện đối tượng giữa Android 11 và Android 12
Kiểm thử mới
scene0/test_solid_color_test_pattern.py
Một bài kiểm thử mới, test_solid_color_test_pattern, được bật cho Android 12. Bài kiểm thử này được bật cho tất cả các camera và được mô tả trong bảng sau.
| Cảnh | Tên bài kiểm thử | Cấp độ API đầu tiên | Nội dung mô tả |
|---|---|---|---|
| 0 | test_solid_color_test_pattern | 31 | Xác nhận đầu ra hình ảnh màu đồng nhất và khả năng lập trình màu hình ảnh. |
Bạn phải bật các mẫu kiểm thử màu đồng nhất để hỗ trợ chế độ quyền riêng tư của camera.
Bài kiểm thử test_solid_color_test_pattern xác nhận đầu ra hình ảnh YUV màu đồng nhất với màu được xác định bởi mẫu đã chọn và các thay đổi về màu hình ảnh theo thông số kỹ thuật.
Tham số
cameraPrivacyModeSupport: Xác định xem camera có hỗ trợ chế độ quyền riêng tư hay không.android.sensor.testPatternMode: Đặt chế độ mẫu kiểm thử. Bài kiểm thử này sử dụngSOLID_COLOR.android.sensor.testPatternData: Đặt các giá trị mẫu kiểm thử R, Gr, Gb, G cho chế độ mẫu kiểm thử.
Để biết nội dung mô tả về mẫu kiểm thử màu đồng nhất, hãy xem
SENSOR_TEST_PATTERN_MODE_SOLID_COLOR.
Phương thức
Các khung YUV được chụp cho các tham số đã đặt và nội dung hình ảnh được xác thực. Mẫu kiểm thử được xuất trực tiếp từ cảm biến hình ảnh, vì vậy không cần cảnh cụ thể. Nếu PER_FRAME_CONTROL được hỗ trợ, một khung YUV sẽ được chụp cho mỗi chế độ cài đặt được kiểm thử. Nếu PER_FRAME_CONTROL không được hỗ trợ, 4 khung sẽ được chụp chỉ với khung cuối cùng được phân tích để tối đa hoá mức độ sử dụng kiểm thử trong các camera LIMITED.
Các lần chụp YUV được đặt thành các mẫu kiểm thử BLACK, WHITE, RED, GREEN và BLUE được bão hoà hoàn toàn. Vì định nghĩa mẫu kiểm thử là theo mẫu Bayer của cảm biến, nên bạn phải đặt các kênh màu cho từng màu như trong bảng sau.
| Màu | testPatternData (RGGB) |
|---|---|
| ĐEN |
(0, 0, 0, 0)
|
| TRẮNG |
(1, 1, 1, 1)
|
| ĐỎ |
(1, 0, 0, 0)
|
| XANH LỤC |
(0, 1, 1, 0)
|
| XANH DƯƠNG |
(0, 0, 0, 1)
|
Bảng xác nhận
Bảng sau đây mô tả các xác nhận kiểm thử cho test_solid_color_test_pattern.py.
| Camera Cấp độ API đầu tiên |
Loại camera | Các màu được xác nhận |
|---|---|---|
| 31 | Bayer | ĐEN, TRẮNG, ĐỎ, XANH LỤC, XANH DƯƠNG |
| 31 | ĐƠN SẮC | ĐEN, TRẮNG |
| < 31 | Bayer/ĐƠN SẮC | ĐEN |
Kiểm thử lớp hiệu suất
scene2_c/test_camera_launch_perf_class.py
Xác minh rằng quá trình khởi động camera mất ít hơn 500 ms cho cả camera chính trước và sau với cảnh khuôn mặt scene2_c.
scene2_c/test_jpeg_capture_perf_class.py
Xác minh rằng độ trễ chụp ảnh JPEG 1080p mất ít hơn 1 giây cho cả camera chính trước và sau với cảnh khuôn mặt scene2_c.