Ghi chú phát hành Bộ kiểm tra hình ảnh máy ảnh dành cho Android 12

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

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:

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.pyutils/camera_properties_utils.py
  • pymodules/its/cv2image.pyutils/opencv_processing_utils.py
  • pymodules/its/device.pyutils/its_session_utils.py
  • pymodules/its/error.pyutils/error_util.py
  • pymodules/its/image.pyutils/image_processing_utils.py
  • pymodules/its/objects.pyutils/capture_request_utils.py
  • pymodules/its/target.pyutils/target_exposure_utils.py
  • tools/hw.pyutils/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_idscene_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 camerascene 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 camerascene, 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 /tmpCameraITS_ đượ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.txttest_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_whitetest_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.

Bản vẽ khái niệm về đường viền và tiêu chí lựa chọn

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ị FULLLEVEL3. 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.

sự khác biệt trong tính năng phát hiện giữa tính năng phát hiện sensor_fusion của Android 11 và Android 12

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ụng SOLID_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, GREENBLUE 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.