Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る

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

Android 12リリースには、多くのCameraITSの変更が含まれています。このページでは、4つの大きなカテゴリに分類される変更を要約します。

Python3へのリファクタリング

2020年1月のPython2.7の非推奨により、CameraITSコードベース全体がPython3にリファクタリングされました。Android12では、次のPythonバージョンとライブラリが必要です。

メインのテストランチャーであるtools/run_all_tests.pyは、Android 11以前のバージョンと同じままで、Python3にリファクタリングされます。

個々のテストはすべてリファクタリングされ、 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 caption_request_utils.py
  • pymodules/its/target.pyutils/target_exposure_utils.py
  • tools/hw.pyutils/sensor_fusion_utils.py

Moblyテストフレームワークの採用

Moblyは、カスタムハードウェアセットアップを備えた複数のデバイスを必要とするテストケースをサポートするPythonベースのテストフレームワークです。 Camera ITSは、Moblyテストインフラストラクチャを使用して、テストのより適切な制御とログ記録を可能にします。

Camera ITSは、Moblyテストインフラストラクチャを使用して、テストのより適切な制御とログ記録を可能にします。 Moblyは、カスタムハードウェアセットアップを備えた複数のデバイスを必要とするテストケースをサポートするPythonベースのテストフレームワークです。 Moblyの詳細については、 google / moblyを参照してください。

config.ymlファイル

Moblyフレームワークを使用すると、テスト対象デバイス(DUT)とチャートタブレットをits_base_testクラスにセットアップできます。 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

手動テスト

手動テストは引き続きAndroid12でサポートされています。ただし、テストベッドは、テストベッド名にキーワード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では、CameraITSのテストアーティファクトはAndroid11以下と同様に保存されますが、次の変更が加えられています。

  • テストアーティファクトの/tmpディレクトリでは、わかりやすくするために、8文字のランダムな文字列の前にCameraITS_が追加されています。
  • テスト出力とエラーは、 test_name_stdout.txttest_name_stderr.txtではなく、各テストのtest_log.DEBUGに保存されます。
  • 個々のテストのDUTおよびタブレットlogcatは、 /tmp/CameraITS_########ディレクトリに保存され、3Aの問題のデバッグに必要なすべての情報がログに記録されるため、デバッグが簡素化されます。

テストの変更

Android 12では、タブレットシーンはPDFファイルではなくPNGファイルです。 PNGファイルを使用すると、より多くのタブレットモデルでシーンを適切に表示できます。

scene0 / test_jitter.py

test_jitterテストは、Android12の物理的な隠しカメラで実行されます。

scene1_1 / test_black_white.py

Android 12の場合、 test_black_whiteにはtest_black_whitetest_channel_saturationの両方の機能があります。

次の表は、Android11での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]の違いの許容範囲を減らして、白い画像の色合いをなくしました。

次の表は、Android12でのマージされたテスト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テストは、Android12の物理的な隠しカメラで実行されます。

scene1_2 / test_tonemap_sequence.py

test_tonemap_sequenceテストは、Android12のLIMITEDカメラで実行されます。

シーン1_2 / test_yuv_plus_raw.py

test_yuv_plus_rawテストは、Android12の物理的な隠しカメラで実行されます。

scene2_a / test_format_combos.py

test_format_combosテストは、Android12のLIMITEDカメラで実行されます。

scene3 / test_flip_mirror.py

test_flip_mirrorテストは、Android12のLIMITEDカメラで実行されます。

scene4 / test_aspect_ratio_and_crop.py

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

以前の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 Python2コード

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 Python3コード

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倍に制限します。

次の画像は、Android11とAndroid12の機能検出の違いを示しています。最小機能要件のしきい値を上げると、低品質の機能が検出され、測定に悪影響を及ぼします。

Android11とAndroid12の機能検出の違いsensor_fusion機能検出

図2.Android11とAndroid12の機能検出の違い

新しいテスト

scene0 / test_solid_color_test_pattern.py

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

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

YUVキャプチャは、完全に飽和したBLACKWHITEREDGREEN 、および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

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

scene2_c / test_jpeg_capture_perf_class.py

シーン2_cの顔のシーンを持つフロントとリアのプライマリカメラの両方で、1080pJPEGキャプチャレイテンシが1秒未満であることを確認します。