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
- Numpy 1.19.2
- Matplotlib 3.3.2
- Scipy 1.5.2
- pySerial 3.5
- Pillow 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)とチャート用タブレットを設定できます。Mobly testbed は、config.yml
(YAML)ファイルを使用して作成します。この構成ファイル内には複数の testbed を設定できます(タブレット testbed とセンサー フュージョン testbed など)。各 testbed のコントローラ セクションで 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)
タブレット ベースのテスト
タブレット ベースのテストでは、testbed 名にキーワード 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
testbed は 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
センサー フュージョンのテスト
センサー フュージョンのテストを行う場合には、testbed 名にキーワード SENSOR_FUSION
を含める必要があります。正しい testbed はテスト対象のシーンによって決定されます。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
複数の testbed
構成ファイルには複数の testbed を含めることができます。タブレット testbed とセンサー フュージョン testbed の両方を組み合わせて使用するのが一般的です。
タブレット testbed とセンサー フュージョン testbed を含む 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
手動テスト
手動テストは Android 12 でも引き続きサポートされます。ただし testbed について、testbed 名にキーワード MANUAL
を指定して、手動テストであることを示す必要があります。また testbed にはタブレット 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 検証ツールに結果が報告されないため、デバッグ目的でのみ実行できます。config.yml
ファイルは、camera
と scene
についてコマンドラインで上書きできません。これらのパラメータは、個々のテストの config.yml
ファイルで正しく指定されていなければなりません。また、構成ファイル内に複数の testbed がある場合は、--test_bed
フラグを使用して testbed を指定する必要があります。次に例を示します。
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 とタブレットの logcat は
/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 | ALL | 短時間露出、低ゲイン 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 | ALL | 短時間露出、低ゲイン 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
scene4/test_aspect_ratio_and_crop.py
での円の検索は、Android 12 でリファクタリングされました。
以前の Android バージョンでは、サイズと色のフィルタによって、親輪郭(正方形)の内側にある子輪郭(円)を特定するメソッドを使用していました。Android 12 では、すべての輪郭を検索し、フィルタによって最も円状であるフィーチャーを特定するメソッドを使用しています。ディスプレイ上の円でない輪郭を除外するには、最小限の輪郭領域が必要とされ、また円の輪郭は黒でなければなりません。
次の画像に、輪郭とその選択基準を示します。
図 1. 輪郭と選択基準の概念図
Android 12 のメソッドはシンプルであり、タブレットのディスプレイで境界ボックスのクリッピングを行うことで、問題を解決します。円の可能性があるものは、すべてデバッグを目的としてログに記録されます。
Android 12 では、FULL
デバイスと LEVEL3
デバイスに対して切り抜きテストが実行されます。Android 11 以前のバージョンでは、FULL
デバイスでの切り抜きテストのアサーションがスキップされます。
次の表に、特定のデバイスレベルと初期 API レベルに対応する test_aspect_ratio_and_crop.py
のアサーションを示します。
デバイスレベル | 初期 API レベル | アサーション |
---|---|---|
LIMITED | ALL | アスペクト比 4:3、16:9、2:1 フォーマットの FoV |
FULL | < 31 | アスペクト比 4:3、16:9、2:1 フォーマットの FoV |
FULL | ≥ 31 | 切り抜き アスペクト比 4:3、16:9、2:1 フォーマットの FoV |
LEVEL3 | ALL | 切り抜き アスペクト比 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_Soli_color_test_pattern.py
Android 12 では、新しいテスト test_solid_color_test_pattern
が有効になっています。このテストはすべてのカメラで有効です。次の表で説明します。
シーン | テスト名 | 初期 API レベル | 説明 |
---|---|---|---|
0 | test_graphic_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 パターンに基づいているため、次の表に示すように、それぞれの色に対してカラーチャネルを設定する必要があります。
色 | 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 | Bayer | 黒、白、赤、緑、青 |
31 | モノクロ | 黒、白 |
< 31 | Bayer / モノクロ | 黒 |
パフォーマンス クラスのテスト
scene2_c/test_camera_launch_perf_class.py
顔のシーン scene2_c について、前面と背面のメインのカメラの起動時間が 500 ms 未満であることを確認します。
scene2_c/test_jpeg_capture_perf_class.py
顔のシーン scene2_c について、前面と背面のメインのカメラで 1080p JPEG のキャプチャ レイテンシが 1 秒未満であることを確認します。