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

Android 12 릴리스에는 여러 카메라 ITS 변경 사항이 포함되어 있습니다. 이 페이지에는 4가지 범주로 분류되는 변경 사항이 요약되어 있습니다.

파이썬 3으로 리팩토링

2020년 1월 Python 2.7 지원 중단으로 인해 전체 Camera 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 는 맞춤형 하드웨어 설정이 있는 여러 장치가 필요한 테스트 사례를 지원하는 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_idscene_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 Verifier 에 보고되지 않기 때문에 디버그 목적으로만 실행할 수 있습니다. config.yml 파일은 camerascene 에 대한 명령줄에서 덮어쓸 수 없기 때문에 이러한 매개변수는 문제의 개별 테스트에 대한 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_name_stdout.txttest_name_stderr.txt 대신 각 테스트에 대해 test_log.DEBUG 에 저장됩니다.
  • 각 개별 테스트의 DUT 및 태블릿 로그캣은 /tmp/CameraITS_######## 디렉토리에 저장되어 3A 문제를 디버그하는 데 필요한 모든 정보가 기록되므로 디버깅을 단순화합니다.

테스트 변경

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

scene0/test_jitter.py

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

scene1_1/test_black_white.py

Android 12의 경우 test_black_white 에는 test_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의 LIMITED 카메라에서 실행됩니다.

scene1_2/test_yuv_plus_raw.py

test_yuv_plus_raw 테스트는 Android 12의 실제 숨겨진 카메라에서 실행됩니다.

scene2_a/test_format_combos.py

test_format_combos 테스트는 Android 12의 LIMITED 카메라에서 실행됩니다.

scene3/test_flip_mirror.py

test_flip_mirror 테스트는 Android 12의 LIMITED 카메라에서 실행됩니다.

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 레벨 주장
제한된 모두 종횡비
4:3, 16:9, 2:1 형식의 시야각
가득한 < 31 종횡비
4:3, 16:9, 2:1 형식의 시야각
가득한 ≥ 31 수확고
종횡비
4:3, 16:9, 2:1 형식의 시야각
레벨3 모두 수확고
종횡비
4:3, 16:9, 2:1 형식의 시야각

scene4/test_multi_camera_alignment.py

scene4/test_multi_camera_alignment.py 에서 YUV 캡처를 위한 undo_zoom() 메서드는 캡처의 종횡비와 일치하지 않는 센서에서 자르기를 더 정확하게 설명하도록 리팩터링되었습니다.

안드로이드 11 파이썬 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

안드로이드 12 파이썬 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 기능 감지의 차이점을 보여줍니다. 최소 기능 요구 사항 임계값을 높이면 품질이 낮은 기능이 감지되고 측정에 부정적인 영향을 미칩니다.

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 이 지원되지 않는 경우 LIMITED 카메라에서 테스트 범위를 최대화하기 위해 분석된 마지막 프레임만 포함하여 4개의 프레임이 캡처됩니다.

YUV 캡처는 완전히 포화된 BLACK , WHITE , RED , GREENBLUE 테스트 패턴으로 설정됩니다. 테스트 패턴 정의는 센서 Bayer 패턴에 따라 정의되므로 다음 표와 같이 각 색상에 대해 색상 채널을 설정해야 합니다.

색깔 테스트 패턴 데이터(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초 미만인지 확인합니다.