7.6. Anatomia do predict¶
Model.predict(inputs, *, callback=None) é onde o objeto do modelo carregado realiza efetivamente o trabalho. Entre a entrada das entradas e a saída do resultado, três fases são executadas em sequência: pré-processamento, despacho de motor, pós-processamento. Dois dos três aceitam parâmetros que o script controla diretamente; o motor no meio é determinado pela câmara.
As três fases de predict(). O pré-processamento e o pós-processamento aceitam parâmetros que o script controla; o motor no meio é fixo para a câmara.¶
7.6.1. Pré-processamento¶
A fase de pré-processamento transforma cada entrada no tensor denso que a rede espera. A entrada mais comum é uma image.Image, capturada em RGB565. A fase recorta-a e redimensiona-a para a input_shape da rede, converte de RGB565 para o formato de canal para o qual a rede foi treinada (RGB888 para a maioria das redes de visão), aplica escala e deslocamento por canal e – quando a rede espera entrada inteira – quantiza para o input_dtype do modelo na mesma passagem. As redes treinadas para entrada em ponto flutuante saltam o passo de quantização e recebem diretamente o resultado da escala e deslocamento.
A ml.preprocessing.Normalization predefinida lê o dtype de entrada do modelo e executa automaticamente a transformação correta. Uma Normalization ajustada manualmente substitui os valores de escala, média e desvio padrão para modelos treinados com estatísticas de canal personalizadas (as médias e desvios padrão derivados do ImageNet são um caso comum). Um callable simples substitui a fase inteiramente – útil quando a entrada não é de todo uma imagem ou quando a aplicação já produziu o tensor denso por si própria.
7.6.2. Despacho de motor¶
A fase de motor executa a rede. O motor para o qual despacha é fixo pela câmara: o H7 e o RT1062 executam TFLM (o interpretador TensorFlow Lite para Microcontroladores, despachando kernels CMSIS-NN otimizados para ARM onde existem); o AE3 executa o mesmo interpretador TFLM com o seu fallback Cortex-M55 e a NPU Ethos-U a tratar de qualquer operador que o compilador Vela offline marcou para o acelerador; o N6 executa STAI, o runtime da ST para a NPU específica do N6.
O script não escolhe o motor. O motor que acompanha a câmara executa todos os modelos que a câmara carrega.
7.6.3. Pós-processamento¶
A fase de pós-processamento transforma os tensores de saída brutos da rede num resultado utilizável. O comportamento predefinido é desquantizar cada tensor de saída para ponto flutuante (ou passá-lo sem alterações para redes com saídas em ponto flutuante) e devolvê-los como uma lista de objetos ndarray. A maioria das aplicações regista um pós-processador – um callable que conhece o layout de saída da rede – para descodificar os tensores na forma de resultado em que a aplicação atua: uma lista de caixas delimitadoras, uma lista de pontos-chave, uma lista de classes.
O script controla esta fase de duas formas. A palavra-chave postprocess= no construtor regista um pós-processador que é executado em cada chamada. A palavra-chave callback= em predict() substitui o pós-processador registado apenas para uma chamada – útil para alternar entre vários descodificadores sem recarregar o modelo. Qualquer das formas recebe (model, inputs, outputs) e devolve o que a aplicação espera.
7.6.4. O que o script controla¶
O pré-processamento e o pós-processamento são os dois controlos do script. O pré-processador predefinido trata da maioria dos modelos de visão; o pós-processador adequado para uma determinada família de redes é escolhido do catálogo em ml.postprocessing. O motor no meio é determinado pela compilação e é executado da mesma forma independentemente do que o script solicita.