Android 12 Camera Image TestSuiteリリースノート

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 に加えて、タブレットのbrightnesschart_distancedebug_modecamera_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

手動テスト

MANUALテストは、Android 12 でも引き続きサポートされています。また、テストベッドにタブレット 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 では、カメラ ITS のテスト アーティファクトは Android 11 以前と同様に保存されますが、次の変更があります。

  • テスト アーティファクトの/tmpディレクトリには、わかりやすくするために、8 文字のランダムな文字列の前にCameraITS_が追加されています。
  • テスト出力とエラーは、 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 の 2 つの個別のテストについて説明します。

テスト名最初の 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

Android 12 では、 scene4/test_aspect_ratio_and_crop.pyでの円の検索がリファクタリングされました。

以前の Android バージョンでは、サイズと色のフィルターを使用して、親輪郭 (正方形) 内の子輪郭 (円) を見つける方法を使用していました。 Android 12 では、すべての輪郭を見つけてから、最も円形の特徴を見つけてフィルタリングする方法を使用しています。ディスプレイ上の偽の円を除外するには、最小限の輪郭領域が必要であり、円の輪郭は黒でなければなりません。

コンターとその選択基準を次の図に示します。

輪郭と選択基準の概念図

図 1.等高線と選択基準の概念図

Android 12 の方法はよりシンプルで、一部のディスプレイ タブレットでのバウンディング ボックスのクリッピングの問題を解決するために機能します。すべてのサークル候補は、デバッグ目的でログに記録されます。

Android 12 では、 FULLおよびLEVEL3デバイスに対してクロップ テストが実行されます。 Android 11 以前のバージョンでは、 FULLデバイスのクロップ テスト アサーションがスキップされます。

次の表に、特定のデバイス レベルと最初の API レベルに対応するtest_aspect_ratio_and_crop.pyのアサーションを示します。

デバイス レベル最初の API レベルアサーション
限定全てアスペクト比
4:3、16:9、2:1 フォーマットの FoV
満杯< 31アスペクト比
4:3、16:9、2:1 フォーマットの FoV
満杯≧31作物
アスペクト比
4:3、16:9、2:1 フォーマットの FoV
レベル3全て作物
アスペクト比
4:3、16:9、2:1 フォーマットの FoV

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 個の機能を見つけ、中央の 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

Android 12 では、新しいテストtest_solid_color_test_patternが有効になっています。このテストはすべてのカメラで有効になっており、次の表で説明されています。

シーンテスト名最初の 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がサポートされている場合、テストされた設定ごとに 1 つの YUV フレームがキャプチャされます。 PER_FRAME_CONTROLがサポートされていない場合、4 つのフレームがキャプチャされ、最後のフレームのみが分析されて、 LIMITEDカメラでのテスト カバレッジが最大化されます。

YUV キャプチャは、完全に飽和したBLACKWHITEREDGREEN 、およびBLUEテスト パターンに設定されます。テスト パターンの定義はセンサーの 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バイエル/MONO

性能クラス試験

scene2_c/test_camera_launch_perf_class.py

Scene2_c の顔シーンを使用して、フロントとリアのプライマリ カメラの両方でカメラの起動が 500 ミリ秒未満であることを確認します。

scene2_c/test_jpeg_capture_perf_class.py

1080p JPEG キャプチャ レイテンシが、シーン 2_c の顔のシーンで、前面と背面のプライマリ カメラの両方で 1 秒未満であることを確認します。