将从子集计算的 kmeans 应用于完整数据
Apply kmeans calculated from a subset to full data
我有断层扫描数据集,我想通过 k 均值聚类将其分割成不同的部分。
由于数据集非常大,我计算了数据子集的 k-means。
现在我想将计算出的 k-means 应用到数据集的大部分,但我似乎无法让它正常工作,分割没有正确应用。
我像这样加载图像的子集:
import glob
import imageio
import numpy
filenames = glob.glob(os.path.join(FolderToRead, '*rec0*.tif'))
vol_subset = numpy.stack([imageio.imread(rec) for rec in filenames[::50]], 0)
然后像这样计算 k-means 集群:
import sklearn.cluster
kmeans_volume = sklearn.cluster.MiniBatchKMeans(n_clusters=6, batch_size=2**11)
subset_clustered = kmeans_volume.fit_predict(numpy.array(vol_subset).reshape(-1,1))
subset_clustered.shape = numpy.shape(vol_subset)
标签看起来很棒,标签 1 是骨骼,标签 3 是植入物,标签 5 是骨骼中的血管。
for c, img in enumerate(subset_clustered):
for d, cluster in enumerate(range(number_of_clusters)):
plt.subplot(1, number_of_clusters, d+1)
# Show original image
plt.imshow(img)
# Overlay label image
plt.imshow(numpy.ma.masked_where(img != d, img), cmap='jet_r')
plt.title('Image %s/%s, Label %s' % (c + 1, len(vol_clustered), d))
plt.show()
现在我已经计算了数据子集的 k 均值,我想将它们应用于整个数据集。
我试着这样做,但标签似乎不一致。
# Apply segmentation calculated above
for c, r in enumerate(reconstructions):
# Read in all files subsequently
reconstruction = imageio.imread(r)
# Label the images with the kmeans calculated from a subset of the images
clustered_rec = kmeans_volume.fit_predict(reconstruction.reshape(-1, 1))
clustered_rec.shape = numpy.shape(reconstruction)
# Write out the images
imageio.imwrite('filename' + c + '.png, numpy.uint8(clustered_rec == 3) * 255 ) # 3 being the screw label
下图显示了上面脚本的裁剪输出。
左图中的血管(中间的五个斑点)正确标记为 5,在右图中的下一张图像中它们标记为 1,这是错误的...
如果能指出我做错了什么,将不胜感激。
我希望我不必计算完整数据集的 k 均值,因为有 2700 张 TIFF 图像,每张图像大小为 1944x1944 像素...
来自MiniBatchKMeans
的文档,fit_predict(X[, y])
“计算聚类中心和预测聚类索引每个样本
而方法predict(X)
,仅“预测 X 中每个样本所属的最近簇。”
因此,只有这个必须用在完整的数据集上。
我有断层扫描数据集,我想通过 k 均值聚类将其分割成不同的部分。 由于数据集非常大,我计算了数据子集的 k-means。 现在我想将计算出的 k-means 应用到数据集的大部分,但我似乎无法让它正常工作,分割没有正确应用。
我像这样加载图像的子集:
import glob
import imageio
import numpy
filenames = glob.glob(os.path.join(FolderToRead, '*rec0*.tif'))
vol_subset = numpy.stack([imageio.imread(rec) for rec in filenames[::50]], 0)
然后像这样计算 k-means 集群:
import sklearn.cluster
kmeans_volume = sklearn.cluster.MiniBatchKMeans(n_clusters=6, batch_size=2**11)
subset_clustered = kmeans_volume.fit_predict(numpy.array(vol_subset).reshape(-1,1))
subset_clustered.shape = numpy.shape(vol_subset)
标签看起来很棒,标签 1 是骨骼,标签 3 是植入物,标签 5 是骨骼中的血管。
for c, img in enumerate(subset_clustered):
for d, cluster in enumerate(range(number_of_clusters)):
plt.subplot(1, number_of_clusters, d+1)
# Show original image
plt.imshow(img)
# Overlay label image
plt.imshow(numpy.ma.masked_where(img != d, img), cmap='jet_r')
plt.title('Image %s/%s, Label %s' % (c + 1, len(vol_clustered), d))
plt.show()
现在我已经计算了数据子集的 k 均值,我想将它们应用于整个数据集。 我试着这样做,但标签似乎不一致。
# Apply segmentation calculated above
for c, r in enumerate(reconstructions):
# Read in all files subsequently
reconstruction = imageio.imread(r)
# Label the images with the kmeans calculated from a subset of the images
clustered_rec = kmeans_volume.fit_predict(reconstruction.reshape(-1, 1))
clustered_rec.shape = numpy.shape(reconstruction)
# Write out the images
imageio.imwrite('filename' + c + '.png, numpy.uint8(clustered_rec == 3) * 255 ) # 3 being the screw label
下图显示了上面脚本的裁剪输出。 左图中的血管(中间的五个斑点)正确标记为 5,在右图中的下一张图像中它们标记为 1,这是错误的...
如果能指出我做错了什么,将不胜感激。 我希望我不必计算完整数据集的 k 均值,因为有 2700 张 TIFF 图像,每张图像大小为 1944x1944 像素...
来自MiniBatchKMeans
的文档,fit_predict(X[, y])
“计算聚类中心和预测聚类索引每个样本
而方法predict(X)
,仅“预测 X 中每个样本所属的最近簇。”
因此,只有这个必须用在完整的数据集上。