Як легко класифікувати їжу за допомогою глибокого навчання та Tensorflow

На даний момент ви вже чули про згорткові нейронні мережі (CNN) та їх ефективність при класифікації зображень. Точність CNN в класифікації зображень є надзвичайно чудовою, а її реальні програми за допомогою API досить глибокі.

навчання

Але іноді ця методика може бути недостатньою. Зображення може представляти кілька атрибутів. Наприклад, усі наведені нижче теги дійсні для зображення нижче. Простий класифікатор заплутається, яку етикетку надати в такому випадку.

Ця проблема відома як Класифікація з декількома мітками.

Чому класифікація з багатьма марками ?

Є багато програм, де присвоєння декількох атрибутів зображенню необхідне. Насправді більш природно вважати, що зображення належать до кількох класів, а не до одного класу. Нижче наведено кілька застосувань класифікації з багатьма мітками.

1. Розуміння сцени

Класифікація з декількома мітками дозволяє легко розрахувати попередні для складних алгоритмів розуміння сцени. Визначення різних можливих тегів для зображення може допомогти алгоритму Scene Understanding створити кілька яскравих описів для зображення.

2. Пошук на основі вмісту

Теги Multi Label можуть покращити здатність пошукових систем отримувати дуже конкретні запити певного продукту. Наприклад, ми могли б надати кілька тегів для зображення моделі, що носить фірмовий одяг. Пошукова система може отримати цей результат, коли ви шукаєте будь-який з тегів. Механізм класифікації декількох міток може автоматично створювати базу даних для пошукової системи.

Більше того, ми можемо використовувати теги, щоб рекомендувати супутні товари на основі активності або уподобань користувача. Наприклад, ви можете рекомендувати подібні пісні чи фільми на основі активності користувача. Для автоматичного індексування таких пісень та фільмів можна використовувати класифікатор із декількома мітками.

Як працює класифікація етикеток?

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

Класифікація за однією міткою

Нейронні мережі є одними з найпотужніших (і популярних) алгоритмів, що використовуються для класифікації. Вони беруть вхідні дані у вигляді вектора, виконують деякі обчислення, а потім виробляють вихідний вектор. Потім вихідний вектор порівнюється з основними мітками істини, і процес обчислення налаштовується (тобто навчається), щоб отримати кращі результати. Для навчання нейронної мережі ми подаємо вхідні дані у вигляді векторів характеристик, що представляють важливу суть даних.

Однією з перешкод, яку ви могли помітити, є проблема кодування зображень у вектор функції. Для цього використовуються згорткові нейронні мережі (CNN). Звитки витягують із зображень важливі особливості та перетворюють їх у векторне представлення для подальшої обробки. Решта процесів обробки в CNN схожа на обробку багатошарового перцептрону. Таким чином, у двох словах, виконується класифікація на одній етикетці.

Класифікація з декількома мітками

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

Метод 1 - Трансформація проблеми

У цьому випадку ми перетворимо проблему Multi Label на проблему Multi Class. Одним із способів цього є підготовка окремого класифікатора для кожної етикетки. Цей метод має очевидний мінус у навчанні занадто багатьох класифікаторів. Це також ігнорує можливу кореляцію між кожною етикеткою.

Інший метод полягає в кодуванні кожної можливої ​​комбінації міток як окремого класу, створюючи тим самим потужність набору міток. Цей метод добре працює для невеликої кількості комбінацій етикеток, але їх важко масштабувати для великої кількості комбінацій етикеток. Лише для 10 міток ми отримали б набір потужності розміром 1024 (2 підняли до рівня 10)!

Спосіб 2 - Адаптація алгоритму

Іноді внесення якихось незначних змін в алгоритм було б достатньо для вирішення проблеми класифікації декількох міток. Наприклад, у випадку з нейронною мережею, ми можемо замінити остаточний шар softmax шаром Sigmoid, а потім використовувати Binary Cross Entropy для оптимізації моделі.

Очевидно, що існує багато стратегій, які можна дослідити. Часто одна стратегія може не працювати найкращим чином для всіх видів даних, а отже, вимагає великих експериментів.

Класифікація продуктів харчування з декількома марками

Теорія звучить добре, але як ми її реалізуємо? У цьому розділі ми створимо власний алгоритм багатозначної класифікації харчових продуктів за допомогою Keras (із серверною базою TensorFlow). Ми модифікуємо просту модель CNN, щоб увімкнути класифікацію з багатьма мітками. Потім ми проведемо порівняння з API класифікації Nanonets Multi Label Classification.

Весь код доступний на GitHub тут. Ви можете стежити за сховищем GitHub, щоб отримати поглиблений посібник для відтворення експериментів.

опис проблеми

Давайте попрацюємо над можливим реальним застосуванням багатокласної класифікації. Враховуючи продукт харчування, ми хотіли б визначити можливі мітки для зображення. Наприклад, даючи зображення торта, ми хотіли б, щоб наша модель надавала теги, такі як “вуглеводи” та “десерт”.

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

Частина 1 - Збір даних

Першим кроком є ​​збір та очищення даних. Я відібрав близько 2000 зображень із набору даних Recipes5k і змінив їх розмір до розміру 224 x 224. В оригінальному наборі даних були анотації інгредієнтів харчового продукту. Однак було більше 1000 можливих інгредієнтів (тобто етикеток), і це створило б дуже рідкісні вектори етикеток. Отже, я створив власний набір анотацій до тих самих зображень.

У нашому випадку зображення може містити щонайбільше 10 можливих міток. Список ярликів: [„Супи“, „Основна“, „Закуска“, „Десерт“, „Білок“, „Жири“, „Вуглеводи“, „Здоровий“, „Небажане“, „М’ясо“]. Для кодування міток у форматі, який може використовуватися нейронною мережею, ми створюємо 10-мірний вектор, такий, що буде «1», якщо мітка присутня на зображенні, і «0», якщо мітка відсутня.

Щоб спростити процес анотації, я зробив кілька сміливих припущень, таких як: «Всі зображення тортів - це десерти та містять вуглеводи». Це значно спростило процес анотації, і я написав просту функцію python для перенесення більшої частини важкої атлетики. Хоча ця стратегія спрощує процес, вона може створювати деякі галасливі анотації (тобто трохи неправильно) і може вплинути на остаточну точність. Проте для цього експерименту з іграшками ми продовжуємо як такі. Зразок анотації до зображення торта та його етикетки наведено нижче.

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

Частина 2 - Побудова моделі

Ми визначимо модель за допомогою Кераса наступним чином. Наведена нижче модель - це попередньо підготовлений ResNet-50 з двома щільними шарами в кінці. Зверніть увагу, що ми використовували сигмоїдну активацію, а не softmax для щільного шару.

Частина 3 - Навчання

Дані були розділені на набори поїздів, перевірки та тестування. Дані нормалізуються по каналу перед подачею на CNN. Оскільки наш набір даних відносно невеликий, ми можемо безпосередньо використовувати model.fit () для навчання нашої моделі. Показано такий фрагмент коду:

Частина 4 - Висновок

Тепер, коли у нас є навчена модель, ми можемо візуалізувати її ефективність за допомогою model.predict (). Це виведе масив з кожним елементом, що представляє ймовірність тегу (або мітки). Ми можемо отримати двійковий вектор, округливши передбачений масив таким чином, що 1 позначає наявність тегу, а 0 означає відсутність тегу. Ми можемо використовувати цей двійковий вектор для декодування передбачуваних міток, як показано на зображенні нижче.

Щоб проаналізувати ефективність, ми повторюємо експеримент з різними моделями, попередньо навченими наборі даних ImageNet. Загалом були використані наступні попередньо навчені моделі:

  • ResNet-50
  • DenseNet-121
  • Xception
  • MobileNet

Ознайомтесь із цим спеціальним репозитарієм Github, щоб поглянути на повний код.

Це було чудово! Але ...

Наведений приклад працює досить добре. Але є деякі проблеми:

  • Як уже згадувалося раніше, існує кілька стратегій для класифікації багатозначних табличок. Потрібно багато експериментів.
  • Потрібно виконати пошук гіперпараметрів для оптимізації продуктивності.
  • Потрібно вручну обробляти навчання передачі та збільшення даних.
  • Потрібен потужний графічний процесор і багато часу на тренування.
  • Щоб перенести цю модель на виробництво, знадобиться додатковий час та зусилля (і вміння).

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

Нанонети на допомогу!

Nanonets надає простий у використанні API для підготовки класифікатора Multi Label. Він піклується про всі важкі ситуації, включаючи збільшення даних, навчання передачі та пошук гіперпараметрів на їх кластерах GPU. Він робить все це протягом години і надає REST API для інтеграції моделі з вашими послугами. Вони також надають послугу анотації, якщо потрібно.

Почати роботу з API Nanonets досить просто. У цьому розділі наведено огляд кроків, пов’язаних із налаштуванням API для проведення того самого експерименту з класифікації харчових продуктів із багатьма марками. Щоб отримати більш детальний набір інструкцій, перегляньте репозиторій GitHub тут.

Частина 1 - Налаштування

Клонуйте сховище GitHub. Отримайте безкоштовний ключ API від Nanonets, встановіть відповідні змінні середовища та запустіть create_model.py, як пояснено у сховищі.

Примітка: У create_model.py ми повинні вказати список можливих ярликів (у нашому випадку 10 категорій продуктів). Я вже вказав мітки в коді, щоб ви могли безпосередньо запустити вищевказаний крок. Якщо ви використовуєте його для будь-якої іншої програми, відредагуйте список можливих міток у цьому файлі.

Частина 2 - Завантажте набір даних

Nanonets вимагає надання набору даних у такій структурі каталогів:

-multilabel_data
| -ImageSets
| | -image1.jpg
| | -image2.jpg
| -Анотації
| | -image1.txt
| | -image2.txt

Я вже створив набір даних у цьому форматі та надав посилання для завантаження (та деякі інструкції) у сховищі GitHub. Запустивши upload_training.py, дані автоматично передаються в Nanonets.

Частина 3 - Навчання та умовиводи

Після завантаження набору даних ви можете виконати train_model.py, щоб розпочати навчальний процес. Сценарій model_state.py буде тримати вас в курсі поточного стану моделі. Ви також можете перевірити статус своєї моделі на своїй сторінці користувача в Nanonets, як показано нижче

Після того, як ваша модель пройде навчання, ви можете запустити prediction.py, щоб використовувати розгорнуту модель! Ви також можете спостерігати зразок виводу JSON зі своєї сторінки користувача, як показано нижче.

Продуктивність

Спершу проведемо елементарний аналіз часу навчання різних моделей Кераса. Час навчання протягом 100 епох у хвилинах наведено на нижченаведеній гістограмі.

MobileNet є найшвидшим у навчанні завдяки своїй ефективній архітектурі. Не дивно, що мережа Xception займає багато часу, оскільки це найскладніша мережа серед тих, які ми порівнювали.

Зверніть увагу, що час навчання не враховувати час, витрачений на пошук гіперпараметрів, налаштування моделі та розгортання моделі. Ці фактори значно збільшують час, необхідний для переміщення моделі на виробництво. Однак Nanonets надала готову до виробництва модель протягом 30 хвилин, навіть після того, як врахувала всі перераховані вище фактори.

Без сумніву, "Нанонець" тренувався швидше, ніж моделі Keras. Але як це оцінює ефективність роботи? Нижче ми наводимо графік оцінки F1, отриманої різними моделями Кераса та Нанонеца.

Нанонець, очевидно, має вищий бал, ніж моделі Кераса. Дивно, але модель MobileNet була дуже близька, щоб наздогнати. Завдяки своїй ефективній архітектурі архітектури, він може зменшити перенапруження краще порівняно з іншими моделями Keras. Порівняно нижчий бал усіх моделей можна віднести або до складності та обмеженого розміру набору даних, або до галасливих анотацій. Нехай також зробить візуальне спостереження за результатами.

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

Лінуватися кодувати? не хочете витрачати на графічні процесори? Зверніться до Nanonets і почніть безкоштовно створювати власні класифікаційні моделі з декількома мітками!

Блог про ШІ та машинне навчання

Ознайомтесь із останніми статтями блогу, вебінарами, статистичними даними та іншими ресурсами з питань машинного навчання, глибокого навчання в блозі Nanonets.