Цель состоит в том, чтобы создать классификатор изображений для набора данных Kaggle Natural Images, который содержит 6899 изображений из 8 различных классов, собранных из различных источников. Классы включают самолет, автомобиль, кошку, собаку, цветок, фрукт, мотоцикл и человека.

Если вы заинтересованы в тестировании моего веб-приложения, перейдите по этой ссылке

Блокнот Google colab ссылка

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

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

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

Сверточная нейронная сеть

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

Существует четыре типа слоев сверточной нейронной сети: слой свертки, слой объединения, слой коррекции ReLU и слой полносвязный слой.

Сверточный слой

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

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

Объединяющий слой

Этот слой часто оказывается зажатым между двумя сверточными слоями: он получает много карт объектов и применяет операцию объединения к каждой из них.

Операция объединения уменьшает размер фотографий, сохраняя при этом их основные свойства.

Слой коррекции ReLU

Реальная нелинейная функция, определяемая ReLU(x)=max, называется ReLU (выпрямленные линейные единицы) (0,x). С точки зрения внешнего вида это выглядит следующим образом:

Все отрицательные значения, полученные на входе, заменяются нулями корректирующим слоем ReLU. Он служит активирующим механизмом.

Полностью подключенный слой

Полносвязный слой, сверточный или нет, всегда является последним слоем нейронной сети, поэтому он не уникален для CNN.

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

Давайте начнем программировать...

  1. Первый шаг — загрузить данные — нам нужно разархивировать и загрузить входной набор данных, а также разделить входные данные на тестовые и обучающие наборы данных.
  2. проверьте точность модели. Проверить Если точность низкая или приводит к недостаточной или избыточной подгонке
  3. Применить настройку гиперпараметров и протестировать, увеличивая количество слоев и изменяя другие параметры
  4. Измените размер пакета, значения эпохи, а затем сравните точность
  5. Попробуйте реализовать модели машинного обучения с другими алгоритмами, такими как классификатор случайного леса, KNN и дерево решений.
  6. Создайте веб-приложение, которое позволяет пользователю загружать изображение, а затем приложение будет предсказывать категорию загруженного изображения

1. Загрузите и разделите набор данных Input Natural Images.

Здесь я в основном использовал Tensorflow для создания классификатора изображений.

Что такое Tensorflow?

TensorFlow – это библиотека машинного обучения, разработанная командой Google Brain в 2015 году. Она в первую очередь предназначена для приложений глубокого обучения. TensorFlow принимает данные в виде многомерных массивов, называемых тензорами. Многомерные массивы очень эффективны при обработке больших объемов данных.

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

2. Обучение моделей

Я реализовал приведенные ниже классификаторы для классификации изображений.

  1. Сверточная нейронная сеть
  2. Классификатор случайного леса
  3. Классификатор KNN
  4. Классификатор дерева решений

1. Создайте модель CNN

Модель 1

В рамках модели 1 я разработал простую модель машинного обучения только с плотным слоем.

с исходной моделью мы получили точность 76%. Но из приведенного выше результата очень ясно, что модель привела к переоснащению.

Переоснащение

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

Выше вы можете ясно видеть большую разницу в точности модели по сравнению с тестовыми и обучающими данными. С тестовыми данными модель показывает точность 85%, тогда как в данных поезда она показывает точность 46%. Что ж… это может быть признаком переобучения. Поэтому нам нужно найти способы предотвратить переоснащение.

Давайте рассмотрим различные способы предотвращения переобучения

Согласно документации Tensorflow, двумя эффективными методами предотвращения переобучения являются добавление регуляризации веса и отсева.

Модель 2

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

Эта модель 2 привела к точности 78,97%.

Модель 3

В рамках модели 3 мы разработали сложную модель с 6 слоями conv2D, которая дала точность 89,48%.

Графическое представление потерь при обучении и проверке и точности трех вышеуказанных моделей CNN

Точность и эпоха

Настройка гиперпараметров

Поэкспериментируйте с пятью гиперпараметрами в модели:

  1. Коэффициент отсева в слое отсева
  2. Оптимизатор
  3. Параметр регуляризации L2
  4. Эпоха
  5. Выпадающий слой

Экспериментируя с частотой отсева в слое отсева, мы получили максимальную точность, когда скорость отсева находится в диапазоне 04–0,5.

Также мы получили максимальную точность с оптимизатором adam в тензорном потоке.

При увеличении значения эпохи точность также увеличивалась, но через некоторый момент времени точность оставалась постоянной или начинала снижаться.

Параметр регуляризации L2 и слои Dropout используются для предотвращения переобучения в модели машинного обучения.

2. Классификатор случайного леса

Случайный лес — это контролируемый подход к машинному обучению для решения задач классификации и регрессии. Он использует большинство голосов для классификации и среднее значение для регрессии для создания деревьев решений из различных выборок.

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

Мы достигли 45-процентной точности, используя классификатор Random Forest для нашего классификатора изображений.

3. Классификатор КНН

Алгоритм k-ближайших соседей (KNN) — это подход к классификации данных, который определяет вероятность того, что точка данных будет принадлежать к одной из двух групп на основе ближайших к ней точек данных.

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

Используя классификатор KNN, мы получили точность около 67%.

4. Классификатор дерева решений

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

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

Используя классификатор дерева решений, мы получили точность около 56%.

Сравнение точности моделей

Веб-приложение Flask

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

Flask — это микровеб-фреймворк, написанный на Python, который предлагает полезные инструменты и функции, облегчающие создание веб-приложений. По сравнению с другими фреймворками Flask более доступен для новичков.

В этом веб-приложении есть две страницы:

1) На домашней странице есть функция, с помощью которой мы можем загрузить изображение, и когда мы нажимаем кнопку «Предсказать», появляется страница результатов.

2) Прогнозируемый результат находится на этой странице. Он отображает категорию изображения и вероятность.

Структура папок:

модели /my_model.pkl

статические/изображения

шаблоны

app.py

Рабочий процесс:

Папка templates содержит файлы HTML-шаблонов для визуализации приложения. Используемый нами движок рендеринга — Jinja2.

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

Экспортированный файл модели будет храниться в папке моделей. Обученную модель экспортировали в формат .pkl с помощью пакета pickle.

Точка входа приложения — app.py. В этом файле содержится вся необходимая информация для запуска приложения.

Я определил маршрут для домашней страницы в app.py: @app.route('/', method='GET') . Здесь у нас будет форма для загрузки изображения.

Точно так же @app.route(‘/’, method=[ ‘POST’]) определяется как маршрут действия формы для загрузки изображения. Как только изображение достигает сервера, выполняется предварительная обработка изображения, прежде чем оно будет передано модели для прогнозирования.

Результат модели обрабатывается и визуализируется по шаблонам с помощью Jinja2.

Github: https://github.com/rettygeorge/Natural-image-classifier

Видео на YouTube

Ниже вы можете найти видео на YouTube, описывающее классификатор изображений, а также показывающее небольшую демонстрацию веб-приложения.

Ссылка на набор данных: https://www.kaggle.com/datasets/prasunroy/natural-images

Окончательное проектное предложение: https://medium.com/@retty.george/final-project-prop-abfdc5d6f4af

Ссылка на исходный код: https://github.com/rettygeorge/rettygeorge.github.io/blob/master/final_project.ipynb

Ссылка на веб-приложение: https://flask-image-classifier-retty.herokuapp.com

Ссылка на исходный код веб-приложения: https://github.com/rettygeorge/Natural-image-classifier

Мой вклад:

Мой вклад включает в себя понимание концепций сверточной нейронной сети и экспериментирование с различными гиперпараметрами для повышения точности, например, работа с разным размером пакета, эпохами, входными слоями, оптимизаторами и так далее. Я создал 3 модели CNN, а затем сравнил их точность.

Кроме того, я также реализовал классификатор случайного леса, классификатор KNN, а также классификатор дерева решений.

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

Задачи:

Основная проблема, с которой я столкнулся в этом финальном проекте, была связана с парком нейронных сетей. Большинство моделей приводили к недостаточной и чрезмерной подгонке. Поэтому я экспериментировал с различными гиперпараметрами, такими как входной слой, эпохи, размер пакета, оптимизатор и так далее. чтобы получить окончательную модель нейронной сети с точностью 89%. Я исследовал и пробовал различные методы оптимизации и тем самым увеличил точность до 89.

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

Справочник

  1. https://www.kaggle.com/code/yasinsoylu123/natural-image-classification
  2. https://www.kaggle.com/code/err0r90/natural-images-with-cnn
  3. https://www.analyticsvidhya.com/blog/2021/06/understanding-random-forest/
  4. https://towardsdatascience.com/decision-tree-classifier-explained-in-real-life-picking-a-vacation-destination-6226b2b60575
  5. https://learn.g2.com/k-nearest-neighbor
  6. https://towardsdatascience.com/a-comprehensive-guide-to-convolutional-neural-networks-the-eli5-way-3bd2b1164a53
  7. https://www.analyticsvidhya.com/blog/2022/01/image-classification-using-machine-learning/
  8. https://medium.com/ml-book/neural-networks-hyperparameter-tuning-in-tensorflow-2-0-a7b4e2b574a1
  9. https://deepai.org/machine-learning-glossary-and-terms/convolutional-neural-network
  10. https://www.tensorflow.org/api_docs/python/tf/keras/utils/image_dataset_from_directory
  11. https://memegenerator.net/instance/72021402/toy-story-everywhere-hd-tensorflow-tensorflow-everywhere
  12. https://ifunny.co/picture/the-data-the-nearest-neighbour-classifier-NXnnBxR59
  13. https://www.tensorflow.org/js/guide/models_and_layers
  14. https://www.simplilearn.com/tutorials/deep-learning-tutorial/what-is-tensorflow
  15. https://www.tensorflow.org/tutorials/images/classification
  16. https://www.tensorflow.org/tutorials/keras/classification
  17. https://towardsdatascience.com/understand-the-architecture-of-cnn-90a25e244c7
  18. https://www.tensorflow.org/api_docs/python/tf/keras/layers/Dense
  19. https://www.tensorflow.org/api_docs/python/tf/keras/layers/Conv2D
  20. https://www.tensorflow.org/tutorials/keras/overfit_and_underfit
  21. https://www.freecodecamp.org/news/how-to-build-the-best-image-classifier-3c72010b3d55/
  22. https://colab.research.google.com/github/tensorflow/docs/blob/master/site/en/tutorials/images/classification.ipynb#scrollTo=jWnopEChMMCn