Применение машинного обучения в IoT

машинное обучение TensorFlow Интернет вещей Android Things

Приветствую всех вОблако Tencent + сообщество, получить больше крупной технической практики Tencent по галантерее ~

Эта статья написанабудущий опекунОпубликован вКолонка «Облако + сообщество»

Этот проект исследует, как применять машинное обучение (Machine Learning) к Интернету вещей (IoT). мы будем использоватьAndroid Thingsв качестве нашей платформы Интернета вещей и принятьGoogle TensorFlowкак наш механизм машинного обучения. И машинное обучение, и Интернет вещей — горячие темы в технологиях в наши дни. НижеПростое определение машинного обучения в Википедии:

Машинное обучение — это область компьютерных наук, которая позволяет компьютерным системам «обучаться» (то есть постепенно улучшать выполнение конкретной задачи) с использованием данных без явного программирования.

Другими словами, после этапа обучения система может прогнозировать результаты (даже если она не была специально запрограммирована на эти результаты). С другой стороны, мы все понимаем IoT и концепцию подключенных устройств. Одна из самых многообещающих тем — как применить машинное обучение к Интернету вещей для создания экспертных систем, которые «обучаются». Кроме того, система использует эти знания для контроля и управления физическими объектами.

Вот несколько примеров областей, в которых машинное обучение и IoT могут иметь большую ценность:

  • Промышленный Интернет вещей (IIoT) в профилактическом обслуживании.
  • В Consumer IoT машинное обучение может сделать устройства умнее, чтобы они адаптировались к нашим привычкам.

В этом руководстве мы рассмотрим, как применять машинное обучение к Интернету вещей с помощью Android Things и TensorFlow. Основная идея этого проекта Android Things IoT заключается в том, чтобы изучить, как построить автомобиль-робот, который может распознавать некоторые основные формы (например, стрелки) и управляться. Мы уже представилиКак построить автомобиль-робот с Android Things, я рекомендую вам прочитать это руководство перед началом этого проекта.

Этот проект машинного обучения и IoT в основном охватывает следующие темы:

  • Как настроить среду TensorFlow с помощью Docker
  • Как обучить систему TensorFlow
  • Как интегрировать TensorFlow с Android Things
  • Как использовать вывод TensorFlow для управления автомобилем-роботом

Этот проект является производным отКлассификатор изображений TensorFlow для Android Things.

Давайте начнем!

Как создать классификатор изображений в Tensorflow

Перед началом нам необходимо установить и настроить среду TensorFlow. Я не эксперт по машинному обучению, поэтому мне нужно найти что-то быстрое и готовое к использованию, чтобы мы могли создать классификатор изображений TensorFlow. Итак, мы можем использовать Docker для запуска образа с TensorFlow. Следуй этим шагам:

\ 1. Клонируйте репозиторий TensorFlow:

git clone https://github.com/tensorflow/tensorflow.git
cd /tensorflow
git checkout v1.5.0

\ 2. Создайте каталог (/tf-data), в котором будут храниться все файлы, которые нам нужны в проекте.

\ 3. Запустите Docker:

docker run -it \
--volume /tf-data:/tf-data \
--volume /tensorflow:/tensorflow \ 
--workdir /tensorflow tensorflow/tensorflow:1.5.0 bash

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

Как тренировать TensorFlow

Прежде чем система Android Things сможет распознавать изображения, необходимо обучить движок TensorFlow для построения своей модели. По этой причине необходимо собрать несколько картинок. Как упоминалось ранее, мы хотим использовать стрелки для управления автомобилем-роботом Android Things — поэтому нам нужно собрать как минимум четыре типа стрелок:

  • стрелка вверх
  • Кнопка "Стрелка вниз
  • стрелка влево
  • правая стрелка

Для обучения системы необходимо создать «базу знаний» для этих четырех различных категорий изображений. Создайте четыре каталога в каталоге с именем images в /tf-data со следующими именами:

  • up-arrow
  • down-arrow
  • left-arrow
  • right-arrow

Настало время собирать ресурсы изображения. Я использую Google Image Search, но вы можете использовать другие методы поиска. Чтобы упростить процесс загрузки изображений, вам следует установить плагин Chrome, который загружает все изображения в один клик. Не забывайте, чем больше изображений вы загрузите, тем лучше будет процесс обучения (хотя время создания модели может увеличиться).

Откройте браузер и начните поиск следующих четырех категорий изображений:

img

Я скачал по 80 изображений для каждой категории. Меня не волнует расширение изображения.

После того, как все категории получат свои изображения, выполните следующие действия (в интерфейсе Docker):

python /tensorflow/examples/image_retraining/retrain.py \ 
--bottleneck_dir=tf_files/bottlenecks \
--how_many_training_steps=4000 \
--output_graph=/tf-data/retrained_graph.pb \
--output_labels=/tf-data/retrained_labels.txt \
--image_dir=/tf-data/images

Эта операция может занять некоторое время, поэтому наберитесь терпения. Наконец, в вашей папке /tf-data должно быть два файла:

  1. retrained_graph.pb
  2. retrained_labels.txt

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

Как тестировать модели Tensorflow

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

python scripts.label_image \
--graph=/tf-data/retrained-graph.pb \
--image=/tf-data/images/[category]/[image_name.jpg]

модель оптимизации

Прежде чем мы сможем использовать эту модель TensorFlow в проекте Android Things, необходимо ее оптимизировать:

python /tensorflow/python/tools/optimize_for_inference.py \
--input=/tf-data/retrained_graph.pb \
--output=/tf-data/opt_graph.pb \
--input_names="Mul" \
--output_names="final_result"

Это наша модель. Мы будем использовать эту модель для применения машинного обучения к IoT (т. е. интеграции Android Things с TensorFlow). Цель состоит в том, чтобы предоставить приложениям Android Things интеллектуальное распознавание изображений стрелок и соответствующую реакцию для управления направлением автомобиля-робота.

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

Как применить машинное обучение к Интернету вещей с помощью Android Things и TensorFlow

Как только модель данных TensorFlow будет готова, мы можем перейти к следующему шагу: как интегрировать Android Things с TensorFlow. Для этого мы можем разделить эту задачу на два этапа:

  1. В аппаратной части мы подключаем моторы и другую периферию (Peripheral) к плате Android Things.
  2. реализовать приложение

Схема вещей Android

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

  1. Доска Android Things (Raspberry Pi 3, Raspberry Pi 3)
  2. Камера Raspberry Pi
  3. светодиодный свет
  4. LN298N Двойной Н-мост (для управления двигателем)
  5. Шасси роботизированной тележки с двумя колесами

я не буду представлять его здесьКак управлять мотором с помощью Android Things,Потому что мы рассмотрели это в предыдущей статье.

Вот схема:

img

На изображении выше компоненты камеры не показаны. Окончательный результат выглядит следующим образом:

img

Реализовать приложение Android Things на основе TensorFlow

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

Это приложение Android Things отличается от оригинального приложения тем, что:

  1. Он не использует кнопку, чтобы запустить камеру для захвата изображения
  2. он использует другую модель
  3. Он использует мигающий светодиод для уведомления, и камера делает снимок после того, как светодиод перестанет мигать.
  4. Он управляет двигателями, когда TensorFlow обнаруживает изображение (стрелка). Кроме того, включите двигатель на 5 секунд перед запуском цикла с шага 3.

Для обработки мигающих светодиодов используйте следующий код:

private Handler blinkingHandler = new Handler();
private Runnable blinkingLED = new Runnable() {
  @Override
  public void run() {
    try {
     // If the motor is running the app does not start the cam
     if (mc.getStatus())
       return ;
     Log.d(TAG, "Blinking..");
     mReadyLED.setValue(!mReadyLED.getValue());
     if (currentValue <= NUM_OF_TIMES) {
       currentValue++;
       blinkingHandler.postDelayed(blinkingLED, 
                       BLINKING_INTERVAL_MS);
     }
     else {
      mReadyLED.setValue(false);
      currentValue = 0;
      mBackgroundHandler.post(mBackgroundClickHandler);
     }
   } catch (IOException e) {
     e.printStackTrace();
   }
  }
};

Когда светодиод перестанет мигать, приложение сделает снимок.

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

@Override
public void onImageAvailable(ImageReader reader) {
  final Bitmap bitmap;
   try (Image image = reader.acquireNextImage()) {
     bitmap = mImagePreprocessor.preprocessImage(image);
   }
   final List<Classifier.Recognition> results = 
      mTensorFlowClassifier.doRecognize(bitmap);
   Log.d(TAG, 
    "Got the following results from Tensorflow: " + results);
   // Check the result
   if (results == null || results.size() == 0) {
     Log.d(TAG, "No command..");
     blinkingHandler.post(blinkingLED);
     return ;
    }
    Classifier.Recognition rec = results.get(0);
    Float confidence = rec.getConfidence();
    Log.d(TAG, "Confidence " + confidence.floatValue());
    if (confidence.floatValue() < 0.55) {
     Log.d(TAG, "Confidence too low..");
     blinkingHandler.post(blinkingLED);
     return ;
    }
    String command = rec.getTitle();
    Log.d(TAG, "Command: " + rec.getTitle());
    if (command.indexOf("down") != -1)
       mc.backward();
    else if (command.indexOf("up") != -1)
       mc.forward();
    else if (command.indexOf("left") != -1)
       mc.turnLeft();
    else if (command.indexOf("right") != -1)
       mc.turnRight();
}

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

Наконец, пришло время использовать модель, созданную в начале. Скопируйте файлы opt_graph.pb и reatrained_labels.txt в папку с ресурсами и замените существующие файлы.

Откройте Helper.java и измените следующие строки:

public static final int IMAGE_SIZE = 299;
private static final int IMAGE_MEAN = 128;
private static final float IMAGE_STD = 128;
private static final String LABELS_FILE = "retrained_labels.txt";
public static final String MODEL_FILE = "file:///android_asset/opt_graph.pb";
public static final String INPUT_NAME = "Mul";
public static final String OUTPUT_OPERATION = "output";
public static final String OUTPUT_NAME = "final_result";

Запустите приложение, попробуйте показать стрелку на камеру и проверьте результат. Автомобиль-робот должен двигаться в соответствии с показанными стрелками.

резюме

В конце этого руководства мы рассмотрели, как применять машинное обучение к Интернету вещей с помощью Android Things и TensorFlow. Мы можем использовать изображение для управления автомобилем-роботом и перемещения автомобиля-робота в соответствии с отображаемым изображением.

Связанное Чтение [Ежедневная рекомендация курса] Машинное обучение в действии! Быстрый старт бизнеса в сфере онлайн-рекламы и знание CTR

Эта статья была разрешена автором для публикации в сообществе Tencent Cloud + Для получения дополнительных оригинальных текстов, пожалуйстанажмите

Найдите и подпишитесь на общедоступную учетную запись «Сообщество Yunjia», как можно скорее получите технические галантереи и ответьте на 1024 после подписки, чтобы отправить вам подарочный пакет технических курсов!

Огромный технический практический опыт, все вСообщество Юнцзя!