カメラ ITS

カメラ画像テストスイート(ITS)は、Android カメラによって生成された画像に対してテストを実行するためのフレームワークです。ITS の各テストの一般的な目標は、カメラを特定の方法で設定し、1 つまたは複数のショットをキャプチャし、ショットを検査して期待される画像データが含まれているかどうかを確認することです。多くのテストで、カメラを特定のターゲット チャートに向けるか、特定の光度で照明する必要があります。

ITS は cts/apps/CameraITS の CTS 検証ツール テストハーネスにあります。デバイスは、CTS のサブセットとしてサードパーティ アプリ向けにカメラ フレームワークがアドバタイズしているサポート機能に対応する ITS テストに合格する必要があります。

セットアップ

ITS テストを実行するには、次のセットアップが必要です。

  • テスト対象デバイス(DUT)
  • ホストマシン(Linux パソコンやノートパソコンなど)
  • カメラで撮影するシーン

テスト対象デバイス(DUT)のセットアップ

DUT をセットアップする手順は次のとおりです。

  1. USB 経由で DUT をホストマシンに接続します。
  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 Platform Tools

Android SDK Platform Tools がインストールされている必要があり、ホストマシン上で実行されているシェルまたはターミナルの実行可能パスに ADB が存在する必要があります。Android SDK Platform Tools の公開リリース バージョンについては、SDK Platform Tools リリースノートをご覧ください。

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 testbed を定義する必要があります。ユースケース例は次のとおりです。

タブレット ベースのシーンの config.yml ファイル

タブレット ベースのシーンの config.yml ファイルの例を示します。タブレット ベースのテストでは、testbed 名にキーワード 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

testbed を呼び出すには 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 を testbed 名に含める必要があります。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 テストを Sensor Fusion Box で実行するには、次のコマンドを実行します。

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

複数の testbed の config.yml ファイル

複数の testbed、タブレット testbed、sensor_fusion testbed を含む config.yml ファイルの例を次に示します。正しい testbed はテスト対象のシーンによって決定されます。

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 を testbed 名に含める必要があります。また、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 検証ツール アプリを開き、テストメニューで [Camera ITS Test] を選択します。

  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 テストについて合格、不合格、またはスキップのいずれかを示すログが出力されます。スキップは、デバイスがテスト対象の基礎となる機能をアドバタイズしなかったため、テストに合格したことを示します。たとえば、デバイスがカメラ インターフェースを通じて DNG をサポートしていることをアドバタイズしていない場合、DNG ファイル キャプチャに関連するテストはスキップされ、合格としてカウントされます。

  3. テストがテスト要件を満たしていることを確認するには、緑色のチェックマーク ボタンをタップします。CTS 検証ツールのテストメニュー内の [Camera ITS Test] エントリが緑色になり、スマートフォンがカメラ ITS に合格したことを示します。

並列 DUT テスト

Android 14 以降を搭載しているデバイスは並列 DUT テストをサポートしています。このテストでは、複数の装置を使用して DUT を並列でテストするため、テスト全体の時間を短縮できます。たとえば、並列テストでは、一つの装置でカメラ 0 をテストし、同時に別の装置でカメラ 1 をテストできます。並列テスト セッションのすべてのテストは、参照 DUT 上の CTS 検証ツール セッションに集約されます。並列テストでは手動照明制御がサポートされていないため、Arduino 照明制御を使用して並列テストを実行する必要があります。同じ Arduino コントローラの異なるチャンネルが各装置の照明を制御していることを確認してください。

並列に実行される 3 つの testbed を定義する 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"

testbed を並列に実行するには、次のコマンドを実行します。

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 テストでは、カメラデータ内のショットの露出とゲインのノイズ値が正しいことを確認することにより、ノイズモデルを検証します。