Введение
Компьютерное зрение — это захватывающая область, которая может решать реальные проблемы и способствовать прогрессу в различных отраслях. Он сочетает в себе передовые технологии, такие как статистическая математика, компьютерная графика и искусственный интеллект, для обработки и анализа изображений и видео. Обладая способностью распознавать закономерности, отслеживать объекты и обрабатывать визуальные данные, компьютерное зрение может произвести революцию в таких отраслях, как здравоохранение, транспорт и безопасность, превратив его в интересную и захватывающую область технологий.
Прежде чем вы начнете внедрять инновации в свой следующий проект компьютерного зрения, вы можете рассмотреть способы оптимизации своей модели еще до ее создания. Это тяжелая работа, обычно выполняемая предварительной обработкой данных и уменьшением размерности.
Предварительная обработка и уменьшение размерности являются важными этапами компьютерного зрения по нескольким причинам:
- Улучшение качества данных. Предварительная обработка помогает очищать необработанные данные и преобразовывать их в более удобный формат. Это может включать удаление шума и выбросов, исправление несоответствий и стандартизацию данных.
- Повышение эффективности. Предварительная обработка и уменьшение размерности могут помочь ускорить обучение алгоритмов машинного обучения за счет уменьшения количества признаков в данных. Это также может помочь снизить риск переобучения, которое может произойти, когда алгоритм слишком близко подходит к обучающим данным.
- Повышение производительности. Снижение размерности может помочь повысить производительность алгоритмов машинного обучения за счет удаления избыточных функций, повышения их различимости и снижения сложности данных. Это может помочь сделать алгоритмы более надежными и надежными.
- Сокращение вычислительных требований. Предварительная обработка и уменьшение размерности также могут помочь снизить вычислительные требования алгоритмов машинного обучения. Уменьшая количество функций, алгоритмы могут быстрее обрабатывать данные и требуют меньше памяти.
Если вы считаете, что вам может потребоваться предварительная обработка изображений и уменьшение размерности, вы можете получить двух зайцев одним выстрелом с помощью подходов к отбеливанию, называемых PCA-отбеливанием и ZCA-отбеливанием. Мы рассмотрим оба подхода на коротком примере с Python. Примечание: есть некоторые предположение что PCA/ZCA-отбеливание осуществляется сетчаткой.
Читайте также: Объяснение 20 лучших алгоритмов машинного обучения
Матрица данных и ковариационная матрица
Есть две концепции, которые делают возможным отбеливание PCA и ZCA: матрица данных и матрица ковариации.
Матрица данных (изображение) преобразуется, чтобы получить ковариационную матрицу с единичной матрицей. Это делается путем преобразования матрицы данных с помощью линейного преобразования, которое включает умножение матрицы данных на собственные векторы ковариационной матрицы. Это преобразование приводит к отбеленной матрице данных с нулевым средним значением и ковариационной матрицей, равной единичной матрице. Отбеленную матрицу данных затем можно использовать для обучения алгоритмов машинного обучения, что может повысить их производительность и снизить риск переобучения.
Давайте начнем с некоторых определений, чтобы мы могли ссылаться на них, когда мы продолжаем изучать эти классные методы.
Матрица данных:
Матрица данных — это матрица, представляющая входные данные. Обычно это матрица xd, где n — количество выборок данных, а d — количество признаков в каждой выборке. Матрица данных используется для расчета ковариационной матрицы.
Ковариационная матрица:
Ковариационная матрица представляет собой матрицу adxd, которая обобщает отношения между функциями в матрице данных. Он представляет собой ковариацию между каждой парой признаков и рассчитывается как нормализованный внутренний продукт матрицы данных. Ковариационная матрица используется для выполнения PCA, который включает в себя нахождение основных компонентов ковариационной матрицы.
Единичная матрица:
Единичная матрица представляет собой диагональную матрицу, в которой все элементы главной диагонали равны единицам, а все остальные элементы равны нулям. Он часто используется как коэффициент масштабирования или как нейтральный элемент в матричных операциях. При отбеливании он служит базой для преобразования данных, чтобы иметь нулевое среднее значение и единичную ковариацию.
Собственные векторы:
Собственный вектор или матрица собственного вектора — это вектор или (матрица векторов), который сохраняет свое направление при линейном преобразовании, представленном матрицей, и связан со скалярным множителем, известным как собственное значение. Для данной матрицы может быть один или несколько собственных векторов, каждый со своим собственным значением. Собственные векторы используются для нахождения основных компонентов ковариационной матрицы, которые можно использовать для уменьшения размерности данных и повышения производительности алгоритмов машинного обучения. В PCA это обеспечивается корреляционными матрицами.
PCA-отбеливание
Отбеливание PCA (анализ основных компонентов) направлено на уменьшение избыточности данных за счет декорреляции признаков и их масштабирования для получения равной дисперсии. Идея отбеливания PCA состоит в том, чтобы преобразовать данные так, чтобы они имели нулевое среднее значение и ковариационную матрицу идентичности.
Процесс отбеливания PCA можно резюмировать следующим образом:
- Центрируйте данные: вычтите среднее значение данных из каждой функции, чтобы центрировать данные вокруг начала координат.
- Вычислите ковариационную матрицу: Вычислите ковариационную матрицу центрированных данных, чтобы получить меру взаимосвязей между функциями.
- Вычислите собственные векторы и собственные значения. Вычислите собственные векторы и собственные значения ковариационной матрицы, которые дают информацию о направлениях и величинах основных компонентов данных.
- Декоркоррелируйте данные: спроецируйте центрированные данные на собственные векторы, чтобы получить главные компоненты, которые не коррелируют друг с другом.
- Измените масштаб данных: разделите основные компоненты на квадратный корень из соответствующих собственных значений, чтобы повторно масштабировать функции, чтобы иметь равную дисперсию.
ZCA-отбеливание
Отбеливание ZCA (анализ нулевой фазы компонентов), как вы уже догадались, похоже на отбеливание PCA (анализ основных компонентов). Основное различие между отбеливанием ZCA и PCA заключается в том, что отбеливание ZCA сохраняет исходную структуру данных при декоррелировании и повторном масштабировании признаков.
Процесс отбеливания ZCA можно резюмировать следующим образом:
- Центрируйте данные: вычтите среднее значение данных из каждой функции, чтобы центрировать данные вокруг начала координат.
- Вычислите ковариационную матрицу: Вычислите ковариационную матрицу центрированных данных, чтобы получить меру взаимосвязей между функциями.
- Вычислите собственные векторы и собственные значения. Вычислите собственные векторы и собственные значения ковариационной матрицы, которые дают информацию о направлениях и величинах основных компонентов данных.
- Декоркоррелируйте и повторно масштабируйте данные: спроецируйте центрированные данные на собственные векторы, умножьте результат на квадратный корень из соответствующих собственных значений, а затем снова масштабируйте результат на квадратный корень из собственных значений.
- Преобразуйте данные: умножьте декоррелированные и повторно масштабированные данные на транспонирование собственных векторов, чтобы получить отбеленные данные ZCA.
Связь между PCA-отбеливанием и ZCA-отбеливанием
Отбеливание как ZCA, так и PCA обычно используются на этапе предварительной обработки в компьютерном зрении и машинном обучении для классификации изображений и других задач. Оба они направлены на устранение корреляций между функциями в данных и уменьшение размерности данных.
Отбеливание ZCA помогает сохранить исходную структуру данных, в то время как отбеливание PCA фокусируется на декорреляции и изменении масштаба признаков, чтобы сделать их более различимыми. По сути, PCA является предшествующим шагом перед ZCA с дополнительными матрицами преобразования. Метод ZCA, в отличие от PCA, создает локальные фильтры для белого данного пикселя при сохранении пространственного расположения и выравнивании частотного спектра изображения.
Какой из них я должен использовать
Как мы видим, почти все этапы отбеливания PCA и ZCA одинаковы, за исключением последнего этапа. При отбеливании PCA мы выполняем однократное умножение матриц, а при отбеливании ZCA мы выполняем дополнительное умножение матриц с собственными матрицами.
Если важна вычислительная эффективность и цель состоит в том, чтобы уменьшить размерность данных, отбеливание PCA может быть предпочтительным выбором. Однако, если важно сохранить структуру и распределение данных, отбеливание ZCA может быть лучшим вариантом.
TLDR; Используйте ZCA вместо PCA, когда сохранение структуры данных важнее, чем уменьшение размерности.
Отбеливание с помощью Numpy
Во-первых, нам нужны данные для работы. Давайте воспользуемся набором данных Oxford 102 Flower. Он содержит цветные фотографии разных видов цветов. Для работы с данными и в качестве общей практики мы будем использовать загрузчики данных PyTorch. Примечание. Оператор @ в pyton — это матричное умножение, такое же, как np.dot() в numpy.
Вы можете следить в блокноте Google Colab. здесь.
from torchvision import datasets
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
import torch
import torchvision
from torchvision import transforms
reshape = transforms.Compose((transforms.ToTensor(), transforms.Resize((256,256))))
dataset = datasets.Flowers102(
root="",
download=True,
transform=reshape
)
dataloader = Dataloader(dataset, batch_size=1, shuffle=True)
Чтобы вызвать изображение из набора данных, мы можем просто вызвать…
image, labels = next(iter(dataloader))
Если мы хотим увидеть изображение, мы можем…
img = image(0).squeeze()
plt.imshow(img.permute(1,2,0))
plt.show()
Теперь мы можем проводить отбеливание PCA и ZCA, адаптированное из здесь.
import numpy as np
from numpy import matlib
## whitening function
#function to do steps 1-4 and then PCA and ZCA whitening
def shared_steps(x, chan=0, PCA=True):
#use only first color channel
x = np.asarray(x(0,chan))
#center data
avg = x.mean(axis=0)
x = x - np.matlib.repmat(avg, x.shape(0), 1)
#centered-data covariance matrix
C = x @ x.conj().T / x.shape(1)
#decompose the covariance matrix
eigen_matrix, eigen_values, _ = np.linalg.svd(C)
#easy to compute rotation matrix (extra step)
k=1
xRot = eigen_matrix(:,0:k).T.dot(x)
#square root of inverse of eigen matrix
em2 = np.diag(1.0 / np.sqrt(eig_values + 1e-5))
#whitening of image
if PCA:
newim = em2 @ eigen_matrix.conj().T * x
else:
newim = np.dot(np.dot(eigen_matrix, np.dot(em2, eigen_matrix.conj().T)), x)
return newim
#call the function to compute the covariance and get our eigens
eigen_matrix, eigen_vectors = shared_steps(image)
#finish step 5 for PCA whitening
PCA_whitening = PCA_ZCA(image)
#finish step 5 for ZCA whitening
ZCA_whitening = PCA_ZCA(image, PCA=False)
Заговор
Собираем все вместе и сопоставляем наши исходные изображения с нашими выбеленными изображениями…
orig_images = ()
pca_images = ()
zca_images = ()
for i in range(len(dataset)):
image, _ = next(iter(dataloader))
orig_images.append(image(0))
ptemp = torch.zeros((3,256,256))
ztemp = torch.zeros((3,256,256))
for chan in range(3):
PCA_whitening = PCA_ZCA(image, chan)
ptemp(chan,...) = torch.from_numpy(PCA_whitening)
ZCA_w;hitening = PCA_ZCA(image, chan, PCA=False)
ztemp(chan,...) = torch.from_numpy(ZCA_whitening)
pca_images.append(ptemp)
zca_images.append(ztemp)
#plot the original data
ogrid = torchvision.utils.make_grid(orig_images, nrows=5)
plt.imshow(ogrid.permute(1,2,0))
plt.show()
#plot the pca whitened images
pgrid = torchvision.utils.make_grid(pca_images, nrows=5)
plt.imshow(pgrid.permute(1,2,0))
plt.show()
#plot the zca whitened images
zgrid = torchvision.utils.make_grid(zca_images, nrows=5)
plt.imshow(zgrid.permute(1,2,0))
plt.show()
Исходные данные:
PCA-отбеленные данные:
ZCA-отбеленные данные:
Читайте также: Что такое разреженная матрица? Как это используется в машинном обучении?
Заключение
Отбеливание PCA и ZCA — это два мощных метода предварительной обработки и уменьшения размерности в компьютерном зрении и других областях машинного обучения. Эти методы помогают устранить корреляции между признаками, уменьшить размерность данных и повысить производительность алгоритмов машинного обучения за счет уменьшения переобучения и повышения различимости признаков по мере того, как в нейронной сети создаются слои признаков. Хотя и PCA, и ZCA отбеливание имеют свои плюсы и минусы, выбор между ними во многом зависит от вычислительных ограничений и размерности данных. Независимо от того, являетесь ли вы новичком или опытным практикующим врачом, понимание основ оптимального отбеливания PCA и ZCA необходимо для оптимизации производительности ваших моделей и расширения ваших знаний в области компьютерного зрения.
Для более глубокого погружения см. бесплатный ресурс Стэнфорда здесь.
Рекомендации
Мокен, Йоанн. «PCA-отбеливание против ZCA-отбеливания: визуализация Numpy 2d». На пути к науке о данных24 ноября 2022 г., https://towardsdatascience.com/pca-whitening-vs-zca-whitening-a-numpy-2d-visual-518b32033edf. По состоянию на 7 февраля 2023 г.
Учебное пособие по неконтролируемому изучению функций и глубокому обучению. http://ufldl.stanford.edu/tutorial/unsupervised/PCAWhitening/. По состоянию на 7 февраля 2023 г.