Найти тему

Object Detection в Машинном обучении простыми словами

Фото: Enguerrand Blanchy / Unsplash
Фото: Enguerrand Blanchy / Unsplash

Распознавание объектов – Распознавание эмоций – классическая задача Компьютерного зрения (CV), процесс узнавания различных предметов на изображении.

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

import tensorflow as tf

import matplotlib.pyplot as plt

Мы будем обучать нейронную сеть распознавать предметы одежды из Датасета (Dataset) под названием Fashion MNIST. Он содержит 70 000 предметов одежды в 10 различных категориях. Каждый предмет одежды представлен в виде изображения в оттенках серого 28x28. Вот примеры здесь:

-2

Данные Fashion MNIST доступны непосредственно в API tf.keras. Загрузим их:

mnist = tf.keras.datasets.fashion_mnist

Разделим набор на Тренировочные (Train Data) и Тестовые данные (Test Data):

(training_images, training_labels), (test_images, test_labels) = mnist.load_data()

Как выглядят эти данные в понятном компьютеру табличном виде? Давайте выведем тренировочное изображение в виде таблицы пикселей с той или иной степенью белого по шкале от 0 до 255:

plt.imshow(training_images[0])

print(training_labels[0])

print(training_images[0])

-3

Если мы обучаем нейронную сеть, по разным причинам будет проще, если мы будем рассматривать все значения как от 0 до 1, процесс, называемый «нормализация». К счастью, в Python такой список легко нормализовать без циклов. Мы делаем это так:

training_images = training_images / 255.0

test_images = test_images / 255.0

Почему существует два набора – тренировочный и тестовый? Идея состоит в том, чтобы иметь один набор данных для обучения, а затем еще один набор данных, который модель еще не видела, чтобы определить, насколько хорошо он будет классифицировать значения. В конце концов, модель и предназначена для распознавания объектов с данными из реального мира.

Давайте теперь спроектируем модель. Здесь довольно много новых концепций, но не волнуйтесь, вы их освоите:

model = tf.keras.models.Sequential([tf.keras.layers.Flatten(),

tf.keras.layers.Dense(128, activation=tf.nn.relu),

tf.keras.layers.Dense(10, activation=tf.nn.softmax)])

  • Sequential: определяет ПОСЛЕДОВАТЕЛЬНОСТЬ слоев в нейронной сети.
  • Flatten: Помните ранее, когда наши изображения были квадратными, когда вы их распечатывали? Flatten просто берет этот квадрат и превращает его в одномерный набор.
  • Dense: добавляет слой нейронов. Каждому слою нейронов нужна функция активации, которая сообщает, что делать. Есть много вариантов, но пока используйте только эти.
  • Функция активации выпрямителя (ReLu) фактически означает «Если X> 0 вернуть X, иначе вернуть 0» — так что он делает это, он только передает значения 0 или выше на следующий уровень в сети.
  • Софтмакс (Softmax) принимает набор значений и эффективно выбирает самое большое, поэтому, например, если выходные данные последнего слоя выглядят как [0,1, 0,1, 0,05, 0,1, 9,5, 0,1, 0,05, 0,05, 0,05], он сохраняет вы просматриваете его в поисках наибольшего значения и превращаете его в [0,0,0,0,1,0,0,0,0]. Это позволяет сделать код короче.

Следующее, что нужно сделать — это построить модель. Мы делаем это, компилируя его с оптимизатором и Функцией потерь (Loss Function), как и раньше, а затем обучаете его, вызывая model.fit() и прося его сопоставить ваши данные обучения с вашими метками обучения, т.е. заставить его выяснить взаимосвязь между обучающие данные и их фактические метки, поэтому в будущем, если у вас будут данные, похожие на обучающие данные, он может сделать прогноз того, как эти данные будут выглядеть.

model.compile(optimizer = tf.keras.optimizers.Adam(),

loss = 'sparse_categorical_crossentropy',

metrics=['accuracy'])

model.fit(training_images, training_labels, epochs=5)

Обучение разделено на эпохи:

Epoch 1/5

1875/1875 [==============================] - 13s 6ms/step - loss: 0.5011 - accuracy: 0.8236

Epoch 2/5

1875/1875 [==============================] - 5s 3ms/step - loss: 0.3728 - accuracy: 0.8648

Epoch 3/5

1875/1875 [==============================] - 6s 3ms/step - loss: 0.3384 - accuracy: 0.8762

Epoch 4/5

1875/1875 [==============================] - 5s 3ms/step - loss: 0.3138 - accuracy: 0.8854

Epoch 5/5

1875/1875 [==============================] - 5s 3ms/step - loss: 0.2932 - accuracy: 0.8917

<keras.callbacks.History at 0x7fb53ae2f6d0>

По завершении обучения мы увидим значение точности в конце последней эпохи. В данном случае это 0,8917. Это говорит о том, что точность вашей нейронной сети в классификации обучающих данных составляет около 89%. То есть она смогла правильно узнать предмет одежды в 89% случаев.

Но как это будет работать с неизвестными модели данными? Вот почему у нас есть тестовые изображения. Мы можем вызвать model.evaluate(), чтобы узнать о потерях. Давайте попробуем:

model.evaluate(test_images, test_labels)

313/313 [==============================] - 1s 2ms/step - loss: 0.3577 - accuracy: 0.8744

[0.35774385929107666, 0.8744000196456909]

Точность равна примерно 87%. Как и ожидалось, модель, вероятно, не будет так хорошо работать с неизвестными доселе данными. Однако в целом результат можно считать удовлетворительным.

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

Автор оригинальной статьи: Arun Ponnusamy