Введение
Компьютерное зрение — это увлекательная область, которая может решить реальные проблемы и способствовать прогрессу в различных отраслях. Он сочетает в себе передовые технологии, такие как статистическая математика, компьютерная графика и искусственный интеллект, для обработки и анализа изображений и видео. Благодаря способности распознавать закономерности, отслеживать объекты и обрабатывать визуальные данные компьютерное зрение может произвести революцию в таких отраслях, как здравоохранение, транспорт и безопасность, что сделает его интересной и захватывающей областью технологий.
Прежде чем вы начнете внедрять инновации в свой следующий проект компьютерного зрения, возможно, вам захочется рассмотреть способы оптимизации вашей модели еще до ее создания. Это тяжелая работа, которую обычно выполняют предварительная обработка данных и уменьшение размерности.
Предварительная обработка и уменьшение размерности являются важными шагами в компьютерном зрении по нескольким причинам:
- Улучшение качества данных. Предварительная обработка помогает очистить и преобразовать необработанные данные в более удобный формат. Это может включать удаление шума и выбросов, исправление несоответствий и стандартизацию данных.
- Повышение эффективности. Предварительная обработка и уменьшение размерности могут помочь ускорить обучение алгоритмов машинного обучения за счет уменьшения количества функций в данных. Это также может помочь снизить риск переобучения, который может произойти, когда алгоритм пытается слишком точно соответствовать обучающим данным.
- Повышение производительности. Уменьшение размерности может помочь повысить производительность алгоритмов машинного обучения за счет удаления избыточных функций, повышения различимости функций и снижения сложности данных. Это может помочь сделать алгоритмы более устойчивыми и надежными.
- Сокращение вычислительных требований. Предварительная обработка и уменьшение размерности также могут помочь снизить вычислительные требования алгоритмов машинного обучения. Уменьшая количество функций, алгоритмы могут обрабатывать данные быстрее и требуют меньше памяти.
Если вы считаете, что вам может потребоваться предварительная обработка изображений и уменьшение размерности, вы можете получить двух зайцев одним выстрелом, используя подходы к отбеливанию, называемые PCA-отбеливанием и ZCA-отбеливанием. Мы рассмотрим оба подхода на коротком примере Python. Примечание. Существует предположение, что PCA/ZCA-отбеливание осуществляется сетчаткой.
Читайте также: Объяснение 20 лучших алгоритмов машинного обучения
Матрица данных и ковариационная матрица
Существует две концепции, которые делают возможным отбеливание PCA и ZCA: матрица данных и ковариационная матрица.
Матрица данных (изображение) преобразуется в ковариационную матрицу с единичной матрицей. Это делается путем преобразования матрицы данных с помощью линейного преобразования, которое включает умножение матрицы данных на собственные векторы ковариационной матрицы. Результатом этого преобразования является выбеленная матрица данных с нулевым средним значением и ковариационная матрица, равная единичной матрице. Затем выбеленную матрицу данных можно использовать для обучения алгоритмов машинного обучения, что может повысить их производительность и снизить риск переобучения.
Давайте начнем с некоторых определений, чтобы мы могли обращаться к ним по мере изучения этих интересных техник.
Матрица данных:
Матрица данных — это матрица, которая представляет входные данные. Обычно это матрица anxd, где n — количество выборок данных, а d — количество признаков в каждой выборке. Матрица данных используется для расчета ковариационной матрицы.
Ковариационная матрица:
Ковариационная матрица — это матрица ADXD, которая суммирует отношения между объектами в матрице данных. Он представляет собой ковариацию между каждой парой признаков и рассчитывается как нормализованный внутренний продукт матрицы данных. Ковариационная матрица используется для выполнения PCA, которая включает в себя поиск основных компонентов ковариационной матрицы.
Единичная матрица:
Единичная матрица — это диагональная матрица, в которой все основные диагональные элементы равны 1, а все остальные элементы — 0. Его часто используют в качестве коэффициента масштабирования или нейтрального элемента в матричных операциях. При отбеливании он служит основой для преобразования данных так, чтобы они имели нулевое среднее значение и единичную ковариацию.
Собственные векторы:
Собственный вектор или матрица собственных векторов — это вектор или (матрица векторов), который сохраняет свое направление при линейном преобразовании, представленном матрицей, и связан со скалярным кратным, известным как собственное значение. Для данной матрицы может быть один или несколько собственных векторов, каждый из которых имеет соответствующее собственное значение. Собственные векторы используются для поиска основных компонентов ковариационной матрицы, которую можно использовать для уменьшения размерности данных и повышения производительности алгоритмов машинного обучения. В 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: скучный 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 г.