Сегментация греческих монет с использованием спектральной кластеризации

Beginner

This tutorial is from open-source community. Access the source code

Введение

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

Советы по использованию ВМ

После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Ноутбук и получить доступ к 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()

Резюме

В этом практическом занятии мы использовали спектральную кластеризацию для сегментации изображения греческих монет на несколько частично однородных регионов. Мы предобработали изображение, преобразовали его в граф с значением градиента на рёбрах, применили спектральную кластеризацию и визуализировали полученные регионы. Спектральная кластеризация - это мощный метод, который можно использовать для идентификации кластеров в наборе данных на основе сходства их признаков.