您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
(corrcoef)-matlabxcorr计算过程
颜色,图像,灰度(corrcoef)-matlabxcorr计算过程
发布时间:2020-12-06加入收藏来源:互联网点击:
找到这些中心后,在 RGB 颜色立方体中可视化它们。为了对比,还要在该图中添加灰度对角线。
# Plot centroids in 3D spacefig = plt.figure(figsize=(16, 5))# Loop through 3 different viewsfor i, view in enumerate([[-45, 10], [40, 80], [60, 10]]): ax = fig.add_subplot(1, 3, i + 1, projection="3d") ax.scatter(X_grays[:, 0], X_grays[:, 1], X_grays[:, 2], facecolors=X_grays, s=10) ax.scatter( new_centers[:, 0], new_centers[:, 1], new_centers[:, 2], facecolors=new_centers, s=10) ax.set_xlabel("R") ax.set_ylabel("G") ax.set_zlabel("B") ax.xaxis.set_ticklabels([]) ax.yaxis.set_ticklabels([]) ax.zaxis.set_ticklabels([]) ax.set_xlim(0, 1) ax.set_ylim(0, 1) ax.set_zlim(0, 1) ax.view_init(azim=view[0], elev=view[1], vertical_axis="z")plt.suptitle("Color centroids in RGB space", fontsize=20)plt.show()那么我们如何使用这两个信息(云质心和灰度对角线)来重新对齐和拉伸我们的原始数据集?一种有效方法如下:
对于原始数据集中的每个颜色值,我们计算到最近的云质心的距离向量。然后将此距离向量添加到灰度对角线(即重新对齐质心)。拉伸和剪切颜色值,以确保 99.9% 的所有值都在所需的颜色范围内。# Create grayscale diagonal centroids (equal numbers to cloud centroids)steps = np.linspace(0.2, 0.8, len(new_centers))# Realign and stretch imagesX_tr_stretch = np.array( [x - new_centers[np.argmin(np.linalg.norm(x - new_centers, axis=1))] + steps[np.argmin(np.linalg.norm(x - new_centers, axis=1))] for x in tqdm(X_tr.reshape(-1, 3))])X_va_stretch = np.array( [x - new_centers[np.argmin(np.linalg.norm(x - new_centers, axis=1))] + steps[np.argmin(np.linalg.norm(x - new_centers, axis=1))] for x in tqdm(X_va.reshape(-1, 3))])X_te_stretch = np.array( [x - new_centers[np.argmin(np.linalg.norm(x - new_centers, axis=1))] + steps[np.argmin(np.linalg.norm(x - new_centers, axis=1))] for x in tqdm(X_te.reshape(-1, 3))])# Stretch and clip dataxmin_tr = np.percentile(X_tr_stretch, 0.05, axis=0)X_tr_stretch -= xmin_trX_va_stretch -= xmin_trX_te_stretch -= xmin_trxmax_tr = np.percentile(X_tr_stretch, 99.95, axis=0)X_tr_stretch /= xmax_trX_va_stretch /= xmax_trX_te_stretch /= xmax_trX_tr_stretch = np.clip(X_tr_stretch, 0, 1)X_va_stretch = np.clip(X_va_stretch, 0, 1)X_te_stretch = np.clip(X_te_stretch, 0, 1)那么,原始 RGB 颜色值在重新对齐和拉伸后会是什么样子?
# Plot color values in 3D spacefig = plt.figure(figsize=(16, 5))stretch_colors = X_tr_stretch[::100]# Loop through 3 different viewsfor i, view in enumerate([[-45, 10], [40, 80], [60, 10]]): ax = fig.add_subplot(1, 3, i + 1, projection="3d") ax.scatter( stretch_colors[:, 0], stretch_colors[:, 1], stretch_colors[:, 2], facecolors=stretch_colors, s=2) ax.set_xlabel("R") ax.set_ylabel("G") ax.set_zlabel("B") ax.xaxis.set_ticklabels([]) ax.yaxis.set_ticklabels([]) ax.zaxis.set_ticklabels([]) ax.view_init(azim=view[0], elev=view[1], vertical_axis="z") ax.set_xlim(0, 1) ax.set_ylim(0, 1) ax.set_zlim(0, 1)plt.suptitle("Colors in realigned and stretched space", fontsize=20)plt.show()这看起来已经很有不错了。点云更好地与立方体对角线对齐,并且似乎点云向各个方向延伸了一点。在这种新的颜色编码中,细胞图像是什么样的?
# Convert data back into image spaceX_tr_stretch = X_tr_stretch.reshape(X_tr.shape)X_va_stretch = X_va_stretch.reshape(X_va.shape)X_te_stretch = X_te_stretch.reshape(X_te.shape)# Plot datasetplot_dataset(X_tr_stretch)3.PCA 转换
最后一个选项,让我们使用 PCA 方法将原始 RGB 颜色值转换为新的 3D 空间,这三个新轴中的每一个都尽可能多地解释差异。对于这种方法,本文将使用原始 RGB 颜色值,但也可以使用刚刚重新对齐和拉伸的值。
那么在这个新的 PCA 颜色空间中,原始的 RGB 颜色值是什么样的呢?
# Train PCA decomposition on original RGB valuesfrom sklearn.decomposition import PCApca = PCA()pca.fit(X_tr.reshape(-1, 3))# Transform all data sets into new PCA spaceX_tr_pca = pca.transform(X_tr.reshape(-1, 3))X_va_pca = pca.transform(X_va.reshape(-1, 3))X_te_pca = pca.transform(X_te.reshape(-1, 3))# Stretch and clip dataxmin_tr = np.percentile(X_tr_pca, 0.05, axis=0)X_tr_pca -= xmin_trX_va_pca -= xmin_trX_te_pca -= xmin_trxmax_tr = np.percentile(X_tr_pca, 99.95, axis=0)X_tr_pca /= xmax_trX_va_pca /= xmax_trX_te_pca /= xmax_trX_tr_pca = np.clip(X_tr_pca, 0, 1)X_va_pca = np.clip(X_va_pca, 0, 1)X_te_pca = np.clip(X_te_pca, 0, 1)# Flip first componentX_tr_pca[:, 0] = 1 - X_tr_pca[:, 0]X_va_pca[:, 0] = 1 - X_va_pca[:, 0]X_te_pca[:, 0] = 1 - X_te_pca[:, 0]# Extract a few RGB color valuesX_colors = X_tr_pca[::100].reshape(-1, 3)# Plot color values in 3D spacefig = plt.figure(figsize=(16, 5))# Loop through 3 different viewsfor i, view in enumerate([[-45, 10], [40, 80], [60, 10]]): ax = fig.add_subplot(1, 3, i + 1, projection="3d") ax.scatter(X_colors[:, 0], X_colors[:, 1], X_colors[:, 2], facecolors=X_colors, s=2) ax.set_xlabel("PC1") ax.set_ylabel("PC2") ax.set_zlabel("PC3") ax.xaxis.set_ticklabels([]) ax.yaxis.set_ticklabels([]) ax.zaxis.set_ticklabels([]) ax.view_init(azim=view[0], elev=view[1], vertical_axis="z") ax.set_xlim(0, 1) ax.set_ylim(0, 1) ax.set_zlim(0, 1)plt.suptitle("Colors in PCA space", fontsize=20)plt.show()拉伸效果很好!但是图像呢?让我们来看看。
# Convert data back into image spaceX_tr_pca = X_tr_pca.reshape(X_tr.shape)X_va_pca = X_va_pca.reshape(X_va.shape)X_te_pca = X_te_pca.reshape(X_te.shape)# Plot datasetplot_dataset(X_tr_pca)这看起来也很有意思。各部分的颜色都不太相同,例如 背景、原子核和原子核周围的东西都有不同的颜色。但是 PCA 转换也带来了图像中的一个伪影——图像中间的类似交叉的颜色边界。目前尚不清楚这是从哪里来的,但我认为这是由于 MedMNIST 通过对原始数据集进行下采样而引入的数据集操作。
特征的相关在继续我们的下一部分研究之前(即测试这些颜色操作是否能帮助卷积神经网络对10个目标类进行分类),让我们快速地看看这些新的颜色值是如何相互关联的。
# Combine all images in one big dataframeX_tr_all = np.vstack([X_tr.T, X_tr_gray.T, X_tr_stretch.T, X_tr_pca.T]).TX_va_all = np.vstack([X_va.T, X_va_gray.T, X_va_stretch.T, X_va_pca.T]).TX_te_all = np.vstack([X_te.T, X_te_gray.T, X_te_stretch.T, X_te_pca.T]).T# Compute correlation matrix between all color featurescorr_all = np.corrcoef(X_tr_all.reshape(-1, X_tr_all.shape[-1]).T)cols = ["Red", "Green", "Blue", "Gray", "Stretch1", "Stretch2", "Stretch3", "PC1", "PC2", "PC3"]plt.figure(figsize=(8, 8))sns.heatmap( 100 * corr_all, square=True, center=0, annot=True, fmt=".0f", cbar=False, xticklabels=cols, yticklabels=cols,)正如我们所看到的,许多新的颜色特征与原始的RGB值高度相关(除了第二和第三个PCA特征)。下面就可以测试颜色处理是否对图像分类有帮助。
测试图像分类看看我们的颜色处理是否能帮助卷积神经网络对8个目标类进行分类。我们创建一个“小的”ResNet模型,并在数据集的所有4个版本(即原始,灰度,拉伸,和PCA)上训练它。
# The code for this ResNet architecture was adapted from here:# https://towardsdatascience.com/building-a-resnet-in-keras-e8f1322a49bafrom tensorflow import Tensorfrom tensorflow.keras.layers import (Input, Conv2D, ReLU, BatchNormalization, Add, AveragePooling2D, Flatten, Dense, Dropout)from tensorflow.keras.models import Modeldef relu_bn(inputs: Tensor) - Tensor: relu = ReLU()(inputs) bn = BatchNormalization()(relu) return bndef residual_block(x: Tensor, downsample: bool, filters: int, kernel_size: int = 3) - Tensor: y = Conv2D( kernel_size=kernel_size, strides=(1 if not downsample else 2), filters=filters, padding="same")(x) y = relu_bn(y) y = Conv2D(kernel_size=kernel_size, strides=1, filters=filters, padding="same")(y) if downsample: x = Conv2D(kernel_size=1, strides=2, filters=filters, padding="same")(x) out = Add()([x, y]) out = relu_bn(out) return outdef create_res_net(in_shape=(28, 28, 3)): inputs = Input(shape=in_shape) num_filters = 32 t = BatchNormalization()(inputs) t = Conv2D(kernel_size=3, strides=1, filters=num_filters, padding="same")(t) t = relu_bn(t) num_blocks_list = [2, 2] for i in range(len(num_blocks_list)): num_blocks = num_blocks_list[i] for j in range(num_blocks): t = residual_block(t, downsample=(j == 0 and i != 0), filters=num_filters) num_filters *= 2 t = AveragePooling2D(4)(t) t = Flatten()(t) t = Dense(128, activation="relu")(t) t = Dropout(0.5)(t) outputs = Dense(8, activation="softmax")(t) model = Model(inputs, outputs) model.compile( optimizer="adam", loss="sparse_categorical_crossentropy", metrics=["accuracy"]) return modeldef run_resnet(X_tr, y_tr, X_va, y_va, epochs=200, verbose=0): """Support function to train ResNet model""" # Create Model model = create_res_net(in_shape=X_tr.shape[1:]) # Creates 'EarlyStopping' callback from tensorflow import keras earlystopping_cb = keras.callbacks.EarlyStopping( patience=10, restore_best_weights=True) # Train model history = model.fit( X_tr, y_tr, batch_size=120, epochs=epochs, validation_data=(X_va, y_va), callbacks=[earlystopping_cb], verbose=verbose) return model, historydef plot_history(history): """Support function to plot model history""" # Plots neural network performance metrics for train and validation fig, axs = plt.subplots(1, 2, figsize=(15, 4)) results = pd.DataFrame(history.history) results[["accuracy", "val_accuracy"]].plot(ax=axs[0]) results[["loss", "val_loss"]].plot(ax=axs[1], logy=True) plt.tight_layout() plt.show()def plot_classification_report(X_te, y_te, model): """Support function to plot classification report""" # Show classification report from sklearn.metrics import classification_report y_pred = model.predict(X_te).argmax(axis=1) print(classification_report(y_te.ravel(), y_pred)) # Show confusion matrix from sklearn.metrics import ConfusionMatrixDisplay fig, ax = plt.subplots(1, 2, figsize=(16, 7)) ConfusionMatrixDisplay.from_predictions( y_te.ravel(), y_pred, ax=ax[0], colorbar=False, cmap="inferno_r") from sklearn.metrics import ConfusionMatrixDisplay ConfusionMatrixDisplay.from_predictions( y_te.ravel(), y_pred, normalize="true", ax=ax[1], values_format=".1f", colorbar=False, cmap="inferno_r")上一篇:小盘谷 小盘股
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |