Classe de driver para conduzir a inferência de modelo com o TensorFlow Lite.
Observação: se você não precisar de acesso a nenhum dos recursos "experimentais" da API abaixo, prefira usar InterpreterApi e InterpreterFactory em vez de usar o Interpreter diretamente.
Um Interpreter
encapsula um modelo pré-treinado do TensorFlow Lite, no qual as operações são executadas para inferência de modelo.
Por exemplo, se um modelo recebe apenas uma entrada e retorna apenas uma saída:
try (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) {
interpreter.run(input, output);
}
Se um modelo recebe várias entradas ou saídas:
Object[] inputs = {input0, input1, ...};
Map<Integer, Object> map_of_indices_to_outputs = new HashMap<>();
FloatBuffer ith_output = FloatBuffer.allocateDirect(3 * 2 * 4); // Float tensor, shape 3x2x4.
ith_output.order(ByteOrder.nativeOrder());
map_of_indices_to_outputs.put(i, ith_output);
try (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) {
interpreter.runForMultipleInputsOutputs(inputs, map_of_indices_to_outputs);
}
Se um modelo usa ou produz tensores de string:
String[] input = {"foo", "bar"}; // Input tensor shape is [2].
String[] output = new String[3][2]; // Output tensor shape is [3, 2].
try (Interpreter interpreter = new Interpreter(file_of_a_tensorflowlite_model)) {
interpreter.runForMultipleInputsOutputs(input, output);
}
As ordens de entradas e saídas são determinadas ao converter o modelo TensorFlow para o modelo TensorFlowLite com Toco, assim como as formas padrão das entradas.
Quando as entradas são fornecidas como matrizes (multidimensionais), os tensores de entrada correspondentes serão redimensionados implicitamente de acordo com a forma dessa matriz. Quando as entradas são fornecidas como tipos de Buffer
, nenhum redimensionamento implícito é feito; o chamador deve garantir que o tamanho do byte do Buffer
corresponda ao do tensor correspondente ou que primeiro redimensione o tensor via resizeInput(int, int[])
. As informações de forma e tipo de tensor podem ser obtidas por meio da classe Tensor
, disponível via getInputTensor(int)
e getOutputTensor(int)
.
AVISO: as instâncias do Interpreter
não são seguras para threads. Um Interpreter
possui recursos que devem ser liberados explicitamente invocando close()
A biblioteca TFLite foi criada com base na API 19 do NDK. Ela pode funcionar para níveis de API do Android abaixo de 19, mas não é garantido.
Classes aninhadas
classe | Intérprete.Opções | Uma classe de opções para controlar o comportamento do interpretador de tempo de execução. |
Construtores públicos
Interpreter ( Opções de arquivo modelFile, Interpreter.Options ) Inicializa um Interpreter e especifica opções para personalizar o comportamento do intérprete. | |
Interpretador ( ByteBuffer byteBuffer) Inicializa um Interpreter com um ByteBuffer de um arquivo de modelo. | |
Interpreter ( ByteBuffer byteBuffer, opções Interpreter.Options ) Inicializa um Interpreter com um ByteBuffer de um arquivo de modelo e um conjunto de Interpreter.Options personalizado. |
Métodos públicos
vazio | alocar Tensores () Atualiza explicitamente as alocações para todos os tensores, se necessário. |
vazio | fechar () Liberar recursos associados à instância InterpreterApi . |
int | |
Tensor | getInputTensor (int inputIndex) Obtém o tensor associado ao índice de entrada fornecido. |
int | getInputTensorCount () Obtém o número de tensores de entrada. |
Tensor | getInputTensorFromSignature ( String inputName, String signatureKey) Obtém o tensor associado ao nome de entrada fornecido e ao nome do método de assinatura. |
Grandes | getLastNativeInferenceDurationNanoseconds () Retorna o tempo de inferência nativa. |
int | |
Tensor | getOutputTensor (int outputIndex) Obtém o tensor associado ao índice de saída fornecido. |
int | getOutputTensorCount () Obtém o número de tensores de saída. |
Tensor | getOutputTensorFromSignature ( String outputName, String signatureKey) Obtém o Tensor associado ao nome de saída fornecido no método de assinatura específico. |
Corda[] | getSignatureInputs ( String signatureKey) Obtém a lista de entradas SignatureDefs para o método signatureKey . |
Corda[] | getSignatureKeys () Obtém a lista de nomes de métodos exportados SignatureDef disponíveis no modelo. |
Corda[] | getSignatureOutputs ( String signatureKey) Obtém a lista de saídas SignatureDefs para o método signatureKey . |
vazio | resetVariableTensores () Avançado: redefine todos os tensores de variáveis para o valor padrão. |
vazio | resizeInput (int idx, int[] dims, boolean strict) Redimensiona a entrada idx-th do modelo nativo para os dims fornecidos. |
vazio | resizeInput (int idx, int[] dims) Redimensiona a entrada idx-th do modelo nativo para os dims fornecidos. |
vazio | |
vazio | runForMultipleInputsOutputs ( entradas Object[] , Map < Integer , Object > saídas) Executa a inferência do modelo se o modelo receber várias entradas ou retornar várias saídas. |
vazio | runSignature ( Map < String , Object > inputs, Map < String , Object > outputs) O mesmo que runSignature(Map, Map, String) mas não requer passar uma signatureKey, supondo que o modelo tenha um SignatureDef. |
vazio | |
vazio | setCancelled (boolean cancelado) Avançado: interrompe a inferência no meio de uma chamada para run(Object, Object) . |
Métodos Herdados
Construtores públicos
intérprete público ( File modelFile)
Inicializa um Interpreter
.
Parâmetros
modelFile | a Arquivo de um modelo TF Lite pré-treinado. |
---|
Lança
Exceção de argumento ilegal | se modelFile não codificar um modelo válido do TensorFlow Lite. |
---|
public Interpreter ( Opções de arquivo modelFile, Interpreter.Options )
Inicializa um Interpreter
e especifica opções para personalizar o comportamento do intérprete.
Parâmetros
modelFile | um arquivo de um modelo TF Lite pré-treinado |
---|---|
opções | um conjunto de opções para personalizar o comportamento do intérprete |
Lança
Exceção de argumento ilegal | se modelFile não codificar um modelo válido do TensorFlow Lite. |
---|
intérprete público ( ByteBuffer byteBuffer)
Inicializa um Interpreter
com um ByteBuffer
de um arquivo de modelo.
O ByteBuffer não deve ser modificado após a construção de um Interpreter
. O ByteBuffer
pode ser um MappedByteBuffer
que mapeia um arquivo de modelo na memória ou um ByteBuffer
direto de nativeOrder() que contém o conteúdo de bytes de um modelo.
Parâmetros
byteBuffer |
---|
Lança
Exceção de argumento ilegal | se byteBuffer não for um MappedByteBuffer nem um ByteBuffer direto de nativeOrder. |
---|
Intérprete público ( ByteBuffer byteBuffer, opções Interpreter.Options )
Inicializa um Interpreter
com um ByteBuffer
de um arquivo de modelo e um conjunto de Interpreter.Options
personalizado.
O ByteBuffer
não deve ser modificado após a construção de um Interpreter
. O ByteBuffer
pode ser um MappedByteBuffer
que mapeia um arquivo de modelo na memória ou um ByteBuffer
direto de nativeOrder() que contém o conteúdo de bytes de um modelo.
Parâmetros
byteBuffer | |
---|---|
opções |
Lança
Exceção de argumento ilegal | se byteBuffer não for um MappedByteBuffer nem um ByteBuffer direto de nativeOrder. |
---|
Métodos públicos
public void alocar Tensores ()
Atualiza explicitamente as alocações para todos os tensores, se necessário.
Isso propagará formas e alocações de memória para tensores dependentes usando a(s) forma(s) do tensor de entrada conforme fornecido.
Nota: Esta chamada é *puramente opcional*. A alocação de tensor ocorrerá automaticamente durante a execução se algum tensor de entrada tiver sido redimensionado. Essa chamada é mais útil para determinar as formas de qualquer tensor de saída antes de executar o gráfico, por exemplo,
interpreter.resizeInput(0, new int[]{1, 4, 4, 3}));
interpreter.allocateTensors();
FloatBuffer input = FloatBuffer.allocate(interpreter.getInputTensor(0).numElements());
// Populate inputs...
FloatBuffer output = FloatBuffer.allocate(interpreter.getOutputTensor(0).numElements());
interpreter.run(input, output)
// Process outputs...
Nota: Alguns gráficos têm saídas com formato dinâmico, caso em que a forma de saída pode não se propagar totalmente até que a inferência seja executada.
vazio público fechar ()
Liberar recursos associados à instância InterpreterApi
.
public int getInputIndex ( String opName)
Obtém o índice de uma entrada dado o nome operacional da entrada.
Parâmetros
opName |
---|
public Tensor getInputTensor (int inputIndex)
Obtém o tensor associado ao índice de entrada fornecido.
Parâmetros
índice de entrada |
---|
public int getInputTensorCount ()
Obtém o número de tensores de entrada.
public Tensor getInputTensorFromSignature ( String inputName, String signatureKey)
Obtém o tensor associado ao nome de entrada fornecido e ao nome do método de assinatura.
AVISO: Esta é uma API experimental e está sujeita a alterações.
Parâmetros
inputName | Insira o nome na assinatura. |
---|---|
chave de assinatura | A chave de assinatura que identifica o SignatureDef, pode ser nula se o modelo tiver uma assinatura. |
Lança
Exceção de argumento ilegal | se inputName ou signatureKey for nulo ou vazio, ou se for fornecido um nome inválido. |
---|
public int getOutputIndex ( String opName)
Obtém o índice de uma saída dado o nome operacional da saída.
Parâmetros
opName |
---|
public Tensor getOutputTensor (int outputIndex)
Obtém o tensor associado ao índice de saída fornecido.
Nota: Os detalhes do tensor de saída (por exemplo, forma) podem não ser totalmente preenchidos até que a inferência seja executada. Se você precisar de detalhes atualizados *antes* de executar a inferência (por exemplo, após redimensionar um tensor de entrada, o que pode invalidar as formas do tensor de saída), use allocateTensors()
para acionar explicitamente a alocação e a propagação da forma. Observe que, para gráficos com formas de saída dependentes de *valores* de entrada, a forma de saída pode não ser totalmente determinada até a execução da inferência.
Parâmetros
índice de saída |
---|
public int getOutputTensorCount ()
Obtém o número de tensores de saída.
public Tensor getOutputTensorFromSignature ( String outputName, String signatureKey)
Obtém o Tensor associado ao nome de saída fornecido no método de assinatura específico.
Nota: Os detalhes do tensor de saída (por exemplo, forma) podem não ser totalmente preenchidos até que a inferência seja executada. Se você precisar de detalhes atualizados *antes* de executar a inferência (por exemplo, após redimensionar um tensor de entrada, o que pode invalidar as formas do tensor de saída), use allocateTensors()
para acionar explicitamente a alocação e a propagação da forma. Observe que, para gráficos com formas de saída dependentes de *valores* de entrada, a forma de saída pode não ser totalmente determinada até a execução da inferência.
AVISO: Esta é uma API experimental e está sujeita a alterações.
Parâmetros
outputName | Nome de saída na assinatura. |
---|---|
chave de assinatura | A chave de assinatura que identifica o SignatureDef, pode ser nula se o modelo tiver uma assinatura. |
Lança
Exceção de argumento ilegal | se outputName ou signatureKey for nulo ou vazio, ou for fornecido um nome inválido. |
---|
public String[] getSignatureInputs ( String signatureKey)
Obtém a lista de entradas SignatureDefs para o método signatureKey
.
AVISO: Esta é uma API experimental e está sujeita a alterações.
Parâmetros
chave de assinatura |
---|
public String[] getSignatureKeys ()
Obtém a lista de nomes de métodos exportados SignatureDef disponíveis no modelo.
AVISO: Esta é uma API experimental e está sujeita a alterações.
public String[] getSignatureOutputs ( String signatureKey)
Obtém a lista de saídas SignatureDefs para o método signatureKey
.
AVISO: Esta é uma API experimental e está sujeita a alterações.
Parâmetros
chave de assinatura |
---|
public void resetVariableTensors ()
Avançado: redefine todos os tensores de variáveis para o valor padrão.
Se um tensor variável não tiver um buffer associado, ele será zerado.
AVISO: Esta é uma API experimental e está sujeita a alterações.
public void resizeInput (int idx, int[] dims, boolean strict)
Redimensiona a entrada idx-th do modelo nativo para os dims fornecidos.
Quando `strict` for True, somente dimensões desconhecidas podem ser redimensionadas. Dimensões desconhecidas são indicadas como `-1` no array retornado por `Tensor.shapeSignature()`.
Parâmetros
idx | |
---|---|
escurece | |
rigoroso |
public void resizeInput (int idx, int[] dims)
Redimensiona a entrada idx-th do modelo nativo para os dims fornecidos.
Parâmetros
idx | |
---|---|
escurece |
public void run (entrada de objeto , saída de objeto )
Executa a inferência do modelo se o modelo receber apenas uma entrada e fornecer apenas uma saída.
Aviso: A API é mais eficiente se um Buffer
(de preferência direto, mas não obrigatório) for usado como tipo de dados de entrada/saída. Considere usar o Buffer
para alimentar e buscar dados primitivos para um melhor desempenho. Os seguintes tipos de Buffer
de concreto são suportados:
-
ByteBuffer
- compatível com qualquer tipo de tensor primitivo subjacente. -
FloatBuffer
- compatível com tensores flutuantes. -
IntBuffer
- compatível com tensores int32. -
LongBuffer
- compatível com tensores int64.
Buffer
s ou como entradas escalares. Parâmetros
entrada | um array ou array multidimensional, ou um Buffer de tipos primitivos incluindo int, float, long e byte. Buffer é a maneira preferida de passar dados de entrada grandes para tipos primitivos, enquanto os tipos de string requerem o uso do caminho de entrada de array (multidimensional). Quando um Buffer é usado, seu conteúdo deve permanecer inalterado até que a inferência do modelo seja feita, e o chamador deve garantir que o Buffer esteja na posição de leitura apropriada. Um valor null é permitido somente se o chamador estiver usando um Delegate que permite a interoperabilidade do identificador de buffer e esse buffer tiver sido associado ao Tensor de entrada. |
---|---|
resultado | um array multidimensional de dados de saída, ou um Buffer de tipos primitivos incluindo int, float, long e byte. Quando um Buffer é usado, o chamador deve garantir que ele esteja configurado na posição de gravação apropriada. Um valor nulo é permitido e é útil para certos casos, por exemplo, se o chamador estiver usando um Delegate que permite a interoperabilidade de manipulação de buffer, e esse buffer foi vinculado ao Tensor de saída (consulte também Interpreter.Options#setAllowBufferHandleOutput(boolean) ), ou se o gráfico tiver saídas de forma dinâmica e o chamador precisar consultar a forma do Tensor de saída após a inferência ser invocada, buscando os dados diretamente do tensor de saída (via Tensor.asReadOnlyBuffer() ). |
public void runForMultipleInputsOutputs ( entradas Object[] , Map < Integer , Object > saídas)
Executa a inferência do modelo se o modelo receber várias entradas ou retornar várias saídas.
Aviso: A API é mais eficiente se Buffer
s (de preferência direto, mas não obrigatório) for usado como os tipos de dados de entrada/saída. Considere usar o Buffer
para alimentar e buscar dados primitivos para um melhor desempenho. Os seguintes tipos de Buffer
de concreto são suportados:
-
ByteBuffer
- compatível com qualquer tipo de tensor primitivo subjacente. -
FloatBuffer
- compatível com tensores flutuantes. -
IntBuffer
- compatível com tensores int32. -
LongBuffer
- compatível com tensores int64.
Buffer
s ou como entradas escalares. Nota: valores null
para elementos individuais de inputs
e outputs
são permitidos somente se o chamador estiver usando um Delegate
que permite a interoperabilidade de manipulação de buffer e esse buffer foi vinculado ao(s) Tensor
(es) de entrada ou saída correspondente.
Parâmetros
entradas | uma matriz de dados de entrada. As entradas devem estar na mesma ordem que as entradas do modelo. Cada entrada pode ser um array ou array multidimensional, ou um Buffer de tipos primitivos incluindo int, float, long e byte. O Buffer é a maneira preferida de passar dados de entrada grandes, enquanto os tipos de string exigem o uso do caminho de entrada do array (multidimensional). Quando o Buffer é usado, seu conteúdo deve permanecer inalterado até que a inferência do modelo seja feita, e o chamador deve garantir que o Buffer esteja na posição de leitura apropriada. |
---|---|
saídas | um mapa mapeando índices de saída para matrizes multidimensionais de dados de saída ou Buffer s de tipos primitivos, incluindo int, float, long e byte. Ele só precisa manter as entradas para as saídas a serem usadas. Quando um Buffer é usado, o chamador deve garantir que ele esteja configurado na posição de gravação apropriada. O mapa pode estar vazio para casos em que os identificadores de buffer são usados para dados do tensor de saída ou casos em que as saídas são moldadas dinamicamente e o chamador deve consultar a forma do Tensor de saída após a inferência ter sido invocada, buscando os dados diretamente do tensor de saída ( via Tensor.asReadOnlyBuffer() ). |
public void runSignature ( Map < String , Object > inputs, Map < String , Object > outputs)
O mesmo que runSignature(Map, Map, String)
mas não requer passar uma signatureKey, supondo que o modelo tenha um SignatureDef. Se o modelo tiver mais de um SignatureDef, ele lançará uma exceção.
AVISO: Esta é uma API experimental e está sujeita a alterações.
Parâmetros
entradas | |
---|---|
saídas |
public void runSignature ( Map < String , Object > inputs, Map < String , Object > outputs, String signatureKey)
Executa a inferência de modelo com base no SignatureDef fornecido por meio de signatureKey
.
Consulte run(Object, Object)
para obter mais detalhes sobre os tipos de dados de entrada e saída permitidos.
AVISO: Esta é uma API experimental e está sujeita a alterações.
Parâmetros
entradas | Um mapa do nome de entrada no SignatureDef para um objeto de entrada. |
---|---|
saídas | Um mapa do nome de saída em SignatureDef para dados de saída. Isso pode estar vazio se o chamador desejar consultar os dados do Tensor diretamente após a inferência (por exemplo, se a forma de saída for dinâmica ou se forem usados manipuladores de buffer de saída). |
chave de assinatura | Chave de assinatura que identifica o SignatureDef. |
Lança
Exceção de argumento ilegal | se inputs for nulo ou vazio, se outputs ou signatureKey for nulo ou se ocorrer um erro ao executar a inferência. |
---|
public void setCancelled (boolean cancelado)
Avançado: interrompe a inferência no meio de uma chamada para run(Object, Object)
.
Um sinalizador de cancelamento será definido como verdadeiro quando esta função for chamada. O interpretador verificará o sinalizador entre as invocações de Op e, se for true
, o interpretador interromperá a execução. O interpretador permanecerá um estado cancelado até explicitamente "uncancelled" por setCancelled(false)
.
AVISO: Esta é uma API experimental e está sujeita a alterações.
Parâmetros
cancelado | true para cancelar a inferência no melhor esforço; false para retomar. |
---|
Lança
IllegalStateException | se o interpretador não for inicializado com a opção cancelável, que por padrão está desativada. |
---|