Как создать мобильное приложение компьютерного зрения во Flutter

Опубликовано: 2020-04-22

Функции машинного обучения стали обязательными в современных приложениях. Они могут повысить удовлетворенность и дать вашей аудитории необыкновенный опыт работы с приложением, которого они хотят. Благодаря недавней оптимизации аппаратного и программного обеспечения выполнение моделей машинного обучения перемещается из облака на сами мобильные устройства.

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

Наша идея заключалась в том, чтобы добавить функциональность для распознавания типа комнатного растения по изображению, используя методы компьютерного зрения. Благодаря оптимизации TensorFlow Lite производительности на устройстве приложение может запускать нашу модель классификации исключительно на устройстве пользователя. В этой статье я объясню, как быстро подготовить модель классификации изображений и развернуть ее в приложении, разработанном с помощью Flutter.

Создание модуля машинного обучения во Flutter — шаг за шагом

Решение проблемы с небольшим объемом данных

Первым шагом в построении модели машинного обучения является сбор данных. Чтобы создать обучающий набор данных, мы использовали Google Images Downloader, который позволил нам загружать изображения растений из поиска Google с правами, помеченными для коммерческого повторного использования, с помощью следующего короткого сценария:

 $ googleimagesdownload --keywords "Zamioculcas zamiifolia" --usage_rights помечены для повторного использования

Наш окончательный набор данных состоял примерно из 70-170 изображений каждого вида. Было бы очень сложно подготовить хорошо работающую модель классификации изображений с нуля с таким небольшим количеством данных.

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

Увеличение данных

Чтобы максимально использовать наш набор данных, мы использовали пакет предварительной обработки keras ImageDataGenerator, который генерирует пакеты тензорных изображений, дополняя их на лету. Мы использовали следующие преобразования:

  • Переворачивание входных данных по горизонтали: horizontal_flip = True
  • Установка значения сдвига яркости из диапазона: яркость_диапазона = (0,75, 1,25)
  • Сдвиг с заданной интенсивностью: shear_range = 15
  • Изменение масштаба путем умножения на заданное значение: rescale=1./255
  • Увеличение и уменьшение масштаба: zoom_range=0,4
  • Сдвиг в любом направлении: width_shift_range = 0,1, height_shift_range = 0,15
 train_datagen_augment =

           ImageDataGenerator (rotation_range = 30,

           Horizontal_flip = Истина,

           диапазон_яркости = (0,75,1,25),

           сдвиг_диапазон = 15,

           масштаб = 1./255,

           масштаб_диапазон = 0,4,

           ширина_сдвига_диапазон = 0,1,

           height_shift_range = 0,15)

Подготовка

Мы использовали NASNet-Mobile, сверточную нейронную сеть, обученную на более чем миллионе изображений из набора данных ImageNet. Архитектура NasNetMobile состоит из набора блоков, построенных из ячеек нейронной сети.

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

Мы создали нашу модель, выполнив следующие шаги:

  • Удалите последний слой предварительно обученной сети
  • Добавьте сверточную модель в конце сети
  • Заморозить все слои в объединенной сети, кроме тех, которые исходят от добавленной модели.
  • Обучайте модель до тех пор, пока точность не перестанет улучшаться
  • Разморозить все слои в последнем замороженном сверточном блоке предварительно обученной модели.
  • Обучайте модель до тех пор, пока точность не перестанет улучшаться
  • Повторите пункты 5 и 6 пять раз.
  • Разморозьте всю модель и обучайте ее до тех пор, пока точность не перестанет улучшаться.

Оценка модели

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

  • категориальная_точность,
  • top_k_categorical_accuracy (при k=3).

На следующем графике представлена ​​категориальная точность для каждой эпохи обучения нашей модели.

Категориальная точность для каждой эпохи обучения

Окончательная категориальная точность для оценочного набора составляет 0,870, а категориальная точность трех лучших — 0,916. Эти результаты были очень удовлетворительными, учитывая небольшой размер используемого обучающего набора данных.

Преобразование модели

Если мы хотим, чтобы модель keras использовалась в мобильном приложении, ее необходимо преобразовать в объект TensorFlow Lite FlatBuffer. Это можно сделать с помощью кода, показанного в примере ниже.

 импортировать tensorflow.lite как облегченный

keras_model_path = "модель/keras_model"

tflite_model_path = "модель/модель.tflite"

model.save (keras_model_path)

конвертер = lite.TFLiteConverter.from_keras_model_file(keras_model_path)

tflite_model = конвертер.конвертировать()

открыть (tflite_model_path, "wb"). Написать (tflite_model)

Теперь, когда у нас была оптимизированная модель, хранящаяся в пути model/model.tflite, мы могли легко использовать ее в нативных мобильных приложениях, используя:

  • Core ML — для приложений iOS
  • Библиотека поддержки TensorFlow Lite для Android — для приложений Android

Теперь я покажу вам, основываясь на нашем опыте с Planter, как использовать эту модель с Flutter.

Почему флаттер?

Flutter — это набор инструментов пользовательского интерфейса, принадлежащий Google. Он был создан для создания скомпилированных в собственном коде приложений для мобильных устройств, Интернета и настольных компьютеров из единой кодовой базы. Если вам интересно, стоит ли вам использовать Flutter, я рекомендую прочитать эту статью, которая представляет собой тематическое исследование Topline от Abbey Road Studios, разработанного Miquido во Flutter.

Мы можем использовать нашу модель с библиотекой tflite. Это плагин Flutter для доступа к TensorFlow Lite API. Он поддерживает классификацию изображений, обнаружение объектов, Pix2Pix, Deeplab и PoseNet на платформах iOS и Android.

Значок службы кроссплатформенной разработки

Интересуетесь разработкой Flutter?

Учить больше

В процессе разработки нашего приложения мы должны были выполнить следующие шаги:

  • Добавьте tflite в качестве зависимости в наш файл pubspec.yaml.
  • Создайте папку с ресурсами и поместите в нее файл этикетки и файл модели.
  • В pubspec.yaml добавьте:
 ресурсы:

   - активы/метки.txt

   - активы/mobilenet_v1_1.0_224.tflite
  • Импортируем библиотеку tflite:
 импортировать «пакет: tflite/tflite.dart»;
  • Загрузите модель и метки:
 Строка res = await Tflite.loadModel(

  модель: "assets/model.tflite",

  метки: "assets/labels.txt",

  numThreads: 1 // по умолчанию 1

);
  • Запустите модель на изображении (сделайте прогноз):
 распознавание var = await Tflite.runModelOnImage(

        путь: tfResizedImage.path, 

        Стандартное изображение: 255.0, 

        числорезультатов: 3, 

        порог: 0,00001, 

        асинхронно: правда    

 );

Выходные данные прогноза имеют формат, показанный в следующем примере:

 [{надежность: 0.03441339731216431, индекс: 46, метка: Vriesea splendens}, {надежность: 2.086162567138672e-7, индекс: 7, метка: Aphelandra squarrosa}, {надежность: 1.4901161193847656e-7, индекс: 19, метка: Fern arum }]
  • Ресурсы выпуска:
 ждите Tflite.close();

Конечные результаты

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

Щелкнув по виду, вы перейдете к обзорному виду растений, который содержит предварительно заполненную форму с рекомендуемыми графиками полива и внесения удобрений, а также некоторую дополнительную информацию о растении. В приведенном ниже потоке вы можете увидеть пример, в котором Zamioculcas zamiifolia распознается на изображении, сделанном с помощью камеры телефона.

Как работает плантатор
Плантатор - система распознавания
Как добавить растения в Плантер

Перенесите машинное обучение на мобильные устройства!

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

Вы можете получить большую выгоду от использования Flutter и его способности одновременно компилировать код для собственных приложений iOS и Android. С небольшими усилиями вы можете выделить свое приложение на рынке и максимально удержать аудиторию вашего приложения.

Готовы к следующему проекту? Не медлите и свяжитесь с нами!