Android 12 카메라 이미지 테스트 모음 출시 노트

Android 12 출시에는 여러 가지 카메라 ITS 변경사항이 포함되어 있습니다. 이 페이지에서는 넓은 범위의 카테고리 4개로 나누어 변경사항을 요약합니다.

Python 3으로 리팩터링

2020년 1월 Python 2.7이 지원 중단됨에 따라 전체 카메라 ITS 코드베이스가 Python 3으로 리팩터링되었습니다. Android 12에는 다음 Python 버전과 라이브러리가 필요합니다.

기본 테스트 런처 tools/run_all_tests.py는 Android 11 이하 버전과 동일하게 유지되며 Python 3으로 리팩터링됩니다.

모든 개별 테스트는 리팩터링되고 tests/its_base_test.py에 정의된 새로운 테스트 설정 클래스를 사용합니다. 대부분의 테스트 이름과 기능은 그대로 유지됩니다. 이제 Android 12에서는 모든 개별 테스트가 장면을 로드합니다. 각 테스트에 장면 로드를 사용하면 전체 테스트 시간이 늘어나지만 개별 테스트를 디버깅할 수 있습니다.

개별 테스트 변경사항에 관한 자세한 내용은 테스트 변경사항을 참고하세요.

다음 Python 모듈은 이름이 변경되어 리팩터링되었습니다.

  • 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

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 이하와 유사하게 명령어를 사용하여 명령줄에서 camerascene 구성 파일 값을 재정의할 수 있습니다.

예:

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

태블릿 없이 장면 테스트

장면 0 및 장면 5 테스트는 TEST_BED_TABLET_SCENES 또는 TEST_BED_MANUAL을 사용하여 실행할 수 있습니다. 그러나 TEST_BED_TABLET_SCENES로 테스트를 실행하는 경우 태블릿을 사용하지 않더라도 테스트 클래스 설정에서 태블릿을 위한 일련번호 ID 값을 할당하므로 태블릿이 연결되어 있고 태블릿 일련번호 ID가 유효해야 합니다.

개별 테스트 실행

개별 테스트는 결과가 CTS 인증 도구에 보고되지 않으므로 디버그 목적으로만 실행할 수 있습니다. 명령줄에서 camerasceneconfig.yml 파일을 덮어쓸 수 없으므로 해당하는 개별 테스트를 위한 config.yml 파일 내에서 이러한 매개변수가 정확해야 합니다. 또한 구성 파일에 테스트베드가 두 개 이상 있으면 --test_bed 플래그를 사용하여 테스트베드를 지정해야 합니다. 예:

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_name_stdout.txttest_name_stderr.txt 대신 각 테스트의 test_log.DEBUG에 저장됩니다.
  • 개별 테스트의 DUT 및 태블릿 logcat은 3A 문제를 디버그하는 데 필요한 모든 정보가 로깅되므로 디버깅을 간소화하는 /tmp/CameraITS_######## 디렉터리에 저장됩니다.

테스트 변경사항

Android 12에서 태블릿 장면은 PDF 파일이 아닌 PNG 파일입니다. PNG 파일을 사용하면 더 많은 태블릿 모델에서 장면을 올바르게 표시할 수 있습니다.

scene0/test_jitter.py

test_jitter 테스트는 Android 12의 숨겨진 물리적 카메라에서 실행됩니다.

scene1_1/test_black_white.py

Android 12의 경우 test_black_whitetest_black_whitetest_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에서 병합된 테스트인 scene1_1/test_black_white.py를 설명합니다.

테스트 이름 첫 번째 API 수준 어설션
scene1_1/test_black_white.py 전체 짧은 노출, 낮은 게인 RGB 값 ~[0, 0, 0]
긴 노출, 높은 게인 RGB 값 ~[255, 255, 255] 및 값 간 허용 오차 감소를 통해 흰색 이미지에서 색 번짐을 없앱니다.

scene1_1/test_burst_sameness_manual.py

test_burst_sameness_manual 테스트는 Android 12의 숨겨진 물리적 카메라에서 실행됩니다.

scene1_2/test_tonemap_sequence.py

test_tonemap_sequence 테스트는 Android 12의 제한된 카메라에서 실행됩니다.

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

scene4/test_aspect_ratio_and_crop.py에서 원을 찾는 작업이 Android 12에서 리팩터링되었습니다.

이전 Android 버전에서는 크기 및 색상 필터가 있는 상위 윤곽(정사각형) 내에서 하위 윤곽(원)을 찾는 메서드를 사용했습니다. Android 12는 모든 윤곽을 찾은 다음 가장 원에 가까운 특징을 찾아 필터링하는 작업이 포함된 메서드를 사용합니다. 디스플레이에서 가짜 원이 필터링을 통과하지 못하게 하려면 최소 윤곽 영역이 필요하며 원의 윤곽은 검은색이어야 합니다.

윤곽 및 선택 기준은 다음 이미지에 나와 있습니다.

윤곽 및 선택 기준의 개념 도면

그림 1. 윤곽 및 선택 기준의 개념 도면

Android 12 메서드는 더 간단하며 일부 디스플레이 태블릿에서 경계 상자 잘림 문제를 해결하는 데 도움이 됩니다. 모든 원 후보는 디버깅을 위해 로깅됩니다.

Android 12에서는 FULLLEVEL3 기기를 대상으로 잘림 테스트가 실행됩니다. Android 11 이하 버전에서는 FULL 기기를 대상으로 잘림 테스트 어설션을 건너뜁니다.

다음 표에는 주어진 기기 수준과 첫 번째 API 수준에 상응하는 test_aspect_ratio_and_crop.py의 어설션이 나와 있습니다.

기기 수준 첫 번째 API 수준 어설션
제한됨 전체 가로세로 비율
FoV(4:3, 16:9, 2:1 형식)
최대 < 31 가로세로 비율
FoV(4:3, 16:9, 2:1 형식)
최대 ≥ 31 자르기
가로세로 비율
FoV(4:3, 16:9, 2:1 형식)
수준3 전체 자르기
가로세로 비율
FoV(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개를 찾으며, 그런 다음 최소 30개의 특징 요구사항이 있는 셔터 효과가 롤링되지 않도록 중앙 20%를 마스킹합니다.

이 메서드로 발견된 특징으로 충분하지 않은 경우 Android 12는 먼저 특징 감지 영역을 중앙 20%로 마스킹하고 최대 특징을 최소 특징 요구사항의 2배로 제한합니다.

다음 이미지는 Android 11과 Android 12 특징 감지의 차이를 보여줍니다. 최소 특징 요구사항 임계값을 높이면 품질이 낮은 특징이 감지되어 측정에 부정적인 영향을 미칩니다.

Android 11과 Android 12의 sensor_fusion 특징 감지 기능 차이

그림 2. Android 11과 Android 12의 특징 감지 차이

새로운 테스트

scene0/test_solid_color_test_pattern.py

새 테스트 test_solid_color_test_pattern이 Android 12에 사용 설정되었습니다. 이 테스트는 모든 카메라를 대상으로 사용 설정되며 다음 표에 설명되어 있습니다.

장면 테스트 이름 첫 번째 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이 지원되지 않는 경우 프레임 4개가 캡처되고 그중 마지막 프레임만 LIMITED 카메라의 테스트 범위를 최대화하기 위해 분석됩니다.

YUV 캡처는 색상이 완전한 BLACK, WHITE, RED, GREEN, BLUE 테스트 패턴으로 설정됩니다. 테스트 패턴 정의는 센서 베이어 패턴에 따라 적용되므로 다음 표와 같이 각 색상에 색상 채널이 설정되어야 합니다.

색상 testPatternData(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 베이어/모노 검은색

성능 클래스 테스트

scene2_c/test_camera_launch_perf_class.py

scene2_c 얼굴 장면이 있는 전면 및 후면 기본 카메라에서 카메라 시작이 500ms 미만인지 확인합니다.

scene2_c/test_jpeg_capture_perf_class.py

scene2_c 얼굴 장면이 있는 전면 및 후면 기본 카메라에서 1080p JPEG 캡처 지연 시간이 1초 미만인지 확인합니다.