Машинне навчання для IoT за допомогою Android Things та TensorFlow
Рейтинг статті: / 5
НайгіршеНайкраще 
TensorFlow_RPiДізнайтеся, як об'єднати Android Things і TensorFlow, щоб принести AI і ML в проекти IoT. Даний проект показує, як застосувати машинне навчання до IoT. Як платформу IoT ми будемо використовувати Android Things, а як двигун машинного навчання, будемо використовувати Google TensorFlow.
Машинне навчання з IoT сьогодні є однією з найцікавіших технологічних тем. Щоб дати просте визначення машинного навчання, можна скористатися визначенням Вікіпедії:
«Машинне навчання - це галузь комп'ютерної науки, яка надає комп'ютерним системам можливість "вчитися" (тобто поступово покращувати продуктивність у конкретному завданні) з даними, без явного програмування.»
Іншими словами, після тренувальних кроків система може прогнозувати результати, навіть якщо вони не запрограмовані спеціально. З іншого боку, ми всі знаємо IoT і концепцію підключених пристроїв. Одна з найбільш перспективних тем полягає в тому, як застосувати машинне навчання до IoT, щоб створити експертні системи, здатні "вчитися". Крім того, можна використовувати ці знання для управління та управління фізичними об'єктами.
Існує декілька галузей, в яких застосування машинного навчання та IoT, має важливе значення, такі як:
• Промисловий Інтернет речей (ІІОТ) у прогностичному обслуговуванні
• Споживчий Інтернет речей, де Machine Learning може зробити пристрої розумними, щоб вони могли адаптуватися до наших звичок
У цій статті розглянемо, як застосовувати машинне навчання для IoT за допомогою Android Things та TensorFlow. Основна ідея, що в основі даного проекту Android Things IoT, полягає в дослідженні способу побудови працюючого автомобіля, здатного розпізнавати деякі основні форми (наприклад, стрілки) та керуватися ними. Ми вже розглянули, як побудувати робот-автомобіль за допомогою Android Things, тому рекомендуємо вам ознайомитись зі статтею перед початком даного проекту.
Цей проект машинного навчання та IoT охоплює такі основні теми:
• Як налаштувати середовище TensorFlow за допомогою Docker
• Як тренувати систему TensorFlow
• Як інтегрувати TensorFlow в Android Things
• Як керувати автомобілем-роботом за допомогою результатів TensorFlow

В цьому проекті взято за основу класифікатор зображень Android Things TensorFlow.
Почнемо!
Як створити класифікатор зображень в 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, тому ми повинні зібрати принаймні чотири типи стрілок:
• стрілка вгору
• стрілка вниз
• стрілка ліворуч
• стрілка вправо
Для навчання системи необхідно створити "базу знань" з цими чотирма різних категоріями зображень. Створіть в /tf-data каталог з назвою images та під ним чотири підкаталоги з іменем:
·    up-arrow
·    down-arrow
·    left-arrow
·    right-arrow
Тепер настав час шукати зображення. Автор використав Google Image Search, але ви можете використати інші підходи. Щоб спростити процес завантаження зображень, потрібно встановити плагін Chrome, який завантажує всі зображення лише одним кліком. Не забувайте, чим більше зображень ви завантажите, тим краще це буде для тренувального процесу, навіть якщо час створення моделі може збільшитися.
Відкрийте веб-переглядач і почніть шукати чотири категорії зображень:
TensorFlow-image-classifier
Автор завантажив 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"
Це все, що ми маємо для нашої моделі. Ми будемо використовувати цю модель, щоб застосувати Machine Learning для IoT/інтегрування Android Things with TensorFlow. Мета - додаток Android Things, який дозволяє інтелектуально розпізнавати зображення зі стрілками та реагувати, контролюючи маршрути роботи автомобіля.
Якщо ви хочете отримати більш детальну інформацію про TensorFlow і як створити модель, перегляньте офіційну документацію та цей підручник.
Як застосувати машинне навчання до IoT за допомогою Android Things та TensorFlow
Коли модель TensorFlow готова, можемо перейти до наступного кроку: як інтегрувати Android Things з TensorFlow. Для цієї мети можемо розділити це завдання на два етапи:
1. Апаратна частина, де ми підключаємо двигуни та інші периферійні пристрої до плати Android Things
2. Реалізація програми
Схема Android Things
Перш, ніж з'ясувати деталі щодо підключення периферійних пристроїв, перелічимо компоненти, які використовуються в цьому проекті Android Things:
1. Плата Android для Android (Raspberry Pi 3)
2. Камера Raspberry Pi
3. Один світлодіод
4. Здвоєний H-міст LN298N (для управління двигунами)
5. Роботизоване автомобільне шасі з двома колесами
Ми не обговорюю, як управляти двигунами за допомогою Android Things, оскільки ми вже охопили це в попередньому повідомленні.
Нижче наведена схема:
TensorFlow Motor
На малюнку вище камера не показана. Остаточний варіант:
Android_things_with_tensorflow
Впровадження програми Android Things з TensorFlow
Останній крок - реалізація програми Android Things. З цією метою можемо повторно використати приклад, доступний у GitHub під назвою sample TensorFlow image classifier. Перед запуском клонуйте сховище GitHub, щоб ви могли змінити вихідний код.
Цей додаток Android Things відрізняється від оригінального додатка, оскільки:
1. Не використовується кнопка для запуску камери для зйомки зображення
2. На GitHub використана інша модель
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";
Запустіть програму та насолоджуйтесь показом стрілок на камері та перевірте результат роботи. Машина-робот повинна рухатися відповідно до вказаної стрілки.
Висновки
Ми навчилися, як застосовувати машинне навчання до IoT за допомогою Android Things та TensorFlow. Тепер ми можемо керувати автомобілем робота за допомогою зображень і він буде рухатись відповідно до показаного зображення.
(Джерело EN: dzone.com)
 
>
КнигаНовиниПрактика пошукуПартнериПро нас
Підтримка та дизайн: Могильний С.С. Шаблон: Joomla Templates by BuyHTTP Joomla Hosting