Android 12 リリースには、カメラ ITSの多くの変更が含まれています。このページでは、大きく 4 つのカテゴリに分類される変更点をまとめています。
Python 3 へのリファクタリング
2020 年 1 月に Python 2.7 が廃止されたため、カメラ ITS コードベース全体が Python 3 にリファクタリングされました。 Android 12 では、次の Python バージョンとライブラリが必要です。
- Python 3.7.9 または Python 3.7.10
- OpenCV 3.4.2
- ナンピー 1.19.2
- Matplotlib 3.3.2
- スパイ 1.5.2
- pyシリアル3.5
- 枕 8.1.0
- PyYAML 5.3.1
メインのテスト ランチャーであるtools/run_all_tests.py
は、Android 11 以前のバージョンと同じままで、Python 3 にリファクタリングされています。
個々のテストはすべてリファクタリングされ、 tests/its_base_test.py
で定義された新しいテスト セットアップ クラスを使用します。ほとんどのテスト名と機能は同じままです。 Android 12 では、すべての個々のテストでシーンが読み込まれるようになりました。テストごとにシーンをロードすると全体のテスト時間が長くなりますが、個々のテストのデバッグが可能になります。
個々のテストの変更の詳細については、テストの変更を参照してください。
次の Python モジュールはリファクタリングされ、名前が変更されています。
-
pymodules/its/caps.py
→utils/camera_properties_utils.py
-
pymodules/its/cv2image.py
→utils/opencv_processing_utils.py
-
pymodules/its/device.py
→utils/its_session_utils.py
-
pymodules/its/error.py
→utils/error_util.py
-
pymodules/its/image.py
→utils/image_processing_utils.py
-
pymodules/its/objects.py
→utils/capture_request_utils.py
-
pymodules/its/target.py
→utils/target_exposure_utils.py
-
tools/hw.py
→utils/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 に加えて、タブレットのbrightness
、 chart_distance
、 debug_mode
、 camera_id
、 scene_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 以前と同様のコマンドを使用して、コマンドラインでcamera
とscene
構成ファイルの値をオーバーライドできます。
例えば:
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
ファイルはcamera
とscene
のコマンド ラインで上書きできないため、これらのパラメーターは、問題の個々のテストの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.txt
とtest_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_white
とtest_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 の機能検出の違いを示しています。最小機能要件のしきい値を上げると、品質の低い機能が検出され、測定に悪影響を及ぼします。
図 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 キャプチャは、完全に飽和したBLACK
、 WHITE
、 RED
、 GREEN
、および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 秒未満であることを確認します。