Статьи

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

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

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

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

Существует несколько областей, в которых применение машинного обучения и IoT дает важное значение, и вот лишь несколько интересных областей:

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

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

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

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

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

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

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

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

  1. Клонируйте репозиторий TensorFlow:
    1
    2
    3
    git clone https://github.com/tensorflow/tensorflow.git
    cd /tensorflow
    git checkout v1.5.0
  2. Создайте каталог ( /tf-data ), в котором будут храниться все файлы, которые мы будем использовать во время проекта.
  3. Запустите Docker:
    1
    2
    3
    4
    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, чтобы нам нужно было собрать как минимум четыре типа стрелок:

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

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

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

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

Откройте браузер и начните искать четыре категории изображений:

Я скачал 80 изображений для каждой категории. Не заботиться о расширении изображения.

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

1
2
3
4
5
6
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

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

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

Оптимизация модели

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

1
2
3
4
5
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 с TensorFlow. Цель состоит в том, чтобы применить приложение Android Things к интеллекту, чтобы распознавать изображения стрелок и, следовательно, реагировать, контролируя направления движения робота-машины.

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

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

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

  1. Аппаратная часть, где мы подключаем двигатели и другие периферийные устройства к плате Android Things
  2. Реализация приложения

Схемы вещей Android

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

  1. Android Things board (Raspberry Pi 3)
  2. Raspberry Pi Camera
  3. Один светодиод
  4. LN298N Dual H Bridge (для управления двигателями)
  5. Робот-шасси с двумя колесами

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

Ниже схемы:

На картинке выше камера не показана. Окончательный результат:

Реализация приложения Android Things с помощью TensorFlow

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

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

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

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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();
   }
  }
};

Когда светодиод перестает мигать, приложение захватывает изображение.

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

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
@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 и измените следующие строки:

1
2
3
4
5
6
7
8
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";

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

Резюме

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

Опубликовано на Java Code Geeks с разрешения Франческо Аццолы, партнера по нашей программе JCG. См. Оригинальную статью здесь: Как применить машинное обучение к IoT с помощью Android Things и TensorFlow

Мнения, высказанные участниками Java Code Geeks, являются их собственными.