Camera ITS

O Camera Image Test Suite (ITS) é um framework para executar testes em imagens produzido por uma câmera Android. O objetivo geral de cada teste no ITS é configurar a câmera de maneira específica, capturar uma ou mais fotos e examinar se elas contêm os dados de imagem esperados. Muitas das Os testes exigem que a câmera esteja apontada para um gráfico de destino específico ou com uma intensidade específica.

O ITS está localizado no conjunto de teste do Verificador do CTS em cts/apps/CameraITS. Os dispositivos precisam passar nos testes ITS correspondentes aos recursos com suporte anunciados pelo framework da câmera para apps de terceiros como um subconjunto do CTS.

Configurar

Para executar testes ITS, é preciso configurar o seguinte:

  • Um dispositivo em teste (DUT, na sigla em inglês)
  • Uma máquina host (por exemplo, um computador desktop ou laptop Linux)
  • Uma cena fotografada pela câmera

Configuração do dispositivo em teste (DUT, na sigla em inglês)

Para configurar um DUT, siga estas etapas:

  1. Conecte o DUT a uma máquina host por USB.
  2. Conceda permissões ao host para acessar o DUT pelo adb.
  3. Instale o app CTS Verifier (CtsVerifier.apk) no dispositivo. Para mais informações, consulte Como usar o Verificador do CTS.

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

Configuração do host

O ITS exige que a máquina host esteja conectada ao DUT por USB, usar o adb para controle e comunicação de dispositivos e ter as permissões e o software instalado.

Para configurar a máquina host, verifique se o software abaixo está instalado.

Android SDK Platform Tools

As ferramentas de plataforma do SDK Android precisam estar instaladas, e o ADB precisa estar no caminho executável do shell ou terminal em execução na máquina host. Para conferir a versão lançada publicamente das ferramentas da plataforma do SDK do Android, consulte Notas da versão das ferramentas da plataforma do SDK.

Python

O Python precisa estar instalado na máquina host. Recomendamos usar uma distribuição do Python para garantir o suporte a versões compatíveis. Para detalhes sobre quais versões de Python e de pacote instalar para uma versão específica, consulte a Notas da versão do Camera ITS para a versão correspondente.

Mobly

Para o Android 12 e versões mais recentes, o framework de teste do Mobly precisam ser instalados. O Mobly permite configurar um DUT e um tablet de gráfico na classe its_base_test. Para instalar o framework de teste do Mobly, execute:

pip install mobly

Configuração do ambiente

Para configurar o ambiente de teste, execute:

cd CameraITS
source build/envsetup.sh

Esse comando verifica a instalação do Python, configura a variável de ambiente PYTHONPATH e executa testes de unidade nos módulos utils/*.py. Em caso negativo erros são impressos no terminal, o ambiente está pronto para executar o ITS provas.

Configuração do cenário

Para configurar as cenas, recomendamos usar a configuração Camera ITS-in-a-box para facilitar a automação, a confiabilidade e a eficiência nos testes. O ITS-in-a-Box os equipamentos de teste atendem a todos os requisitos de iluminação, centralização e mudança de gráficos para o ITS. Além disso, o ITS-in-a-box é necessário para extensões de câmera testes.

Para testes manuais, verifique o seguinte:

  • O DUT está em um tripé
  • O DUT é apontado para a cena correta para cada teste. O script de teste do ITS oferece instruções para mudar a configuração do cenário antes de iniciar os testes em um novo cenário.
  • O DUT está conectado à máquina host por USB.
  • O DUT não se move durante a execução do teste.
  • A cena é iluminada com uma fonte de luz estável e sem oscilações. Não use uma luz fluorescente, porque ela causa cintilação.

O script de teste do ITS mostra um aviso pedindo ao usuário para mudar a configuração da cena antes de iniciar os testes em uma nova cena.

A orientação do smartphone precisa ser definida para que a câmera tire fotos sem rotação. A maneira mais fácil de verificar isso é com as cenas de rosto em scene2. A maioria dos smartphones usa o modo paisagem telefone girado em sentido anti-horário para a câmera traseira e girado no sentido horário por a câmera frontal.

Arquivos de configuração

Com o framework do Mobly, você precisa criar um arquivo de configuração config.yml para definem o testbed do Mobly. Confira a seguir exemplos de diferentes casos de uso.

Arquivo config.yml de cenas baseadas em tablet

Confira a seguir um exemplo de arquivo config.yml para cenas baseadas em tablet. Para em tablets, a palavra-chave TABLET precisa estar no nome do testbed. Durante a inicialização, o executor de teste do Mobly inicializa os parâmetros no arquivo e os transmite para os testes individuais.

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

Para invocar o ambiente de teste, execute tools/run_all_tests.py. Se não houver comandos valores de linha especificando câmeras ou cenas, o teste vai ser executado com o método config.yml valores de arquivo. Se houver valores de linha de comando para câmeras ou cenas, eles substituirão os valores na seção TestParams do arquivo config.yml. Exemplo:

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

Arquivo sensor_fusion scene config.yml

Confira a seguir um exemplo de arquivo config_yml para testes sensor_fusion. Para testes sensor_fusion, a palavra-chave SENSOR_FUSION precisa estar no nome do teste. O Android 13 e versões mais recentes oferecem suporte apenas ao Arduino para fusão de sensores devido aos testes de visualização e estabilização de vídeo. O Android 12 oferece suporte a controladores Arduino e Canakit.

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

Para executar testes sensor_fusion com o caixa de fusão do sensor, execute:

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

Arquivo config.yml de vários ambientes de teste

Confira a seguir um exemplo de arquivo config.yml com vários ambientes de teste, um ambiente de teste de tablet e um ambiente de teste sensor_fusion. O ambiente de teste correto é determinado pelas cenas testadas.

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

Arquivo config.yml de teste manual

Confira a seguir um exemplo de arquivo config.yml para testes manuais. De Android 14, manual tem suporte para todos os testes, exceto para scene_extensions provas. Para testes manuais, a palavra-chave MANUAL precisa estar no nome do testbed. Além disso, a seção AndroidDevice não pode incluir uma seção de série ou rótulo para um tablet.

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

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

Como executar testes de ITS

Esta seção descreve como executar testes de ITS.

Como invocar testes

Depois que o dispositivo, a máquina host (incluindo o ambiente) e a cena física estiverem configurados, execute os testes ITS usando o processo a seguir.

  1. Abra o app CTS Verifer. No menu de testes, selecione Teste ITS da câmera.

  2. Na máquina host, execute os testes ITS do diretório CameraITS/. Por exemplo, para um dispositivo com câmeras frontal e traseira, execute o seguinte comando:

    python tools/run_all_tests.py

    O script itera pelas câmeras e cenas de teste com base na config.yml. Para configurações de depuração, recomendamos executar uma das cenas scene2 com um único teste para uma resposta mais rápida.

    Para testes manuais, antes de começar a executar o conjunto de testes ITS em cada cena, o script tira uma foto da cena atual, salva como JPEG, imprime o caminho para o JPEG para o console e pede que o usuário confirme se a imagem está bem. Esse fluxo de captura e confirmação se repete até que o usuário confirma que a imagem está correta. Veja a seguir as mensagens nesse fluxo.

    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)
    

    Cada execução do script imprime um registro mostrando PASS, FAIL FAIL* ou SKIP para cada teste ITS. FAIL* indica que o teste falhou, mas como ele ainda não é obrigatório, o teste será informado como PASS para o CtsVerifier. SKIP indica que o teste foi aprovado porque o dispositivo não anunciou o recurso que está sendo testado. Por exemplo, se um dispositivo não anunciar pelas interfaces de câmera que oferece suporte a DNG, os testes relacionados à captura de arquivos DNG serão ignorados e contados como PASS.

  3. Para confirmar que os testes atenderam aos requisitos, toque no botão de marca de seleção verde. A entrada Teste ITS da câmera no menu de testes do verificador do CTS fica verde e indica que o smartphone passou no teste ITS da câmera.

Teste de DUT paralelo

Dispositivos com o Android 14 ou versões mais recentes oferecem suporte a testes DUT paralelos. Isso permite testar DUTs em paralelo com várias plataformas para acelerar o teste geral. Por exemplo, o teste paralelo permite testar a câmera 0 em uma e a câmera 1 em outro ao mesmo tempo. Todos os testes para sessões de teste paralelas são agregados na sessão do Verificador do CTS no DUT de referência. Faça testes paralelos com o controle de iluminação do Arduino, já que a iluminação manual não é compatível com testes paralelos. Certifique-se de que um endereço canal no mesmo controle do Arduino controla a iluminação de cada equipamento.

Confira a seguir um exemplo de arquivo config.yml que define três testbeds para execução. em paralelo.

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"

Para executar os testbeds em paralelo, use o seguinte comando:

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

Modelo de ruído DNG

Os dispositivos que anunciam a capacidade de capturar RAW ou DNG precisam gerar ruído nos metadados do resultado de cada imagem bruta. Esse modelo de ruído precisa ser incorporado à HAL da câmera para cada câmera (por exemplo, câmeras frontal e traseira) no dispositivo que declara suporte.

Implementação do modelo de ruído

Para implementar um modelo de ruído, siga estas etapas para gerar um modelo de ruído e incorporar o modelo ao HAL da câmera.

  1. Para gerar um modelo de ruído para cada câmera, execute o script dng_noise_model.py no diretório tools. Isso gera um snippet de código C. Para mais informações sobre como configurar a câmera e o ambiente de captura, consulte o documento DngNoiseModel.pdf no diretório tools.

  2. Para implementar o modelo de ruído no dispositivo, recorte e cole o código C na HAL da câmera.

Validação do modelo de ruído

O tests/scene1_1/test_dng_noise_model.py um teste ITS automatizado valida o modelo de ruído verificando se os valores de ruído para a exposição da imagem e o ganho fornecido nos dados da câmera está correto.