카메라 ITS

카메라 이미지 테스트 모음(ITS)은 Android 카메라에서 생성된 이미지에 테스트를 실행하기 위한 프레임워크입니다. ITS 각 테스트의 일반적인 목표는 특정 방식으로 카메라를 구성하고, 사진을 하나 이상 캡처하고, 사진을 검사하여 예상 이미지 데이터가 포함되어 있는지 확인하는 것입니다. 대부분의 테스트에서 카메라는 특정 타겟 차트를 향하거나 특정 강도로 조명을 받아야 합니다.

ITS는 cts/apps/CameraITS의 CTS 인증 도구 테스트 하네스에 있습니다. 기기는 CTS의 하위 집합으로 서드 파티 앱의 카메라 프레임워크에서 광고하는 지원 기능에 상응하는 ITS 테스트를 통과해야 합니다.

설정

ITS 테스트를 실행하려면 다음을 설정해야 합니다.

  • 테스트 대상 기기(DUT)
  • 호스트 머신(예: Linux 데스크톱 또는 노트북)
  • 카메라가 촬영하는 장면

테스트 대상 기기(DUT) 설정

DUT를 설정하려면 다음 단계를 따르세요.

  1. DUT를 USB를 통해 호스트 머신에 연결합니다.
  2. 호스트에서 ADB를 통해 DUT에 액세스하도록 권한을 부여합니다.
  3. CTS 인증 도구 앱(CtsVerifier.apk)을 기기에 설치합니다. 자세한 내용은 CTS 인증 도구 사용을 참고하세요.

    extract root/out/host/linux-x86/cts-verfier/android-cts-verifier.zip
    cd android-cts-verifier
    adb install -r -g CtsVerifier.apk
    

호스트 설정

ITS에서는 호스트 머신이 USB를 통해 DUT에 연결되어야 하고 기기 제어 및 통신을 위해 ADB를 사용할 수 있어야 하며 필수 소프트웨어가 설치되어 있어야 합니다.

호스트 머신을 설정하려면 다음 소프트웨어가 설치되어 있는지 확인하세요.

Android SDK 플랫폼 도구

Android SDK 플랫폼 도구가 설치되어 있어야 하고 ADB는 호스트 머신에서 실행되는 셸이나 터미널의 실행 경로에 있어야 합니다. Android SDK 플랫폼 도구의 공개 출시 버전은 SDK 플랫폼 도구 출시 노트를 참고하세요.

Python

Python이 호스트 머신에 설치되어 있어야 합니다. 호환되는 버전을 지원하려면 번들 Python 배포판을 사용하는 것이 좋습니다. 특정 버전을 위해 어떤 Python 및 패키지 버전을 설치할지에 관한 자세한 내용은 해당 버전의 카메라 ITS 출시 노트를 참고하세요.

Mobly

Android 12 이상의 경우 Mobly 테스트 프레임워크가 설치되어 있어야 합니다. Mobly를 사용하면 its_base_test 클래스에서 DUT와 차트 태블릿을 설정할 수 있습니다. Mobly 테스트 프레임워크를 설치하려면 다음을 실행하세요.

pip install mobly

환경 설정

테스트 환경을 설정하려면 다음을 실행하세요.

cd CameraITS
source build/envsetup.sh

이 명령어를 통해 Python 설치를 확인하고 PYTHONPATH 환경 변수를 설정하고 utils/*.py 모듈에서 단위 테스트를 실행합니다. 터미널에 오류가 출력되지 않으면 환경이 ITS 테스트를 실행할 준비가 된 것입니다.

런타임에 libtinfo.so.6: no version information available (required by /bin/sh) 오류 메시지가 표시되면 다음 명령어를 실행하여 libtinfo.so.6 파일의 이름을 바꾸세요.

mv $ENV_DIRECTORY/lib/libtinfo.so.6 $ENV_DIRECTORY/lib/libtinfo.so.6.bak

장면 설정

장면을 설정하려면 테스트의 자동화와 안정성, 효율성을 쉽게 달성하기 위해 카메라 ITS-in-a-box 설정을 사용하는 것이 좋습니다. ITS-in-a-box 테스트 장비는 ITS의 모든 조명, 센터링, 차트 변경 요구사항을 지원합니다. ITS-in-a-box는 카메라 확장 프로그램 테스트에도 필요합니다.

수동 테스트의 경우 다음을 확인해야 합니다.

  • DUT가 삼각대에 놓여 있습니다.
  • DUT가 각 테스트에서 올바른 장면을 가리킵니다. ITS 테스트 스크립트는 새 장면에서 테스트를 시작하기 전에 장면 설정을 변경하라는 메시지를 제공합니다.
  • DUT가 USB를 통해 호스트 머신에 연결되어 있습니다.
  • DUT가 테스트 실행 중에 이동하지 않습니다.
  • 안정적이고 변동되지 않는 광원으로 장면을 비춥니다. 형광등은 깜박거리므로 사용하지 마세요.

ITS 테스트 스크립트는 새 장면에서 테스트를 시작하기 전에 사용자에게 장면 설정을 변경하라고 요청하는 메시지를 표시합니다.

카메라가 회전하지 않고 이미지를 찍도록 휴대전화 방향이 설정되어 있어야 합니다. 이를 확인하는 가장 쉬운 방법은 scene2의 얼굴 장면을 사용하는 것입니다. 대부분의 휴대전화에는 후면 카메라의 경우 시계 반대 방향으로 회전하고 전면 카메라의 경우 시계 방향으로 회전하는 가로 모드 방향의 휴대전화가 있습니다.

구성 파일

Mobly 프레임워크를 사용하려면 config.yml 구성 파일을 만들어 Mobly 테스트베드를 정의해야 합니다. 다음은 다양한 사용 사례를 보여주는 예입니다.

태블릿 기반 장면 config.yml 파일

다음은 태블릿 기반 장면의 config.yml 파일 예입니다. 태블릿 기반 테스트의 경우 키워드 TABLET이 테스트베드 이름에 있어야 합니다. 초기화 중에 Mobly 테스트 실행기는 파일의 매개변수를 초기화하고 이를 개별 테스트에 전달합니다.

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"  # "True" or "False"; quotes needed
      lighting_cntl: <controller-type>  # "arduino" or "None"; quotes needed
      lighting_ch: <controller-channel>
      camera: 0
      foldable_device: "False". # set "True" if testing foldable
      scene: <scene-name>  # if <scene-name> runs all scenes

테스트베드를 호출하려면 tools/run_all_tests.py를 실행하세요. 카메라나 장면을 지정하는 명령줄 값이 없으면 테스트가 config.yml 파일 값으로 실행됩니다. 카메라나 장면의 명령줄 값이 있으면 이는 config.yml 파일의 TestParams 섹션에 있는 값을 재정의합니다. 예:

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 장면 config.yml 파일

다음은 sensor_fusion 테스트의 config_yml 파일 예입니다. sensor_fusion 테스트의 경우 키워드 SENSOR_FUSION이 테스트베드 이름에 있어야 합니다. Android 13 이상에서는 미리보기 및 동영상 안정화 테스트로 인해 센서 퓨전을 위한 Arduino 컨트롤러만 지원합니다. Android 12에서는 Arduino 및 Canakit 컨트롤러를 지원합니다.

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
      rotator_ch: 1
      camera: 0

센서 퓨전 상자sensor_fusion 테스트를 하려면 다음을 실행하세요.

python tools/run_all_tests.py scenes=sensor_fusion
python tools/run_all_tests.py scenes=sensor_fusion camera=0

여러 테스트베드 config.yml 파일

다음은 태블릿 테스트베드, sensor_fusion 테스트베드 등 여러 테스트베드가 있는 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

수동 테스트 config.yml 파일

다음은 수동 테스트의 config.yml 파일 예입니다. Android 14부터 수동 테스트는 scene_extensions 테스트를 제외하고 모든 테스트에서 지원됩니다. 수동 테스트의 경우 키워드 MANUAL이 테스트베드 이름에 있어야 합니다. 또한 AndroidDevice 섹션에는 태블릿의 일련번호 또는 라벨 섹션을 포함할 수 없습니다.

TestBeds:
  - Name: TEST_BED_MANUAL
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut

    TestParams:
      debug_mode: "False"
      camera: 0
      scene: 1

ITS 테스트 실행

이 섹션에서는 ITS 테스트 실행 방법을 설명합니다.

테스트 호출

기기, 호스트 머신(환경 포함), 물리적 장면을 설정한 후에는 다음 프로세스를 사용하여 ITS 테스트를 실행하세요.

  1. CTS 인증 도구 앱을 엽니다. 테스트 메뉴에서 카메라 ITS 테스트를 선택합니다.

  2. 호스트 머신에서 CameraITS/ 디렉터리의 ITS 테스트를 실행합니다. 예를 들어 전면 카메라와 후면 카메라가 있는 기기의 경우 다음 명령어를 실행하세요.

    python tools/run_all_tests.py
    

    스크립트는 config.yml 파일에 따라 카메라와 테스트 장면을 반복합니다. 디버깅 설정의 경우 가장 빠른 처리 시간을 위해 단일 테스트로 scene2 장면 중 하나를 실행하는 것이 좋습니다.

    수동 테스트의 경우 각 장면에서 ITS 테스트 세트를 실행하기 전에 스크립트가 현재 장면의 사진을 찍어 JPEG로 저장하고 JPEG 경로를 콘솔에 출력하며 사용자에게 이미지가 괜찮은지 확인하도록 요청합니다. 이 캡처 및 확인 흐름은 사용자가 이미지가 괜찮다고 확인할 때까지 반복됩니다. 다음은 이 흐름에 표시되는 메시지입니다.

    Preparing to run ITS on camera 0
    Start running ITS on camera:  0
    Press Enter after placing camera 0 to frame the test scene:
    scene1_1
    The scene setup should be: A grey card covering at least the   middle 30% of the scene
    Running vendor 3A on device
    Capture an image to check the test scene
    Capturing 1 frame with 1 format [yuv]
    Please check scene setup in /tmp/tmpwBOA7g/0/scene1_1.jpg
    Is the image okay for ITS scene1_1? (Y/N)
    

    스크립트를 실행할 때마다 각 ITS 테스트에 관한 PASS, FAIL 또는 SKIP이 표시된 로그가 출력됩니다. 여기서 SKIP은 테스트되는 기본 기능을 기기에서 광고하지 않았으므로 테스트에 통과되었음을 나타냅니다. 예를 들어 기기에서 DNG를 지원한다고 카메라 인터페이스를 통해 광고하지 않으면 DNG 파일 캡처와 관련된 테스트를 건너뛰고 통과로 간주합니다.

  3. 테스트가 테스트 요구사항을 충족했다고 확인하려면 녹색 체크표시 버튼을 탭합니다. 그러면 CTS 인증 도구 테스트 메뉴의 카메라 ITS 테스트 항목이 녹색으로 바뀌어 휴대전화가 카메라 ITS를 통과했음을 나타냅니다.

병렬 DUT 테스트

Android 14 이상을 실행하는 기기에서는 병렬 DUT 테스트를 지원합니다. 이를 통해 여러 장비와 병렬로 DUT를 테스트하여 전체 테스트 속도를 높일 수 있습니다. 예를 들어 병렬로 테스트하면 한 장비에서 카메라 0을 테스트하고 다른 장비에서 카메라 1을 동시에 테스트할 수 있습니다. 병렬 테스트 세션의 모든 테스트는 참조 DUT의 CTS 인증 도구 세션에 집계됩니다. 병렬 테스트는 Arduino 조명 제어로 실행해야 합니다. 수동 조명 제어는 병렬 테스트에서 지원되지 않기 때문입니다. 동일한 Arduino 컨트롤러의 다른 채널이 각 장비의 조명을 제어하는지 확인합니다.

다음은 병렬로 실행할 세 개의 테스트베드를 정의하는 샘플 config.yml 파일입니다.

TestBeds:
  - Name: TEST_BED_TABLET_SCENES_INDEX_0
    Controllers:
        AndroidDevice:
          - serial: <device-id-0>
            label: dut
          - serial: <tablet-id-0>
            label: tablet
    TestParams:
      brightness: 192
      chart_distance: 22.0
      debug_mode: "False"
      lighting_cntl: "arduino"
      lighting_ch: <controller-channel-0>
      camera: 0
      scene: <scene-name>  # if <scene-name> left as-is runs all scenes
      foldable_device: "False"

  - Name: TEST_BED_TABLET_SCENES_INDEX_1
    Controllers:
        AndroidDevice:
          - serial: <device-id-1>
            label: dut
          - serial: <tablet-id-1>
            label: tablet
    TestParams:
      brightness: 192
      chart_distance: 22.0
      debug_mode: "False"
      lighting_cntl: "arduino"
      lighting_ch: <controller-channel-1>
      camera: 1
      scene: <scene-name>  # if <scene-name> left as-is runs all scenes
      foldable_device: "False"

  # TEST_BED_SENSOR_FUSION represents testbed index 2
  # Parallel sensor_fusion is currently unsupported due to Arduino requirements
  - Name: TEST_BED_SENSOR_FUSION
    # Test configuration for sensor_fusion
    Controllers:
        AndroidDevice:
          - serial: <device-id>
            label: dut
    TestParams:
      fps: 30
      img_size: 640,480
      test_length: 7
      debug_mode: "False"
      chart_distance: 25
      rotator_cntl: "arduino"
      rotator_ch: <controller-channel-2>
      camera: <camera-id>
      foldable_device: "False"
      tablet_device: "False"
      lighting_cntl: "None"
      lighting_ch: <controller-channel>
      scene: "sensor_fusion"

테스트베드를 병렬로 실행하려면 다음 명령어를 사용하세요.

for i in 0 1 2; do python3 tools/run_all_tests.py testbed_index=$i num_testbeds=3 & done; wait

DNG 노이즈 모델

RAW 또는 DNG를 캡처하는 기능을 광고하는 기기는 각 RAW 사진의 캡처 결과 메타데이터에 노이즈 모델을 제공해야 합니다. 이 노이즈 모델은 지원을 주장하는 기기에서 각 카메라(예: 전면 카메라, 후면 카메라)의 카메라 HAL에 삽입해야 합니다.

노이즈 모델 구현

노이즈 모델을 구현하려면 다음 단계를 따라 노이즈 모델을 생성하고 카메라 HAL에 모델을 삽입합니다.

  1. 각 카메라의 노이즈 모델을 생성하려면 tools 디렉터리의 dng_noise_model.py 스크립트를 실행합니다. 그러면 C 코드 스니펫이 출력됩니다. 카메라 및 캡처 환경을 설정하는 방법에 관한 자세한 내용은 tools 디렉터리의 DngNoiseModel.pdf 문서를 참고하세요.

  2. 기기의 노이즈 모델을 구현하려면 C 코드 스니펫을 잘라내 카메라 HAL에 붙여넣습니다.

노이즈 모델 유효성 검사

tests/scene1_1/test_dng_noise_model.py 자동 ITS 테스트는 카메라 데이터에 제공된 사진 노출 및 게인의 노이즈 값이 올바른지 확인하여 노이즈 모델의 유효성을 검사합니다.