Kamera ITS

Camera Image Test Suite (ITS) ist ein Framework zum Ausführen von Tests an Bildern, die von einer Android-Kamera erstellt wurden. Das allgemeine Ziel jedes Tests in ITS besteht darin, die Kamera auf eine bestimmte Weise zu konfigurieren, eine oder mehrere Aufnahmen zu machen und die Aufnahmen daraufhin zu untersuchen, ob sie die erwarteten Bilddaten enthalten. Bei vielen Tests muss die Kamera auf eine bestimmte Zielkarte gerichtet oder mit einer bestimmten Intensität beleuchtet werden.

ITS befindet sich im CTS Verifier-Testumgebung unter cts/apps/CameraITS . Geräte müssen die ITS-Tests bestehen, die den unterstützten Funktionen entsprechen, die vom Kamera-Framework für Apps von Drittanbietern als Teilmenge von CTS angekündigt werden.

Aufstellen

Um ITS-Tests auszuführen, muss Folgendes eingerichtet werden:

  • Ein zu testendes Gerät (DUT)
  • Ein Host-Computer (z. B. ein Linux-Desktop oder -Laptop)
  • Eine Szene, die die Kamera fotografiert

Setup des zu testenden Geräts (DUT).

Um ein DUT einzurichten, gehen Sie folgendermaßen vor:

  1. Verbinden Sie das DUT über USB mit einem Host-Computer.
  2. Erteilen Sie dem Host Berechtigungen für den Zugriff auf das DUT über ADB.
  3. Installieren Sie die CTS Verifier-App ( CtsVerifier.apk ) auf dem Gerät. Weitere Informationen finden Sie unter Verwenden von CTS Verifier .

    extract root/out/host/linux-x86/cts-verfier/android-cts-verifier.zip
    cd android-cts-verifier
    adb install -r -g CtsVerifier.apk
    

Host-Setup

Für ITS ist es erforderlich, dass der Host-Rechner über USB mit dem DUT verbunden ist, ADB zur Gerätesteuerung und -kommunikation verwenden kann und über die Installation der erforderlichen Software verfügt.

Stellen Sie zum Einrichten Ihres Hostcomputers sicher, dass die folgende Software installiert ist.

Android SDK-Plattformtools

Die Android SDK Platform-Tools müssen installiert sein und ADB muss sich im ausführbaren Pfad der Shell oder des Terminals befinden, die auf dem Host-Computer ausgeführt wird. Die öffentlich veröffentlichte Version der Android SDK Platform Tools finden Sie in den Versionshinweisen zu SDK Platform Tools .

Python

Python muss auf dem Hostcomputer installiert sein. Wir empfehlen die Verwendung einer gebündelten Python-Distribution, um die Unterstützung kompatibler Versionen sicherzustellen. Einzelheiten dazu, welche Python- und Paketversionen für eine bestimmte Version installiert werden müssen, finden Sie in den Camera ITS-Versionshinweisen für die entsprechende Version.

Mobly

Für Android 12 und höher muss das Mobly-Testframework installiert sein. Mit Mobly können Sie ein DUT und ein Diagrammtablett in der Klasse its_base_test einrichten. Führen Sie Folgendes aus, um das Mobly-Testframework zu installieren:

pip install mobly

Umgebungseinrichtung

Führen Sie zum Einrichten der Testumgebung Folgendes aus:

cd CameraITS
source build/envsetup.sh

Dieser Befehl überprüft die Python-Installation, richtet die Umgebungsvariable PYTHONPATH ein und führt Komponententests für die Module utils/*.py aus. Wenn keine Fehler auf dem Terminal ausgegeben werden, ist die Umgebung bereit, die ITS-Tests auszuführen.

Wenn zur Laufzeit die Fehlermeldung libtinfo.so.6: no version information available (required by /bin/sh) , führen Sie den folgenden Befehl aus, um die Datei libtinfo.so.6 umzubenennen.

mv $ENV_DIRECTORY/lib/libtinfo.so.6 $ENV_DIRECTORY/lib/libtinfo.so.6.bak

Szenenaufbau

Zum Einrichten der Szenen empfehlen wir die Verwendung des Camera ITS-in-a-box- Setups, um die Automatisierung, Zuverlässigkeit und Effizienz beim Testen zu vereinfachen. Die ITS-in-a-box-Prüfstände unterstützen alle Beleuchtungs-, Zentrierungs- und Kartenwechselanforderungen für ITS. Außerdem ist ITS-in-a-box für das Testen von Kameraerweiterungen erforderlich.

Stellen Sie beim manuellen Testen Folgendes sicher:

  • Der Prüfling steht auf einem Stativ
  • Der Prüfling wird für jeden Test auf die richtige Szene gerichtet. (Das ITS-Testskript bietet Aufforderungen zum Ändern der Szeneneinrichtung, bevor Tests in einer neuen Szene gestartet werden.)
  • Das DUT wird über USB mit dem Host-Computer verbunden.
  • Der Prüfling bewegt sich während des Testlaufs nicht.
  • Die Szene wird mit einer gleichmäßigen, nicht schwankenden Lichtquelle beleuchtet. (Verwenden Sie kein fluoreszierendes Licht, da dies zu Flimmern führt.)

Das ITS-Testskript zeigt eine Eingabeaufforderung an, in der der Benutzer aufgefordert wird, die Szeneneinrichtung zu ändern, bevor Tests in einer neuen Szene gestartet werden.

Die Ausrichtung des Telefons muss so eingestellt sein, dass die Kamera Bilder ohne Drehung aufnimmt. Dies lässt sich am einfachsten anhand der Gesichtsszenen in Szene 2 überprüfen. Bei den meisten Telefonen befindet sich das Telefon im Querformat, wobei das Telefon für die hintere Kamera gegen den Uhrzeigersinn und für die vordere Kamera im Uhrzeigersinn gedreht wird.

Konfigurationsdateien

Mithilfe des Mobly-Frameworks müssen Sie eine Konfigurationsdatei config.yml erstellen, um das Mobly-Testbed zu definieren. Im Folgenden finden Sie Beispiele für verschiedene Anwendungsfälle.

Tablet-basierte Szenen config.yml-Datei

Im Folgenden finden Sie eine Beispieldatei config.yml für Tablet-basierte Szenen. Für Tablet-basierte Tests muss das Schlüsselwort TABLET im Testbed-Namen enthalten sein. Bei der Initialisierung initialisiert der Mobly-Testläufer die Parameter in der Datei und übergibt sie an die einzelnen Tests.

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

Um die Testumgebung aufzurufen, führen Sie tools/run_all_tests.py aus. Wenn keine Befehlszeilenwerte zur Angabe von Kameras oder Szenen vorhanden sind, wird der Test mit den Werten der Datei config.yml ausgeführt. Wenn Befehlszeilenwerte für Kameras oder Szenen vorhanden sind, überschreiben diese die Werte im Abschnitt TestParams der Datei config.yml . Zum Beispiel:

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-Szenendatei config.yml

Im Folgenden finden Sie eine config_yml Beispieldatei für sensor_fusion Tests. Für sensor_fusion Tests muss das Schlüsselwort SENSOR_FUSION im Testbed-Namen enthalten sein. Android 13 und höher unterstützen aufgrund von Vorschau- und Videostabilisierungstests nur den Arduino-Controller für Sensorfusion. Android 12 unterstützt Arduino- und Canakit-Controller.

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

Um sensor_fusion Tests mit der Sensor-Fusion-Box auszuführen, führen Sie Folgendes aus:

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

Mehrere Testbeds config.yml-Datei

Das Folgende ist ein Beispiel für eine config.yml Datei mit mehreren Testbeds, einem Tablet-Testbed und einem sensor_fusion -Testbed. Die richtige Testumgebung wird durch die getesteten Szenen bestimmt.

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

Manuelles Testen der Datei config.yml

Im Folgenden finden Sie eine Beispieldatei config.yml für manuelle Tests. Ab Android 14 werden manuelle Tests für alle Tests außer den scene_extensions Tests unterstützt. Für manuelle Tests muss das Schlüsselwort MANUAL im Testbed-Namen enthalten sein. Außerdem darf der Abschnitt AndroidDevice keinen Seriennummern- oder Etikettenabschnitt für ein Tablet enthalten.

TestBeds:
  - Name: TEST_BED_MANUAL
    Controllers:
        AndroidDevice:
          - serial: 8A9X0NS5Z
            label: dut

    TestParams:
      debug_mode: "False"
      camera: 0
      scene: 1

Ausführen von ITS-Tests

In diesem Abschnitt wird beschrieben, wie ITS-Tests ausgeführt werden.

Aufrufen von Tests

Nachdem das Gerät, die Hostmaschine (einschließlich Umgebung) und die physische Szene eingerichtet wurden, führen Sie die ITS-Tests mit dem folgenden Prozess aus.

  1. Öffnen Sie die CTS Verifer-App. Wählen Sie im Testmenü Kamera-ITS-Test aus.

  2. Führen Sie auf dem Hostcomputer die ITS-Tests aus dem Verzeichnis CameraITS/ aus. Führen Sie beispielsweise für ein Gerät mit Front- und Rückkamera den folgenden Befehl aus:

    python tools/run_all_tests.py
    

    Das Skript durchläuft Kameras und testet Szenen basierend auf der Datei config.yml . Für Debugging-Setups empfehlen wir, eine der scene2 -Szenen mit einem einzigen Test auszuführen, um die schnellste Abwicklung zu gewährleisten.

    Bei manuellen Tests nimmt das Skript vor Beginn der Ausführung der ITS-Tests für jede Szene ein Bild der aktuellen Szene auf, speichert es als JPEG, druckt den Pfad zum JPEG auf der Konsole aus und fordert den Benutzer auf, dies zu bestätigen das Bild ist ok. Dieser Erfassungs- und Bestätigungsablauf läuft in Schleifen ab, bis der Benutzer bestätigt, dass das Bild in Ordnung ist. Im Folgenden sind die Nachrichten in diesem Fluss aufgeführt.

    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)
    

    Bei jeder Ausführung des Skripts wird ein Protokoll ausgegeben, das für jeden ITS-Test entweder „PASS“, „FAIL“ oder „SKIP“ anzeigt, wobei SKIP angibt, dass der Test bestanden wurde, weil das Gerät die zugrunde liegende, getestete Funktion nicht angekündigt hat. Wenn ein Gerät beispielsweise über die Kameraschnittstellen nicht ankündigt, dass es DNG unterstützt, werden Tests im Zusammenhang mit der DNG-Dateierfassung übersprungen und als bestanden gewertet.

  3. Um zu bestätigen, dass die Tests die Testanforderungen erfüllt haben, tippen Sie auf die Schaltfläche mit dem grünen Häkchen. Der Eintrag „Kamera-ITS-Test“ im CTS-Verifier-Testmenü wird dann grün und bedeutet, dass das Telefon den Kamera-ITS-Test bestanden hat.

Parallele Prüflingsprüfung

Geräte mit Android 14 oder höher unterstützen parallele DUT-Tests. Auf diese Weise können Sie Prüflinge parallel mit mehreren Prüfständen testen, um die Gesamttests zu beschleunigen. Durch paralleles Testen können Sie beispielsweise Kamera 0 in einem Rig und Kamera 1 in einem anderen Rig gleichzeitig testen. Alle Tests für parallele Testsitzungen werden in der CTS-Verifier-Sitzung auf dem Referenz-DUT zusammengefasst. Sie müssen parallele Tests mit der Arduino-Beleuchtungssteuerung durchführen, da die manuelle Beleuchtungssteuerung bei parallelen Tests nicht unterstützt wird. Stellen Sie sicher, dass ein anderer Kanal auf demselben Arduino-Controller die Beleuchtung für jedes Rig steuert.

Im Folgenden finden Sie eine Beispieldatei config.yml , die drei Testumgebungen für die parallele Ausführung definiert.

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"

Um die Testbeds parallel auszuführen, verwenden Sie den folgenden Befehl:

for i in 0 1 2; do python3 tools/run_all_tests.py testbed_index=$i num_testbeds=3 & done; wait

DNG-Rauschmodell

Geräte, die die Fähigkeit zur RAW- oder DNG-Erfassung ankündigen, müssen in den Erfassungsergebnis-Metadaten jeder Rohaufnahme ein Rauschmodell bereitstellen. Dieses Rauschmodell muss in den Kamera-HAL für jede Kamera (z. B. Vorder- und Rückkamera) auf dem Gerät eingebettet werden, das Unterstützung beansprucht.

Implementierung des Geräuschmodells

Um ein Rauschmodell zu implementieren, befolgen Sie diese Schritte, um ein Rauschmodell zu generieren und das Modell in die Kamera-HAL einzubetten.

  1. Um für jede Kamera ein Rauschmodell zu generieren, führen Sie das Skript dng_noise_model.py im tools Verzeichnis aus. Dadurch wird ein C-Code-Snippet ausgegeben. Weitere Informationen zum Einrichten der Kamera und der Aufnahmeumgebung finden Sie im Dokument DngNoiseModel.pdf im tools Verzeichnis.

  2. Um das Rauschmodell für das Gerät zu implementieren, schneiden Sie das C-Code-Snippet aus und fügen Sie es in die Kamera-HAL ein.

Validierung des Geräuschmodells

Der automatisierte ITS-Test tests/scene1_1/test_dng_noise_model.py validiert das Rauschmodell, indem er überprüft, ob die in den Kameradaten angegebenen Rauschwerte für die Aufnahmebelichtung und -verstärkung korrekt sind.