Note di rilascio della suite di test per le immagini della fotocamera Android 12

Nella release di Android 12 sono incluse diverse modifiche all'ITS della fotocamera. Questa pagina riepiloga le modifiche, che rientrano in quattro ampie categorie:

Refactoring a Python 3

A causa del ritiro di Python 2.7 a gennaio 2020, l'intera codebase di Camera ITS è stata sottoposta a refactoring in Python 3. In Android 12 sono richieste le seguenti versioni di Python e librerie:

Il launcher di test principale, tools/run_all_tests.py, rimane invariato rispetto alle versioni Android 11 o precedenti ed è sottoposto a refactoring in Python 3.

Tutti i singoli test vengono sottoposti a refactoring e utilizzano la nuova classe di configurazione dei test definita in tests/its_base_test.py. La maggior parte dei nomi e delle funzionalità dei test rimangono invariati. In Android 12 tutti i singoli test caricano ora le scene. Il caricamento dello scenario per ogni test aumenta il tempo complessivo del test, ma consente il debug dei singoli test.

Per ulteriori informazioni sulle singole modifiche ai test, consulta Modifiche ai test.

I seguenti moduli Python sono stati sottoposti a refactoring con una modifica del nome:

  • 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

Adozione del framework di test Mobly

Mobly è un framework di test basato su Python che supporta scenari di test che richiedono più dispositivi con configurazioni hardware personalizzate. Camera ITS utilizza l'infrastruttura di test Mobly per consentire un migliore controllo e registrazione dei test.

Camera ITS utilizza l'infrastruttura di test Mobly per consentire un migliore controllo e la registrazione dei test. Mobly è un framework di test basato su Python che supporta scenari di test che richiedono più dispositivi con configurazioni hardware personalizzate. Per saperne di più su Mobly, consulta google/mobly.

File config.yml

Con il framework Mobly, puoi configurare un dispositivo in fase di test (DUT) e un tablet con grafico nella classe its_base_test. Un file config.yml (YAML) viene utilizzato per creare un banco di prova Mobly. In questo file di configurazione possono essere configurati più testbed, ad esempio un testbed per tablet e uno per la fusione dei sensori. All'interno della sezione del controller di ogni testbed, puoi specificare device_ids per identificare i dispositivi Android appropriati per il test runner. Oltre agli ID dispositivo, nella classe di test vengono passati altri parametri come brightness, chart_distance, debug_mode, camera_id e scene_id del tablet. I valori comuni dei parametri di test sono:

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)

Test basati su tablet

Per i test basati su tablet, la parola chiave TABLET deve essere presente nel nome del testbed. Durante l'inizializzazione, il test runner Mobly inizializza TestParams e li passa ai singoli test.

Di seguito è riportato un file config.yml di esempio per le corse basate su tablet.

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

Il testbed può essere richiamato utilizzando tools/run_all_tests.py. Se non sono presenti valori della riga di comando, i test vengono eseguiti con i valori del file config.yml. Inoltre, puoi sostituire i valori dei file di configurazione camera e scene nella riga di comando utilizzando comandi simili ad Android 11 o versioni precedenti.

Ad esempio:

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

Test di fusione dei sensori

Per i test di fusione dei sensori, il nome del banco di prova deve includere la parola chiave SENSOR_FUSION. Il banco di prova corretto è determinato dalle scene testate. Android 12 supporta i controller Arduino e Canakit per la fusione dei sensori.

Di seguito è riportato un file config.yml di esempio per le esecuzioni di fusione dei sensori.

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

Per eseguire test di fusione dei sensori con il banco di prova per la fusione dei sensori, utilizza:

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

Più testbed

Nel file di configurazione possono essere inclusi più testbed. La combinazione più comune è quella di avere sia un banco di prova per tablet sia un banco di prova per la fusione dei sensori.

Di seguito è riportato un file config.yml di esempio con testbed per tablet e fusione dei sensori.

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

Test manuale

I test manuali continuano a essere supportati in Android 12. Tuttavia, il testbed deve identificare il test come tale con la parola chiave MANUAL nel nome del testbed. Inoltre, il testbed non può includere un ID tablet.

Di seguito è riportato un file config.yml di esempio per i test manuali.

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

    TestParams:
      debug_mode: "False"
      chart_distance: 31.0
      camera: 0
      scene: scene1

Testare gli scenari senza tablet

Il test per la scena 0 e la scena 5 può essere eseguito con TEST_BED_TABLET_SCENES o con TEST_BED_MANUAL. Tuttavia, se il test viene eseguito con TEST_BED_TABLET_SCENES, il tablet deve essere connesso e l'ID seriale del tablet deve essere valido anche se il tablet non viene utilizzato perché la configurazione della classe di test assegna il valore dell'ID seriale per il tablet.

Eseguire test individuali

I singoli test possono essere eseguiti solo a scopo di debug perché i risultati non vengono segnalati a CTS Verifier. Poiché i file config.yml non possono essere sovrascritti nella riga di comando per camera e scene, questi parametri devono essere corretti nel file config.yml per il test individuale in questione. Inoltre, se nel file di configurazione è presente più di un testbed, devi specificare il testbed con il flag --test_bed. Ad esempio:

python tests/scene1_1/test_black_white.py --config config.yml --test_bed TEST_BED_TABLET_SCENES

Artefatti test

In Android 12, gli artefatti di test per Camera ITS vengono memorizzati in modo simile ad Android 11 o versioni precedenti, ma con le seguenti modifiche:

  • Per chiarezza, alla directory dell'artefatto di test /tmp è stato anteposto CameraITS_ alla stringa casuale di 8 caratteri.
  • L'output e gli errori dei test vengono memorizzati in test_log.DEBUG per ogni test anziché in test_name_stdout.txt e test_name_stderr.txt.
  • I logcat del DUT e del tablet di ogni test individuale sono archiviati nella directory /tmp/CameraITS_########, semplificando il debug poiché vengono registrate tutte le informazioni necessarie per eseguire il debug dei problemi 3A.

Testa modifiche

In Android 12 le scene del tablet sono file PNG anziché PDF. L'utilizzo di file PNG consente a un maggior numero di modelli di tablet di visualizzare correttamente le scene.

scene0/test_jitter.py

Il test test_jitter viene eseguito su telecamere fisiche nascoste in Android 12.

scene1_1/test_black_white.py

Per Android 12, test_black_white ha la funzionalità di test_black_white e test_channel_saturation.

La tabella seguente descrive i due test individuali in Android 11.

Nome test Primo livello API Assertions
scene1_1/test_black_white.py TUTTI Valori RGB con esposizione breve e guadagno basso ~[0, 0, 0]
Valori RGB con esposizione lunga e guadagno elevato ~[255, 255, 255]
scene1_1/test_channel_saturation.py 29 Tolleranza ridotta per le differenze [255, 255, 255] per eliminare la tonalità di colore nelle immagini bianche.

La tabella seguente descrive il test unito, scene1_1/test_black_white.py, in Android 12.

Nome test Primo livello API Assertions
scene1_1/test_black_white.py TUTTI Valori RGB di esposizione breve e guadagno basso ~[0, 0, 0]
Valori RGB di esposizione lunga e guadagno elevato ~[255, 255, 255] e tolleranza ridotta tra i valori per eliminare la tonalità di colore nelle immagini bianche.

scene1_1/test_burst_sameness_manual.py

Il test test_burst_sameness_manual viene eseguito su telecamere fisiche nascoste in Android 12.

scene1_2/test_tonemap_sequence.py

Il test test_tonemap_sequence viene eseguito su FOTOCAMERE LIMITATE in Android 12.

scene1_2/test_yuv_plus_raw.py

Il test test_yuv_plus_raw viene eseguito su telecamere fisiche nascoste in Android 12.

scene2_a/test_format_combos.py

Il test test_format_combos viene eseguito su FOTOCAMERE LIMITATE in Android 12.

scene3/test_flip_mirror.py

Il test test_flip_mirror viene eseguito su FOTOCAMERE LIMITATE in Android 12.

scene4/test_aspect_ratio_and_crop.py

La ricerca dei cerchi in scene4/test_aspect_ratio_and_crop.py è stata refactored in Android 12.

Le versioni precedenti di Android utilizzavano un metodo che prevedeva la ricerca di un contorno figlio (il cerchio) all'interno del contorno padre (il quadrato) con filtri per dimensioni e colore. Android 12 utilizza un metodo che prevede di trovare tutti i contorni e poi filtrare trovando le caratteristiche più circolari. Per escludere cerchi spuri sul display, è necessaria un'area di contorno minima e il contorno del cerchio deve essere nero.

I contorni e i relativi criteri di selezione sono mostrati nell'immagine seguente.

Disegno concettuale di contorni e criteri di selezione

Figura 1. Disegno concettuale di contorni e criteri di selezione

Il metodo Android 12 è più semplice e risolve il problema del ritaglio del riquadro di selezione in alcuni tablet con display. Tutti i candidati del cerchio vengono registrati a scopo di debug.

In Android 12, il test di ritaglio viene eseguito per i dispositivi FULL e LEVEL3. Android 11 o versioni precedenti saltano le asserzioni di test di ritaglio per i dispositivi FULL.

La seguente tabella elenca le asserzioni per test_aspect_ratio_and_crop.py che corrispondono a un determinato livello del dispositivo e al primo livello API.

Livello dispositivo Primo livello API Assertions
LIMITED TUTTI Proporzioni
FOV per i formati 4:3, 16:9 e 2:1
COMPLETO < 31 Proporzioni
FOV per i formati 4:3, 16:9 e 2:1
COMPLETO ≥ 31 Ritaglia
Proporzioni
FOV per i formati 4:3, 16:9, 2:1
LEVEL3 TUTTI Ritaglia
Proporzioni
FOV per i formati 4:3, 16:9, 2:1

scene4/test_multi_camera_alignment.py

Il metodo undo_zoom() per le acquisizioni YUV in scene4/test_multi_camera_alignment.py è stato sottoposto a refactoring per tenere conto in modo più accurato del ritaglio sui sensori che non corrispondono alle proporzioni dell'acquisizione.

Codice Python 2 per Android 11

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

Codice Python 3 per Android 12

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

In Android 12, per il test di fusione dei sensori viene aggiunto un metodo per rilevare le funzionalità nelle immagini.

Nelle versioni precedenti ad Android 12, l'intera immagine viene utilizzata per trovare le 240 funzionalità migliori, che vengono poi mascherate al 20% centrale per evitare effetti rolling shutter, con un requisito minimo di 30 funzionalità.

Se le caratteristiche trovate con questo metodo non sono sufficienti, Android 12 maschera l'area di rilevamento delle caratteristiche al 20% centrale e limita il numero massimo di caratteristiche al doppio del requisito minimo.

L'immagine seguente mostra la differenza tra il rilevamento delle funzionalità di Android 11 e Android 12. L'aumento della soglia minima del requisito delle funzionalità comporta il rilevamento di funzionalità di scarsa qualità e influisce negativamente sulle misurazioni.

differenza nel rilevamento delle funzionalità tra Android 11
e Android 12
Rilevamento della funzionalità sensor_fusion

Figura 2. Differenza nel rilevamento delle funzionalità tra Android 11 e Android 12

Nuovi test

scene0/test_solid_color_test_pattern.py

Un nuovo test, test_solid_color_test_pattern, è abilitato per Android 12. Questo test è abilitato per tutte le videocamere ed è descritto nella tabella seguente.

Scena Nome test Primo livello API Descrizione
0 test_solid_color_test_pattern 31 Conferma l'output dell'immagine a tinta unita e la programmabilità del colore dell'immagine.

Per supportare la modalità privacy della videocamera, è necessario attivare i pattern di test a tinta unita. Il test test_solid_color_test_pattern conferma l'output dell'immagine YUV a tinta unita con il colore definito dal pattern selezionato e le modifiche al colore dell'immagine in base alle specifiche.

Parametri

  • cameraPrivacyModeSupport: determina se la videocamera supporta la modalità Privacy.
  • android.sensor.testPatternMode: imposta la modalità del pattern di test. Questo test utilizza SOLID_COLOR.
  • android.sensor.testPatternData: imposta i valori del pattern di test R, Gr, Gb, G per la modalità pattern di test.

Per una descrizione del pattern di test a tinta unita, vedi SENSOR_TEST_PATTERN_MODE_SOLID_COLOR.

Metodo

I frame YUV vengono acquisiti per i parametri impostati e il contenuto dell'immagine viene convalidato. Il pattern di test viene generato direttamente dal sensore di immagine, quindi non è necessaria una scena particolare. Se PER_FRAME_CONTROL è supportato, viene acquisito un singolo frame YUV per ogni impostazione testata. Se PER_FRAME_CONTROL non è supportato, vengono acquisiti quattro fotogrammi e viene analizzato solo l'ultimo per massimizzare la copertura dei test nelle videocamere LIMITED.

Le acquisizioni YUV sono impostate su pattern di test BLACK, WHITE, RED, GREEN e BLUE completamente saturi. Poiché la definizione del pattern di test è in base al pattern Bayer del sensore, i canali di colore devono essere impostati per ogni colore come mostrato nella tabella seguente.

Colore testPatternData (RGGB)
NERO (0, 0, 0, 0)
BIANCO (1, 1, 1, 1)
RED (1, 0, 0, 0)
VERDE (0, 1, 1, 0)
BLU (0, 0, 0, 1)

Tabella delle asserzioni

La tabella seguente descrive le asserzioni di test per test_solid_color_test_pattern.py.

Fotocamera
Primo livello API
Tipo di videocamera Colori dichiarati
31 Bayer NERO, BIANCO, ROSSO, VERDE, BLU
31 MONO NERO, BIANCO
< 31 Bayer/MONO NERO

Test delle classi di rendimento

scene2_c/test_camera_launch_perf_class.py

Verifica che l'avvio della fotocamera sia inferiore a 500 ms per le fotocamere principali anteriore e posteriore con la scena del volto scene2_c.

scene2_c/test_jpeg_capture_perf_class.py

Verifica che la latenza di acquisizione JPEG a 1080p sia inferiore a 1 secondo per le fotocamere anteriore e posteriore principali con la scena del volto scene2_c.