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

К наиболее распространенным проблемам компьютерного зрения относятся:

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

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

Изображения как тензоры

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

В первой части этого раздела мы будем иметь дело с распознаванием рукописных цифр. Мы будем использовать набор данных MNIST, который состоит из изображений рукописных цифр в оттенках серого размером 28x28 пикселей. Каждое изображение может быть представлено как массив 28х28, и элементы этого массива будут обозначать интенсивность соответствующего пикселя — либо в масштабе от 0 до 1 (в этом случае используются числа с плавающей запятой), либо от 0 до 255 (целые числа). Популярная библиотека Python под названием numpy часто используется в задачах компьютерного зрения, поскольку позволяет эффективно работать с многомерными массивами.

Чтобы иметь дело с цветными изображениями, нам нужен какой-то способ представления цветов. В большинстве случаев мы представляем каждый пиксель тремя значениями интенсивности, соответствующими красному (R), зеленому (G) и синему (B) компонентам. Такая кодировка цвета называется RGB, и поэтому цветное изображение размером Ш×В будет представлено как массив размером
3 × В × Ш.

Использование многомерных массивов для представления изображений также имеет преимущество, поскольку мы можем использовать дополнительное измерение для хранения последовательности изображений.
Например, для представления видеофрагмента, состоящего из 200 кадров размером 800×600, мы можем использовать тензор размера 200×3×600×800 .

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

Импортируйте пакеты и загрузите набор данных MNIST.

!pip install -r https://raw.githubusercontent.com/MicrosoftDocs/pytorchfundamentals/main/computer-vision-pytorch/requirements.txt
#Import the packages needed.
import torch
import torchvision
import matplotlib.pyplot as plt
import numpy as np

PyTorch имеет ряд наборов данных, доступных прямо из библиотеки. Здесь мы используем хорошо известный набор данных MNIST рукописных цифр, доступный через torchvison.datasets.MNIST в PyTorch. Объект набора данных возвращает данные в виде изображений Python Imagine Library (PIL), которые мы преобразуем в тензоры, передавая параметр transform = ToTensor().

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

from torchvision.transforms import ToTensor

data_train = torchvision.datasets.MNIST('./data',
        download=True,train=True,transform=ToTensor())
data_test = torchvision.datasets.MNIST('./data',
        download=True,train=False,transform=ToTensor())

Визуализируйте набор данных

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

fig,ax = plt.subplots(1,7)
for i in range(7):
    ax[i].imshow(data_train[i][0].view(28,28))
    ax[i].set_title(data_train[i][1])
    ax[i].axis('off')

Структура набора данных

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

Каждый образец представляет собой кортеж следующей структуры:

  • Первый элемент — это фактическое изображение цифры, представленное тензором формы 1 × 28 × 28.
  • Второй элемент — это метка, указывающая, какая цифра представлена ​​тензором. Это тензор, содержащий числа от 0 до 9.

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

print('Training samples:',len(data_train))
print('Test samples:',len(data_test))

print('Tensor size:',data_train[0][0].size())
print('First 10 digits are:', [data_train[i][1] for i in range(10)])
Training samples: 60000
Test samples: 10000
Tensor size: torch.Size([1, 28, 28])
First 10 digits are: [5, 0, 4, 1, 9, 2, 1, 3, 1, 4]

Все интенсивности пикселей изображений представлены значениями с плавающей запятой от 0 до 1:

print('Min intensity value: ',data_train[0][0].min().item())
print('Max intensity value: ',data_train[0][0].max().item())
Min intensity value:  0.0
Max intensity value:  1.0

Приятного обучения!
Далее ›› Введение в компьютерное зрение с помощью PyTorch (2/6)