перевод статьи
How RGB and Grayscale Images Are Represented in NumPy Arrays.
Rukshan Pramoditha
Сегодня вы познакомитесь с некоторыми из самых важных и фундаментальных тем машинного обучения и глубокого обучения.
Сначала мы поговорим об основах изображения, таких как пиксели, значения пикселей, свойства изображения и разницу между изображениями RGB и изображениями в градациях серого. Затем мы поговорим о том, как эти изображения представлены в массивах NumPy.
В качестве бонуса мы рассмотрим набор данных MNIST digits (см. Ссылку внизу), который содержит тысячи изображений рукописных цифр в оттенках серого. Это поможет вам еще больше прояснить то, что вы узнали в представлении изображений NumPy.
Таким образом, сегодняшний контент будет разделен на два основных раздела:
1. Основы изображений - ключевые компоненты и представления
2. Более пристальный взгляд на набор данных MNIST (необязательно)
Начнем с основ изображений.
Основы изображений.
Пиксели.
Изображение состоит из крошечных квадратных элементов, называемых пикселями. Даже небольшое изображение может содержать миллионы таких пикселей разных цветов.
Свойства изображения
У каждого изображения есть три основных свойства:
Размер - это высота и ширина изображения. Он может быть представлен в сантиметрах, дюймах или даже в пикселях.
Цветовое пространство - примерами являются цветовые пространства RGB и HSV.
Канал - это атрибут цветового пространства. Например, цветовое пространство RGB имеет три типа цветов или атрибутов, известных как красный, зеленый и синий (отсюда и название RGB).
Изображения RGB и изображения в градациях серого.
Важно различать изображения RGB и изображения в градациях серого. Изображение RGB имеет три цветовых канала: красный канал, зеленый канал и синий канал. Однако изображение в градациях серого имеет только один канал.
Значения пикселей
Цвета изображения обозначаются его значениями пикселей. Пиксель может иметь только один цвет, но может быть объединен для создания нескольких цветов.
В изображении в градациях серого, где есть только один канал, значение пикселя имеет только одно число в диапазоне от 0 до 255 (включительно). Значение пикселя 0 представляет черный цвет, а значение 255 пикселей представляет белый цвет. Значение пикселя в изображении в градациях серого можно представить следующим образом:
[40]
Поскольку значение 40 близко к 0, а не к 255, цвет пикселя также близок к черному!
В изображении RGB, где есть три цветовых канала, значение пикселя имеет три числа, каждое в диапазоне от 0 до 255 (оба включительно). Например, число 0 пикселя в красном канале означает, что в пикселе нет красного цвета, а число 255 означает, что в пикселе присутствует 100% красный цвет. Эта интерпретация также действительна для пикселей в двух других каналах. Значение пикселя в изображении RGB можно представить следующим образом:
[255, 255, 0]
Это значение пикселя представляет желтый цвет. Посмотрите на следующую картинку.
Желтый цвет состоит из зеленого и красного цветов. Никакого синего цвета здесь нет. Вот почему значение пикселя [255, 255, 0] представляет пиксель желтого цвета - красный 100% (255), зеленый 100% (255) и отсутствие синего (0)!
Представление изображений в ML (DL) - машинное обучение (глубокое обучение)
В машинном обучении и глубоком обучении изображения представлены в виде массивов NumPy. В контексте глубокого обучения эти массивы NumPy технически называются тензорами (научитесь создавать тензоры, такие как массивы NumPy).
Большинство из вас может запутаться при представлении изображений в массивах NumPy, потому что задействовано несколько измерений. В основном, количество размеров определяется следующими факторами.
Размер изображения - для этого необходимы два измерения для представления высоты и ширины изображения.
Цветовой канал
Количество изображений
Представление изображения в градациях серого в виде массивов NumPy
Одно изображение в градациях серого может быть представлено с помощью двумерного (2D) массива NumPy или тензора. Поскольку в изображении в оттенках серого есть только один канал, нам не нужно дополнительное измерение для представления цветового канала. Два измерения представляют высоту и ширину изображения.
Пакет из 3 изображений в градациях серого может быть представлен с помощью трехмерного (3D) массива NumPy или тензора. Здесь нам нужно дополнительное измерение для представления количества изображений.
Форма вышеуказанного пакета из 3 изображений в градациях серого может быть представлена как:
Представление изображения RGB в виде массивов NumPy.
Одно изображение RGB может быть представлено с помощью трехмерного (3D) массива NumPy или тензора. Поскольку в изображении RGB есть три цветовых канала, нам нужно дополнительное измерение для цветового канала.
Пакет из 3 изображений RGB может быть представлен с использованием четырехмерного (4D) массива NumPy или тензора. Здесь нам нужно дополнительное измерение для представления количества изображений.
Форма вышеуказанного пакета из 3 изображений RGB может быть представлена двумя разными способами:
Последний канал: ось цветового канала помещается в конец. Это стандартно для TensorFlow (Keras) и OpenCV.
Первый канал: ось цветового канала помещается после оси сэмплов.
Редакция перевода -
- TensorFlow: Channels last order.
- Theano: Channels first order.
- CNTK: Channels last order.
подробно об этом - здесь.
Главный вывод: Система записи(notation) каналов (Channels last) - это стандартное обозначение (notation) для представления изображений RGB в виде массивов NumPy.
Достаточно теории для основ изображений и их представления в NumPy. Давайте приступим к изучению набора данных MNIST digits.
Более пристальный взгляд на набор данных MNIST (необязательно)
Набор данных MNIST digits (см. Ссылку внизу), созданный NIST (Национальным институтом стандартов и технологий), представляет собой классический набор данных для обучения глубокому обучению, а также общего машинного обучения. Его широко используют в сообществе машинного обучения и глубокого обучения. Тем не менее, этот набор данных все же стоит изучить и использовать, особенно если вы впервые собираетесь коснуться глубокого обучения.
Набор данных MNIST содержит 70 000 изображений рукописных цифр в оттенках серого по 10 категориям (от 0 до 9). Мы будем использовать два популярных API для загрузки набора данных: Keras API и Scikit-learn API. Оба предоставляют служебные функции для простой загрузки набора данных MNIST. Мы также обсудим различия между двумя API для набора данных MNIST.
Загрузка набора данных MNIST с помощью Keras API
из tenorflow.keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data ()
Получение формы данных
print ("Форма изображения тренировочных данных:", train_images.shape)
print ("Форма меток тренировочных данных:", train_labels.shape)
print ("Форма тестового изображения:", test_images.shape)
print ("Форма тестовых меток:", test_labels.shape)
Пакеты тренировочных и тестовых изображений трехмерны. Это связано с тем, что набор данных MNIST содержит изображения в градациях серого, а не изображения RGB. (60000, 28, 28) означает, что набор изображений поезда содержит 60 000 изображений размером 28 x 28 пикселей. Другими словами, это массив, содержащий 60 000 матриц 28 x 28 целочисленных значений.
примеч. перевода -[ [........ [28x28] ....] ...... таких 60000 .... [... [28x28].....] ]
Метки тренировочного массива и теста одномерные. Они содержат соответствующие метки для 10 категорий (от 0 до 9).
Все это массивы NumPy.
Получение типа данных
Тип данных значений пикселей - «uint8», что означает 8-битные целые числа.
Получение одного изображения из набора изображений для тренировочных данных
Доступ к одному изображению из набора поездов можно получить, используя следующие обозначения:
train_images [i]
Индекс основан на 0. Чтобы получить 10-е изображение, мы должны использовать i = 9.
train_images [9]
Часть массива (Изображение автора)
train_images [9] .shape
Это матрица 28 x 28 полутонового изображения.
Визуализация одного изображения
Мы визуализируем 10-е изображение обучающего набора данных.
Десятое изображение обучающей выборки представляет собой число 4. Давайте посмотрим, правильно ли оно, посмотрев на соответствующую метку.
train_labels [9]
Это также возвращает 4. Итак, изображение соответствует своей метке.
Загрузка набора данных MNIST с помощью Scikit-learn API
Значения пикселей одного изображения упорядочены в одномерный вектор размером 784, который равен 28 x 28. Это означает, что мы все еще можем изменить форму вектора, чтобы получить требуемый формат для изображения, как в API Keras.
Различия между двумя API для набора данных MNIST
Наборы для обучения и тестирования: в Kears набор данных MNIST может быть загружен с наборами для обучения и тестирования. Но в Scikit-learn нам нужно создать тренировочную и тестовые части вручную.
Форма: в Keras одна цифра MNIST представлена двумерным массивом NumPy размером 28 x 28. В Scikit-learn одна цифра MNIST представлена одномерным массивом NumPy размером 784. Нам нужно явно преобразовать массив в массив 28 x 28.
Тип массива: в Kears изображения и метки повторяются массивами NumPy. В Scikit-learn изображения повторяются фреймом данных Pandas, а метки представлены серией Pandas.
Тип данных: в Kears тип данных значений пикселей и меток - «uint8», что означает 8-битные целые числа. В Scikit-learn тип данных значений пикселей - «float64», а тип данных меток - «категория», которые следует преобразовать в «uint8» перед использованием в следующих алгоритмах.
y = y.astype (np.uint8)
Главный вывод: если вы используете набор данных MNIST для целей глубокого обучения, рекомендуем вам загружать данные с помощью Keras API.
MNIST digits dataset citation:
Deng, L., 2012. The mnist database of handwritten digit images for machine learning research. IEEE Signal Processing Magazine, 29(6), pp. 141–142.
MNIST digits dataset source:
http://yann.lecun.com/exdb/mnist/
MNIST digits dataset license:
Yann LeCun (Courant Institute, NYU) and Corinna Cortes (Google Labs, New York) hold the copyright of the MNIST dataset that is made available under the terms of the Creative Commons Attribution-Share Alike 3.0 license.
#нейронная сеть #tensorflow #глубокое обучение #машинное обучение #data science #уроки #программирование #нейросеть #нейронные сети