Путешествие ИИ: Море цветов

искусственный интеллект
Путешествие ИИ: Море цветов

Обзор

Как сказано в статье «AI Journey: Departure», «Машинное обучение, как основное средство реализации ИИ, включает в себя множество знаний и областей, а платформа TensorFlow, предоставляемая Google, позволяет обычным людям создавать или обучать машинное обучение. Обычные люди, вы не можете придумать революционные теории машинного обучения или даже понять много математики, но с платформой TensorFlow, с некоторыми обученными моделями, вы можете создать то, что хотите, помочь себе или помочь другим проблема- решения моделей».TensorFlowПлатформа предоставляет конкретные реализации многих теорий.Они похожи на хорошо функционирующие черные ящики.Вам не нужно знать, насколько сложны теоретические принципы и математические формулы, лежащие в их основе, и вам не нужно заботиться о конкретных деталях реализации. Вам просто нужно знать, что вы можете сделать для вас

TensorFlow Lite

TensorFlow не только обеспечивает реализации на стороне компьютера, но также предоставляет реализации практически для всех платформ, таких как мобильные устройства, Интернет, IoT и облачные технологии. Из-за ограниченной вычислительной мощности и места для хранения мобильных терминалов, встроенных устройств и устройств IoT требования к реализации выше.TensorFlow предоставляет облегченную версию, специально оптимизированную для этих платформ, которая называется TensorFlow Lite.С ее помощью эти устройства могут вывод обучения с малой задержкой и небольшой площадью может быть реализован локально (на устройстве). Вы можете спросить, я могу напрямую реализовать вывод модели на фоновом сервере (облаке), чтобы мне не приходилось учитывать ограничения производительности оборудования.На самом деле это так, но это также внесет некоторые проблемы, такие как сетевая передача.Влияние скорости, промежуток времени с момента отправки сетевого запроса логического вывода до получения результата запроса может быть очень долгим, вы не можете гарантировать низкую задержку, и как только данные покидают устройство, вы не можете гарантировать конфиденциальность и безопасность, вы не можете гарантировать, что устройство всегда может быть подключено к Интернету, а сетевые запросы являются особенно энергоемким поведением, поэтому вам нужно тщательно взвесить при выборе решение
TensorFlow Lite состоит из двух основных компонентов: интерпретатора, который может запускать специально оптимизированные модели на различных типах оборудования (мобильные телефоны, встроенные устройства Linux, микроконтроллеры и т. д.). Одним из них является преобразователь, который преобразует модель TensorFlow в эффективную форму для использования интерпретатором для оптимизации занимаемой площади и повышения производительности.
В настоящее время TensorFlow Lite предоставляет 5 предварительно обученных моделей:

  • Классификация изображений: может определять категории объектов на изображениях, включая людей, животных, растения, места и т. д.
  • Обнаружение объектов: может определить тип и расположение нескольких объектов на изображении.
  • Умный ответ: он может автоматически генерировать предложения для ответа на основе содержимого чата.Созданные предложения являются контекстно-зависимыми и доступны в одно касание, что может помочь пользователям быстро отвечать на входящие сообщения.
  • Оценка позы: позу человека на изображении или видео можно оценить, оценив положение ключевых суставов тела.
  • Семантическая сегментация изображения: каждому пикселю изображения можно присвоить семантические метки (например, человек, собака, кошка).

Вы можете использовать эти 5 моделей напрямую или переобучить их в новые модели с помощью трансферного обучения, но если вы хотите использовать другие обученные модели TensorFlow, вам может потребоваться сначала преобразовать их в формат TensorFlow Lite.Используйте его в TensorFlow Lite.
Из-за ограничений прогресса и уровня разработки TensorFlow Lite в настоящее время поддерживает только ограниченное подмножество операций TensorFlow (операции, сокращенно операции).Если вы обнаружите, что некоторые операции не поддерживаются, вы можете добавить отсутствующие операции TensorFlow через некоторые конфигурации.

Программная и аппаратная поддержка

Вычислительная нагрузка TensorFlow, как правило, очень велика, а вычислительная мощность традиционных процессоров и традиционных алгоритмов трудно удовлетворить спрос, поэтому нам необходимо специально оптимизированное аппаратное и программное обеспечение для алгоритмов ИИ.
На аппаратном уровне вычислительная мощность графического процессора, особенно возможности операций с матрицами с плавающей запятой, выше, чем у ЦП, поэтому эта часть работы может быть передана графическому процессору для ускорения скорости вывода и повышения эффективности. доказали, что это улучшение скорости очень примечательно, модель классификации изображений MobileNet v1 на телефоне Pixel 3 работает как минимум в 5,5 раз быстрее с включенным ускорением графического процессора, потребляет меньше энергии и выделяет меньше тепла, чем процессор. Конечно, помимо графического процессора, для решения этих задач может также подходить аппаратное обеспечение, такое как NPU (блок обработки нейронных сетей), TPU (блок тензорной обработки), DSP (процессор цифровых сигналов) и другое оборудование.
На уровне программного обеспечения алгоритмы, связанные с ИИ, более распространены.Чтобы поддерживать алгоритмы ИИ на нижнем уровне, Google добавил NNAPI (API нейронных сетей Android), начиная с Android 8.1 (уровень API 27), ресурсоемкий API для машин. API-интерфейсы языка C, специально разработанные для операций с типами, разработчики обычно используют эти API-интерфейсы косвенно через фреймворки машинного обучения, а фреймворк будет использовать NNAPI для выполнения операций вывода с аппаратным ускорением на поддерживаемых устройствах.

преобразователь

Конвертеры — это не только инструменты для преобразования моделей TensorFlow в формат TensorFlow Lite (FlatBuffer), но и наиболее распространенные инструменты для оптимизации моделей. FlatBuffer — это эффективная кроссплатформенная библиотека сериализации с открытым исходным кодом, которая проще и легче, чем protobuf (протокольные буферы). Рекомендуется использовать конвертеры в Python API:

import tensorflow as tf

converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

converter
Сгенерированный файл .tflite является моделью, используемой интерпретатором. Поместите его и файл тега в каталог ресурсов. Чтобы избежать сжатия инструментом AAPT, вам необходимо добавить элементы конфигурации:

aaptOptions {
    noCompress "tflite"
}

устный переводчик

implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly'
ndk {
    abiFilters 'armeabi-v7a', 'arm64-v8a'
}

Процесс вывода очень прост, то есть сначала загрузите файл модели, а затем используйте его для создания экземпляраInterpreterинтерпретатор, затем запустите интерпретатор, чтобы получить результат
Рекомендуется предварительно загрузить файлы модели и выполнить сопоставление памяти, чтобы ускорить загрузку и уменьшить количество грязных страниц:

private MappedByteBuffer loadModelFile(Activity activity) throws IOException {
    AssetFileDescriptor fileDescriptor = activity.getAssets().openFd("mobilenet_v1_1.0_224.tflite");
    FileInputStream inputStream = new FileInputStream(fileDescriptor.getFileDescriptor());
    FileChannel fileChannel = inputStream.getChannel();
    long startOffset = fileDescriptor.getStartOffset();
    long declaredLength = fileDescriptor.getDeclaredLength();
    return fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength);
}

При построении интерпретатора вы можете передать тип какInterpreter.Optionsпараметры для настройки интерпретатора, такие как количество используемых потоков, использование NNAPI, использование ускорения графического процессора и т. д.:

tfliteModel = loadModelFile(activity);
Interpreter.Options options = new Interpreter.Options();
options.setNumThreads(1);
tflite = new Interpreter(tfliteModel, options);

Возьмем в качестве примера простое приложение модели классификации изображений. Наши входные данные — это объект Bitmap, а на выходе должен быть список классов сущностей, содержащих метки и соответствующие вероятности:

demo

public List<Recognition> recognizeImage(final Bitmap bitmap) {
    ...
}
public static class Recognition {
        private final String id;
        private final String title;
        private final Float confidence;
        private RectF location;
        ...
}

Для более эффективной обработки данных изображения необходимо преобразовать растровое изображение вByteBufferФормат,ByteBufferЧтобы представить изображение в виде одномерного массива по 3 байта на цветовой канал, нам нужно предварительно выделить эту память и вызватьorder(ByteOrder.nativeOrder())чтобы гарантировать, что каждый бит хранится в собственном порядке:

imgData =
        ByteBuffer.allocateDirect(
                DIM_BATCH_SIZE
                        * getImageSizeX()
                        * getImageSizeY()
                        * DIM_PIXEL_SIZE
                        * getNumBytesPerChannel());
imgData.order(ByteOrder.nativeOrder());
...
private void convertBitmapToByteBuffer(Bitmap bitmap) {
    if (imgData == null) {
        return;
    }
    imgData.rewind();
    bitmap.getPixels(intValues, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
    int pixel = 0;
    for (int i = 0; i < getImageSizeX(); ++i) {
        for (int j = 0; j < getImageSizeY(); ++j) {
            final int val = intValues[pixel++];
            addPixelValue(val);
        }
    }
}
protected void addPixelValue(int pixelValue) {
    imgData.putFloat((((pixelValue >> 16) & 0xFF) - IMAGE_MEAN) / IMAGE_STD);
    imgData.putFloat((((pixelValue >> 8) & 0xFF) - IMAGE_MEAN) / IMAGE_STD);
    imgData.putFloat(((pixelValue & 0xFF) - IMAGE_MEAN) / IMAGE_STD);
}

Результатом модели является двумерный массив, представляющий прогнозируемую вероятность каждой метки:

private List<String> labels;
private float[][] labelProbArray;
...
labels = loadLabelList(activity);
labelProbArray = new float[1][labels.size()];
...
private List<String> loadLabelList(Activity activity) throws IOException {
    List<String> labels = new ArrayList<String>();
    BufferedReader reader =
            new BufferedReader(new InputStreamReader(activity.getAssets().open("labels.txt")));
    String line;
    while ((line = reader.readLine()) != null) {
        labels.add(line);
    }
    reader.close();
    return labels;
}

Затем используйте этот ввод и вывод для запуска логического вывода:

public void runInference() {
    tflite.run(imgData, labelProbArray);
}

Наконец, преобразуйте этот labelProbArray вList<Recognition>Его можно использовать для отображения визуального вывода.

Лучшие практики

мы обнаруживаемmobilenet_v1_1.0_224.tfliteРазмер файла модели составляет 16,9 МБ, поэтому мы можем сжать его меньше? Да, поскольку в модели используются веса с плавающей запятой и функции активации, мы можем сжать модель как минимум в 4 раза с помощью квантования.Есть два способа квантования, один из которых - квантование после обучения, нет необходимости повторно обучать модель, но может быть потеря точности, и если эта потеря превышает допустимый порог, единственный выход — квантованное обучение. Если мы решим использоватьmobilenet_v1_1.0_224_quant.tfliteфайл модели, мы найдем, что он составляет всего 4,3 МБ
Еще один важный момент — научиться идти на компромиссы.Хотя некоторые модели очень сложны и велики, они обладают высокой точностью.Хотя некоторые модели не очень точны, но они меньше по размеру и выполняются быстрее.Вы должны выбрать наиболее подходящую модель. согласно реальной ситуации.

tradeoff
Использование аппаратного ускорения не всегда лучший вариант, иногда даже лучше не включать аппаратное ускорение, поэтому лучше сделать бенчмарк

Ссылаться на