Введение
В этом практическом занятии мы будем использовать спектральную кластеризацию для сегментации изображения греческих монет на несколько частично однородных регионов. Спектральная кластеризация - это мощный метод, который позволяет идентифицировать кластеры в наборе данных на основе сходства их признаков. В этом практическом занятии мы будем использовать спектральную кластеризацию для сегментации изображения, создав граф на основе различий между воксельными элементами изображения, а затем разбивая изображение на несколько частично однородных регионов.
Советы по использованию ВМ
После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Ноутбук и получить доступ к Jupyter Notebook для практики.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Загрузка и предобработка изображения
Начнем с загрузки изображения греческих монет и его предобработки, чтобы сделать его обработку проще. Мы уменьшим размер изображения до 20% от исходного и применим гауссовый фильтр для сглаживания перед уменьшением масштаба, чтобы уменьшить артефакты алиасинга.
## load the coins as a numpy array
orig_coins = coins()
## Resize it to 20% of the original size to speed up the processing
## Applying a Gaussian filter for smoothing prior to down-scaling
## reduces aliasing artifacts.
smoothened_coins = gaussian_filter(orig_coins, sigma=2)
rescaled_coins = rescale(smoothened_coins, 0.2, mode="reflect", anti_aliasing=False)
Преобразование изображения в граф с значением градиента на рёбрах
Мы преобразуем изображение в граф с значением градиента на рёбрах. Чем меньше beta, тем более независимой от исходного изображения будет сегментация. При beta = 1 сегментация будет близка к вороной.
## Convert the image into a graph with the value of the gradient on the
## edges.
graph = image.img_to_graph(rescaled_coins)
## Take a decreasing function of the gradient: an exponential
beta = 10
eps = 1e-6
graph.data = np.exp(-beta * graph.data / graph.data.std()) + eps
Применение спектральной кластеризации
Мы применим спектральную кластеризацию с использованием стандартного решения собственных значений eigen_solver='arpack'. Можно использовать любое реализованное решение: eigen_solver='arpack', 'lobpcg' или 'amg'. Выбор eigen_solver='amg' требует дополнительного пакета 'pyamg'. Качество сегментации и скорость вычислений в основном определяются выбором решения и значением допуска 'eigen_tol'.
## Apply spectral clustering using the default eigen_solver='arpack'.
## Any implemented solver can be used: eigen_solver='arpack', 'lobpcg', or 'amg'.
## Choosing eigen_solver='amg' requires an extra package called 'pyamg'.
## The quality of segmentation and the speed of calculations is mostly determined
## by the choice of the solver and the value of the tolerance 'eigen_tol'.
n_regions = 26
n_regions_plus = 3
for assign_labels in ("kmeans", "discretize", "cluster_qr"):
t0 = time.time()
labels = spectral_clustering(
graph,
n_clusters=(n_regions + n_regions_plus),
eigen_tol=1e-7,
assign_labels=assign_labels,
random_state=42,
)
t1 = time.time()
labels = labels.reshape(rescaled_coins.shape)
Визуализация сегментации
Мы визуализируем полученные регионы, изобразив исходное изображение и наложив на него контуры сегментированных регионов.
plt.figure(figsize=(5, 5))
plt.imshow(rescaled_coins, cmap=plt.cm.gray)
plt.xticks(())
plt.yticks(())
title = "Spectral clustering: %s, %.2fs" % (assign_labels, (t1 - t0))
print(title)
plt.title(title)
for l in range(n_regions):
colors = [plt.cm.nipy_spectral((l + 4) / float(n_regions + 4))]
plt.contour(labels == l, colors=colors)
plt.show()
Резюме
В этом практическом занятии мы использовали спектральную кластеризацию для сегментации изображения греческих монет на несколько частично однородных регионов. Мы предобработали изображение, преобразовали его в граф с значением градиента на рёбрах, применили спектральную кластеризацию и визуализировали полученные регионы. Спектральная кластеризация - это мощный метод, который можно использовать для идентификации кластеров в наборе данных на основе сходства их признаков.