Распознавайте цветы с помощью TensorFlow Lite на iOS

1. Введение

657431be3173fa86.png

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

В этой лаборатории кода используется TensorFlow Lite для запуска модели распознавания изображений на устройстве iOS.

Что вы узнаете

  • Как оптимизировать вашу модель с помощью конвертера TFLite.
  • Как запустить его в готовом приложении iOS с помощью интерпретатора TFLite.

Что вы построите

Простое приложение для камеры, которое запускает программу распознавания изображений TensorFlow для идентификации цветов.

Предварительные условия

Если вы выполняете эту лабораторную работу на своем собственном оборудовании, убедитесь, что у вас установлено следующее:

  • Xcode 10 или выше
  • CocoaPods 1.8.0 или выше

c45ecd122998622e.png

Лицензия: Бесплатное использование.

2. Обучите распознаватель цветов с помощью Colab

В этой лаборатории кода будут использоваться Colaboratory и Xcode.

Откройте Colab , который использует TensorFlow Lite Model Maker для обучения классификатора распознаванию цветов с помощью трансферного обучения, и экспортируйте модель TFLite для использования в мобильном приложении.

3. Настройте рабочий каталог.

Клонировать репозиторий Git

Следующая команда клонирует репозиторий Git, содержащий файлы, необходимые для этой лаборатории кода:

git clone https://github.com/tensorflow/examples.git

Теперь cd в корень проекта Xcode только что созданного клона. Именно здесь вы будете работать до конца этой лаборатории кода:

cd examples/lite/examples/image_classification/ios

4. Установите приложение iOS.

Установить зависимости

Используя CocoaPods, установите зависимости приложения iOS (включая TensorFlow Lite). После завершения команды установки откройте ImageClassification.xcworkspace , чтобы открыть проект в Xcode.

pod install --repo-update
open ImageClassification.xcworkspace

5. Тестовый запуск приложения.

Чтобы использовать камеру, приложение должно быть запущено на реальном устройстве, поскольку iOS Simulator не имеет доступа к камере вашего Mac. Чтобы выполнить сборку на устройстве iOS, вы должны быть зарегистрированы в программе Apple Developer Program или иметь доступ к устройству, которое вам предоставил кто-то другой.

Если вы хотите запустить эту лабораторию кода в симуляторе, вам нужно будет скопировать изображения на монтажный стол из Safari в самом симуляторе. Вот этапы обработки изображения в симуляторе:

  1. Создайте приложение для симулятора по вашему выбору.
  2. В симуляторе iOS нажмите Cmd+Shift+H, чтобы свернуть приложение.
  3. Нажмите Safari в нижней части главного экрана и найдите изображение.
  4. В результатах поиска изображений Google нажмите на результат и нажмите и удерживайте изображение. В появившемся диалоге выберите «Копировать».
  5. Вернитесь в приложение TFL Classify. Скопированное изображение должно автоматически отображаться вместе с результатами вывода. Если это не так, убедитесь, что вы скопировали сами данные изображения, а не URL-адрес изображения.

Тестовая сборка и установка приложения

Прежде чем вносить какие-либо изменения в приложение, давайте запустим версию, поставляемую с репозиторием. Выберите свое устройство iOS в раскрывающемся меню в левом верхнем углу:

275753d3a77a0df3.png

Затем нажмите Cmd+R или нажмите «Воспроизвести». f96cf117245c0fa6.png кнопку в Xcode, чтобы создать приложение на вашем устройстве. Приложение должно запуститься автоматически после установки на ваше устройство.

Эта версия приложения использует стандартную сеть MobileNet, предварительно обученную на 1000 категориях ImageNet. Это должно выглядеть примерно так:

d11436f0bb5a75db.jpeg

6. Запустите настроенное приложение.

Настройка приложения по умолчанию классифицирует изображения в один из 1000 классов ImageNet, используя стандарт MobileNet.

Теперь давайте изменим приложение так, чтобы оно использовало нашу переобученную модель для наших пользовательских категорий изображений, обученных в Colab.

7. Преобразуйте приложение для запуска вашей модели.

Добавьте файлы модели в проект

Ресурсы модели проекта расположены в ImageClassification > Model в навигаторе проекта Xcode. Чтобы заменить их, сначала удалите два существующих файла в группе Model . При появлении запроса выберите «Переместить в корзину»:

cf2f7fefb2e5075f.png

Затем перетащите файлы model.tflite и labels.txt , загруженные из Colab, в группу «Модель». При появлении запроса убедитесь, что выбраны опции Copy items if needed и Add to targets .

281d7eb72635bb5f.png

Измените код приложения

Чтобы наше приложение заработало, нам нужно обновить путь логики загрузки модели, чтобы он указывал на новую добавленную модель.

Откройте ModelDataHandler.swift (путь навигатора Xcode: ImageClassification -> ModelDataHandler -> ModelDataHandler.swift) и измените строку 36 на

// before
static let modelInfo: FileInfo = (name: "mobilenet_quant_v1_224", extension: "tflite")

// after
static let modelInfo: FileInfo = (name: "model", extension: "tflite")

Обязательно сохраните все изменения.

8. Запустите настроенное приложение.

Нажмите Cmd+B или нажмите «Воспроизвести». f96cf117245c0fa6.png кнопку в Xcode, чтобы создать приложение на вашем устройстве. После запуска приложения оно должно выглядеть примерно так:

c45ecd122998622e.png

Вы можете удерживать кнопки питания и увеличения громкости вместе, чтобы сделать снимок экрана.

Теперь попробуйте поискать в Интернете цветы, наведите камеру на экран компьютера и посмотрите, правильно ли классифицированы эти изображения.

Или попросите друга сфотографировать вас и узнать, какой вы TensorFlower. \\uf339\\uf33b\\uf337 !

9. Как это работает?

Итак, теперь, когда у вас запущено приложение, давайте посмотрим на конкретный код TensorFlow Lite.

ТензорFlowLiteSwift

Это приложение использует библиотеку TensorFlowLite Swift через CocoaPods. Библиотека Swift представляет собой тонкую оболочку API TFLite C, который сам по себе является оболочкой библиотеки TFLite C++.

Следующие строки в файле Podfile модуля добавляют в проект новейшую версию глобального репозитория спецификаций Pod CocoaPods.

Подфайл

target 'ImageClassification' do
  use_frameworks!

  # Pods for ImageClassification
   pod 'TensorFlowLiteSwift'
end

Использование Swift API TensorFlow Lite

Весь код, взаимодействующий с TensorFlow Lite, содержится в ModelDataHandler.swift .

Настраивать

Первый блок, представляющий интерес, — это инициализатор ModelDataHandler :

МодельDataHandler.swift

/// A failable initializer for `ModelDataHandler`. A new instance is created if the model and
/// labels files are successfully loaded from the app's main bundle. Default `threadCount` is 1.
init?(modelFileInfo: FileInfo, labelsFileInfo: FileInfo, threadCount: Int = 1) {
  let modelFilename = modelFileInfo.name

  // Construct the path to the model file.
  guard let modelPath = Bundle.main.path(
    forResource: modelFilename,
    ofType: modelFileInfo.extension
  ) else {
    print("Failed to load the model file with name: \(modelFilename).")
    return nil
  }

  // Specify the options for the `Interpreter`.
  self.threadCount = threadCount
  var options = InterpreterOptions()
  options.threadCount = threadCount
  do {
    // Create the `Interpreter`.
    interpreter = try Interpreter(modelPath: modelPath, options: options)
    // Allocate memory for the model's input `Tensor`s.
    try interpreter.allocateTensors()
  } catch let error {
    print("Failed to create the interpreter with error: \(error.localizedDescription)")
    return nil
  }
  // Load the classes listed in the labels file.
  loadLabels(fileInfo: labelsFileInfo)
}

Есть несколько строк, о которых стоит поговорить подробнее.

Следующая строка создает интерпретатор TFLite:

МодельDataHandler.swift

interpreter = try Interpreter(modelPath: modelPath, options: options)

Интерпретатор отвечает за передачу входных необработанных данных через граф TensorFlow. Мы передаем интерпретатору путь к нашей модели на диске, а затем интерпретатор загружает ее как FlatBufferModel .

Последняя строка загружает список меток:

loadLabels(fileInfo: labelsFileInfo)

Все, что он делает, это загружает строки из текстового файла в память.

Запустите модель

Второй блок, представляющий интерес, — это метод runModel . Он принимает на вход CVPixelBuffer , запускает интерпретатор и возвращает текст для печати в приложении.

МодельDataHandler.swift

try interpreter.copy(rgbData, toInputAt: 0)
// ...
try interpreter.invoke()
// ...
outputTensor = try interpreter.output(at: 0)

10. Что дальше?

Вот несколько ссылок для получения дополнительной информации: