Một số thay đổi về Camera ITS có trong bản phát hành Android 12. Trang này tóm tắt những thay đổi thuộc 4 danh mục lớn:
- Tái cấu trúc sang Python 3
- Áp dụng khung kiểm thử Mobly
- Thử nghiệm các thay đổi
- Số lượng xét nghiệm mới
Tái cấu trúc sang Python 3
Do Python 2.7 không còn được dùng từ tháng 1 năm 2020, toàn bộ cơ sở mã Camera ITS đã được tái cấu trúc thành Python 3. Android 12 yêu cầu các phiên bản và thư viện Python sau đây:
- 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 thành Python 3.
Tất cả các 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 các kiểm thử đều không thay đổi.
Trong Android 12, tất cả các hoạt động kiểm thử riêng lẻ hiện đều tải các 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 tổng thời gian kiểm thử, nhưng việc này cho phép gỡ lỗi từng bài kiểm thử.
Để biết thêm thông tin về các thay đổi đối với từng thử nghiệm, hãy xem phần Thay đổi đối với thử nghiệm.
Các mô-đun Python sau đây được tái cấu trúc bằng cách đổi tên:
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
Sử 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ó chế độ 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 để cho phép kiểm soát và ghi nhật ký các kiểm thử tốt hơn.
Camera ITS sử dụng cơ sở hạ tầng kiểm thử Mobly để cho phép kiểm soát và ghi nhật ký các 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ó chế độ 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 thử nghiệm (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 môi trường kiểm thử Mobly. Bạn có thể định cấu hình nhiều nền tảng thử nghiệm trong tệp cấu hình này, ví dụ: một nền tảng thử nghiệm kết hợp cảm biến và máy tính bảng. 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 phù hợp cho trình chạy kiểm thử. Ngoài mã nhận dạng thiết bị, các tham số khác như brightness
, chart_distance
, debug_mode
, camera_id
và scene_id
của máy tính bảng được truyền trong lớp kiểm thử. Các giá trị thông 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)
Thử nghiệm trên máy tính bảng
Đối với hoạt động 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 tạo, trình chạy kiểm thử Mobly sẽ khởi tạo TestParams
và truyền chúng đến các kiểm thử riêng lẻ.
Sau đây là một 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 cách sử dụng tools/run_all_tests.py
. Nếu không có giá trị dòng lệnh nào, các 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ách sử dụ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ử hợp nhất cảm biến
Đối với thử nghiệm hợp nhất cảm biến, tên của băng thử nghiệm phải có từ khoá SENSOR_FUSION
. Nền tảng thử nghiệm phù hợp được xác định theo 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à một tệp config.yml
mẫu cho các lần chạy hợp nhất 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 nền tảng thử nghiệm
Bạn có thể thêm nhiều nền tảng thử nghiệm vào tệp cấu hình. Sự kết hợp phổ biến nhất là có cả một thiết bị kiểm thử máy tính bảng và một thiết bị kiểm thử kết hợp cảm biến.
Sau đây là một tệp config.yml
mẫu có cả máy tính bảng và nền tảng thử nghiệm 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
Hoạt động kiểm thử thủ công vẫn được hỗ trợ trong Android 12.
Tuy nhiên, testbed phải xác định hoạt động kiểm thử như vậy bằng từ khoá MANUAL
trong tên testbed. Ngoài ra, testbed không được chứa mã nhận dạng máy tính bảng.
Sau đây là một tệp config.yml
mẫu để kiểm thử 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 mà không cần 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 bằng TEST_BED_MANUAL
. Tuy nhiên, nếu kiểm thử bằng TEST_BED_TABLET_SCENES
, thì máy tính bảng phải được kết nối và mã nhận dạng 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ì chế độ thiết lập lớp kiểm thử sẽ chỉ định giá trị mã nhận dạng sê-ri cho máy tính bảng.
Chạy các kiểm thử riêng lẻ
Bạn chỉ có thể chạy các kiểm thử riêng lẻ cho mục đích gỡ lỗi vì kết quả của các kiểm thử này không được báo cáo cho CTS Verifier. Vì các tệp config.yml
không thể ghi đè 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 từng thử nghiệm đượ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, các cấu phần phần mềm kiểm thử cho Camera ITS được lưu trữ tương tự như Android 11 trở xuống nhưng có những thay đổi sau:
- Thư mục cấu phần phần mềm thử nghiệm
/tmp
cóCameraITS_
được thêm vào trước chuỗi ngẫu nhiên gồm 8 ký tự để cho rõ ràng. - Đầu ra và lỗi kiểm thử được lưu trữ trong
test_log.DEBUG
cho mỗi lượt kiểm thử thay vìtest_name_stdout.txt
vàtest_name_stderr.txt
. - DUT và logcat của máy tính bảng từ mỗi hoạt động kiểm thử riêng lẻ được lưu trữ trong thư mục
/tmp/CameraITS_########
, giúp đơn giản hoá quá trình gỡ lỗi vì tất cả thông tin cần thiết để gỡ lỗi các vấn đề 3A đều được ghi lại.
Kiểm thử các thay đổi
Trong Android 12, các cảnh trên 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 giú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
Thử nghiệm test_jitter
chạy trên các camera thực bị ẩn 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 quy trình kiểm thử riêng lẻ trong Android 11.
Tên bài kiểm tra | Cấp độ API đầu tiên | Xác nhận |
---|---|---|
scene1_1/test_black_white.py | TẤT CẢ | Giá trị RGB có độ phơi sáng ngắn, độ khuếch đại thấp ~[0, 0, 0] Giá trị RGB có độ phơi sáng dài, độ khuếch đại cao ~[255, 255, 255] |
scene1_1/test_channel_saturation.py | 29 | Giảm dung sai về 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 tra | 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ó độ khuếch đại thấp ~[0, 0, 0] Độ phơi sáng dài, giá trị RGB có độ khuếch đạ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
Thử nghiệm test_burst_sameness_manual
chạy trên các camera thực bị ẩn trong Android 12.
scene1_2/test_tonemap_sequence.py
Thử nghiệm test_tonemap_sequence
chạy trên các camera BỊ HẠN CHẾ trong Android 12.
scene1_2/test_yuv_plus_raw.py
Thử nghiệm test_yuv_plus_raw
chạy trên các camera thực bị ẩn trong Android 12.
scene2_a/test_format_combos.py
Thử nghiệm test_format_combos
chạy trên các camera BỊ HẠN CHẾ trong Android 12.
scene3/test_flip_mirror.py
Thử nghiệm test_flip_mirror
chạy trên các camera BỊ HẠN CHẾ trong Android 12.
scene4/test_aspect_ratio_and_crop.py
Tính năng tìm vòng kết nối 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 cũ hơn sử dụng một phương thức liên quan đến việc tìm đường viền con (hình tròn) bên trong đường viền mẹ (hình vuông) bằng các bộ lọc về 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 những đối tượng có hình dạ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 thể hiện trong hình ảnh sau.
Hình 1. Bản vẽ khái niệm về đường viền và tiêu chí lựa chọn
Phương thức Android 12 đơn giản hơn và có thể giải quyết vấn đề về việc cắt khung hình chữ nhật trong một số máy tính bảng hiển thị. Tất cả các ứng cử viên vòng tròn đều được ghi lại cho mục đích gỡ lỗi.
Trong Android 12, kiểm thử cắt được chạy cho các thiết bị FULL
và LEVEL3
. Android 11 trở xuống bỏ qua các câu lệnh kiểm thử cắt cho thiết bị FULL
.
Bảng sau đây liệt kê các câu khẳng định 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 Góc nhìn cho định dạng 4:3, 16:9, 2:1 |
ĐẦY ĐỦ | < 31 | Tỷ lệ khung hình Góc nhìn cho định dạng 4:3, 16:9, 2:1 |
ĐẦY ĐỦ | ≥ 31 | Cắt Tỷ lệ khung hình Góc nhìn cho các định dạng 4:3, 16:9, 2:1 |
CẤP ĐỘ 3 | TẤT CẢ | Cắt Tỷ lệ khung hình Góc nhìn cho các định dạng 4:3, 16:9, 2:1 |
scene4/test_multi_camera_alignment.py
Phương thức undo_zoom()
để ghi hình 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 bản ghi hình.
Mã Python 2 trên 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 trên 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 các đối tượng trong hình ảnh được thêm vào để kiểm thử tính năng 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 đặc điểm tốt nhất, sau đó được che thành 20% ở giữa để tránh hiệu ứng cửa trập xoay với yêu cầu tối thiểu là 30 đặc điểm.
Nếu các đối tượng được tìm thấy bằng phương thức này không đủ, thì Android 12 sẽ che 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 2 lần 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 của Android 11 và Android 12. Việc tăng ngưỡng yêu cầu tối thiểu đối với tính năng sẽ dẫn đến việc phát hiện các tính năng kém chất lượng 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 giữa Android 11 và Android 12
Số lượng xét nghiệm mới
scene0/test_solid_color_test_pattern.py
Một thử nghiệm mới, test_solid_color_test_pattern
, được bật cho Android 12. Thử nghiệm này được bật cho tất cả các camera và được mô tả trong bảng sau.
Scene | Tên bài kiểm tra | 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 có màu đơn sắc và khả năng lập trình màu sắc của hình ảnh. |
Bạn phải bật mẫu kiểm thử màu đồng nhất để hỗ trợ chế độ riêng tư của camera.
Thử nghiệm test_solid_color_test_pattern
xác nhận đầu ra hình ảnh YUV có màu đồng nhất với màu do mẫu đã chọn xác định và màu hình ảnh thay đổi theo quy cách.
Tham số
cameraPrivacyModeSupport
: Xác định xem camera có hỗ trợ chế độ riêng tư hay không.android.sensor.testPatternMode
: Thiết lập chế độ mẫu kiểm thử. Bài kiểm tra 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
Khung hình YUV được chụp cho các thông 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 hình YUV duy nhất sẽ được ghi lại cho mỗi chế độ cài đặt được kiểm thử. Nếu PER_FRAME_CONTROL
không được hỗ trợ, 4 khung hình sẽ được chụp và chỉ có khung hình cuối cùng được phân tích để tối đa hoá mức độ phù hợp của kiểm thử trong các camera LIMITED
.
Ảnh chụp YUV được đặt thành các mẫu thử nghiệm BLACK
, WHITE
, RED
, GREEN
và BLUE
hoàn toàn bão hoà. 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)
|
RED (Chỉ thị về thiết bị thu phát sóng) |
(1, 0, 0, 0)
|
XANH LỤC |
(0, 1, 1, 0)
|
MÀU XANH LAM |
(0, 0, 0, 1)
|
Bảng khẳng định
Bảng sau đây mô tả các câu khẳng định kiểm thử cho test_solid_color_test_pattern.py
.
Camera Cấp độ API đầu tiên |
Loại camera | Màu sắc được khẳng định |
---|---|---|
31 | Bayer | ĐEN, TRẮNG, ĐỎ, XANH LÁ CÂY, XANH DƯƠNG |
31 | MONO | ĐEN, TRẮNG |
< 31 | Bayer/MONO | ĐEN |
Kiểm tra lớp hiệu suất
scene2_c/test_camera_launch_perf_class.py
Xác minh thời gian khởi động camera dưới 500 mili giây 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 độ trễ chụp ảnh JPEG 1080p nhỏ hơn 1 giây cho cả camera trước và camera sau chính với cảnh khuôn mặt scene2_c.