Помогают защитить Большой Барьерный Риф с TensorFlow на Kaggle Присоединяйтесь вызов

Обработка входных и выходных данных с помощью библиотеки поддержки TensorFlow Lite

Разработчики мобильных приложений обычно взаимодействуют с типизированными объектами, такими как растровые изображения, или примитивами, такими как целые числа. Однако API интерпретатора TensorFlow Lite, который запускает модель машинного обучения на устройстве, использует тензоры в форме ByteBuffer, которые могут быть трудными для отладки и управления. TensorFlow Lite Android Поддержка библиотеки предназначена для процесса помощи входных и выходных данных моделей TensorFlow Lite, и сделать TensorFlow Lite переводчик проще в использовании.

Начиная

Импортировать зависимость Gradle и другие настройки

Скопируйте .tflite файл модели в каталоге ресурсов в Android модуля , в котором будет запущена модель. Указывает , что файл не должен быть сжат, и добавить библиотеку TensorFlow Lite для модуля build.gradle файла:

android {
    // Other settings

    // Specify tflite file should not be compressed for the app apk
    aaptOptions {
        noCompress "tflite"
    }

}

dependencies {
    // Other dependencies

    // Import tflite dependencies
    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
    // The GPU delegate library is optional. Depend on it as needed.
    implementation 'org.tensorflow:tensorflow-lite-gpu:0.0.0-nightly-SNAPSHOT'
    implementation 'org.tensorflow:tensorflow-lite-support:0.0.0-nightly-SNAPSHOT'
}

Исследуйте TensorFlow Lite Поддержка Библиотека AAR , размещенное по адресу MavenCentral для различных версий библиотеки поддержки.

Базовые манипуляции с изображениями и преобразование

Библиотека поддержки TensorFlow Lite имеет набор основных методов обработки изображений, таких как кадрирование и изменение размера. Для того, чтобы использовать его, создать ImagePreprocessor и добавить необходимые операции. Для того, чтобы преобразовать изображение в формат тензорного требуется интерпретатором TensorFlow Lite создайте TensorImage для использования в качестве входных данных:

import org.tensorflow.lite.DataType;
import org.tensorflow.lite.support.image.ImageProcessor;
import org.tensorflow.lite.support.image.TensorImage;
import org.tensorflow.lite.support.image.ops.ResizeOp;

// Initialization code
// Create an ImageProcessor with all ops required. For more ops, please
// refer to the ImageProcessor Architecture section in this README.
ImageProcessor imageProcessor =
    new ImageProcessor.Builder()
        .add(new ResizeOp(224, 224, ResizeOp.ResizeMethod.BILINEAR))
        .build();

// Create a TensorImage object. This creates the tensor of the corresponding
// tensor type (uint8 in this case) that the TensorFlow Lite interpreter needs.
TensorImage tensorImage = new TensorImage(DataType.UINT8);

// Analysis code for every frame
// Preprocess the image
tensorImage.load(bitmap);
tensorImage = imageProcessor.process(tensorImage);

DataType тензора может быть считан через метаданные библиотеку exractor , а также другую информацию модели.

Базовая обработка аудиоданных

Lite Поддержка библиотеки TensorFlow также определяет TensorAudio класс оберточной некоторые основные аудиоданные методы их обработки. Это в основном используется вместе с AudioRecord и захватами аудиосэмплов в кольцевом буфере.

import android.media.AudioRecord;
import org.tensorflow.lite.support.audio.TensorAudio;

// Create an `AudioRecord` instance.
AudioRecord record = AudioRecord(...)

// Create a `TensorAudio` object from Android AudioFormat.
TensorAudio tensorAudio = new TensorAudio(record.getFormat(), size)

// Load all audio samples available in the AudioRecord without blocking.
tensorAudio.load(record)

// Get the `TensorBuffer` for inference.
TensorBuffer buffer = tensorAudio.getTensorBuffer()

Создайте выходные объекты и запустите модель

Перед запуском модели нам нужно создать объекты-контейнеры, в которых будет храниться результат:

import org.tensorflow.lite.DataType;
import org.tensorflow.lite.support.tensorbuffer.TensorBuffer;

// Create a container for the result and specify that this is a quantized model.
// Hence, the 'DataType' is defined as UINT8 (8-bit unsigned integer)
TensorBuffer probabilityBuffer =
    TensorBuffer.createFixedSize(new int[]{1, 1001}, DataType.UINT8);

Загрузка модели и выполнение вывода:

import java.nio.MappedByteBuffer;
import org.tensorflow.lite.InterpreterFactory;
import org.tensorflow.lite.InterpreterApi;

// Initialise the model
try{
    MappedByteBuffer tfliteModel
        = FileUtil.loadMappedFile(activity,
            "mobilenet_v1_1.0_224_quant.tflite");
    InterpreterApi tflite = new InterpreterFactory().create(
        tfliteModel, new InterpreterApi.Options());
} catch (IOException e){
    Log.e("tfliteSupport", "Error reading model", e);
}

// Running inference
if(null != tflite) {
    tflite.run(tImage.getBuffer(), probabilityBuffer.getBuffer());
}

Доступ к результату

Разработчики могут получить доступ к выходу непосредственно через probabilityBuffer.getFloatArray() . Если модель дает квантованный результат, не забудьте преобразовать результат. Для квантованной модели MobileNet разработчику необходимо разделить каждое выходное значение на 255, чтобы получить вероятность в диапазоне от 0 (наименее вероятно) до 1 (наиболее вероятно) для каждой категории.

Необязательно: сопоставление результатов с ярлыками

Разработчики также могут при желании сопоставить результаты с метками. Сначала скопируйте текстовый файл, содержащий метки, в каталог ресурсов модуля. Затем загрузите файл этикетки, используя следующий код:

import org.tensorflow.lite.support.common.FileUtil;

final String ASSOCIATED_AXIS_LABELS = "labels.txt";
List<String> associatedAxisLabels = null;

try {
    associatedAxisLabels = FileUtil.loadLabels(this, ASSOCIATED_AXIS_LABELS);
} catch (IOException e) {
    Log.e("tfliteSupport", "Error reading label file", e);
}

Следующий фрагмент демонстрирует, как связать вероятности с метками категорий:

import java.util.Map;
import org.tensorflow.lite.support.common.TensorProcessor;
import org.tensorflow.lite.support.common.ops.NormalizeOp;
import org.tensorflow.lite.support.label.TensorLabel;

// Post-processor which dequantize the result
TensorProcessor probabilityProcessor =
    new TensorProcessor.Builder().add(new NormalizeOp(0, 255)).build();

if (null != associatedAxisLabels) {
    // Map of labels and their corresponding probability
    TensorLabel labels = new TensorLabel(associatedAxisLabels,
        probabilityProcessor.process(probabilityBuffer));

    // Create a map to access the result based on label
    Map<String, Float> floatMap = labels.getMapWithFloatValue();
}

Текущее покрытие вариантов использования

Текущая версия библиотеки поддержки TensorFlow Lite охватывает:

  • общие типы данных (float, uint8, изображения, аудио и массив этих объектов) в качестве входных и выходных данных tflite-моделей.
  • основные операции с изображениями (кадрирование, изменение размера и поворот).
  • нормализация и квантование
  • файловые утилиты

В будущих версиях будет улучшена поддержка текстовых приложений.

Архитектура ImageProcessor

Конструкция ImageProcessor позволила операции работы с изображениями , чтобы определить фронт и оптимизированы в процессе сборки. ImageProcessor в настоящее время поддерживает три основные операции предварительной обработки, как описано в трех комментариях в фрагменте кода ниже:

import org.tensorflow.lite.support.common.ops.NormalizeOp;
import org.tensorflow.lite.support.common.ops.QuantizeOp;
import org.tensorflow.lite.support.image.ops.ResizeOp;
import org.tensorflow.lite.support.image.ops.ResizeWithCropOrPadOp;
import org.tensorflow.lite.support.image.ops.Rot90Op;

int width = bitmap.getWidth();
int height = bitmap.getHeight();

int size = height > width ? width : height;

ImageProcessor imageProcessor =
    new ImageProcessor.Builder()
        // Center crop the image to the largest square possible
        .add(new ResizeWithCropOrPadOp(size, size))
        // Resize using Bilinear or Nearest neighbour
        .add(new ResizeOp(224, 224, ResizeOp.ResizeMethod.BILINEAR));
        // Rotation counter-clockwise in 90 degree increments
        .add(new Rot90Op(rotateDegrees / 90))
        .add(new NormalizeOp(127.5, 127.5))
        .add(new QuantizeOp(128.0, 1/128.0))
        .build();

Смотрите более подробную информацию здесь о нормализации и квантования.

Конечной целью библиотеки поддержки является поддержка всех tf.image преобразований. Это означает, что преобразование будет таким же, как и в TensorFlow, и реализация не будет зависеть от операционной системы.

Разработчики также могут создавать собственные процессоры. В этих случаях важно согласовываться с процессом обучения, т. Е. Одинаковая предварительная обработка должна применяться как к обучению, так и к выводу, чтобы повысить воспроизводимость.

Квантование

При инициировании ввода или вывода объектов , таких как TensorImage или TensorBuffer вам нужно указать их типы быть DataType.UINT8 или DataType.FLOAT32 .

TensorImage tensorImage = new TensorImage(DataType.UINT8);
TensorBuffer probabilityBuffer =
    TensorBuffer.createFixedSize(new int[]{1, 1001}, DataType.UINT8);

TensorProcessor может быть использован для квантования входных тензоров или деквантование выходных тензоров. Например, при обработке квантованного выходного TensorBuffer , разработчик может использовать DequantizeOp для деквантования результата к точке вероятности плавающей между 0 и 1:

import org.tensorflow.lite.support.common.TensorProcessor;

// Post-processor which dequantize the result
TensorProcessor probabilityProcessor =
    new TensorProcessor.Builder().add(new DequantizeOp(0, 1/255.0)).build();
TensorBuffer dequantizedBuffer = probabilityProcessor.process(probabilityBuffer);

Параметры квантования тензора могут быть считаны через библиотеку exractor метаданных .