ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

使用sklearn PCA主成分分析对图像特征进行降维

2021-12-19 14:58:18  阅读:281  来源: 互联网

标签:pca resnet50 image 降维 path images import PCA sklearn


本文是利用Python K-means实现简单图像聚类的后续分析。

上文我们提到过,利用ResNet可以进行图像特征的抽取,进而帮助我们去进行聚类。但是其实这里面有个问题,拿resnet提取到的特征高达114688维,如果样本数量上去来的话,会变得非常耗时。

容易想到,那么多维特征,并不是每种特征都"有用",那么这个时候就可以对图像的特征进行一定的降维,这里我们使用PCA进行处理:

pca = PCA(n_components=10)
all_images = pca.fit_transform(all_images)

由于本文的例子里是对十张图像进行个二聚类,样本数总共就10,因此维数只能降到10及以下。但是呢,我们可以发现,哪怕是10维,效果也和原114688维差不多:
在这里插入图片描述
在这里插入图片描述
可以做到100%的分类准确率(足球&其他球)。实验证明,在维度大于6的情况下,性能都是高度可用的,这也侧面印证了视觉图像中存在大量的冗余信息。代码如下:

import os
import numpy as np
from sklearn.cluster import KMeans
import cv2
from imutils import build_montages
import torch.nn as nn
import torchvision.models as models
from PIL import Image
from sklearn.decomposition import PCA
from torchvision import transforms
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        resnet50 = models.resnet50(pretrained=True)
        self.resnet = nn.Sequential(resnet50.conv1,
                                    resnet50.bn1,
                                    resnet50.relu,
                                    resnet50.maxpool,
                                    resnet50.layer1,
                                    resnet50.layer2,
                                    resnet50.layer3,
                                    resnet50.layer4)

    def forward(self, x):
        x = self.resnet(x)
        return x

net = Net().eval()

image_path = []
all_images = []
images = os.listdir('./images')

for image_name in images:
    image_path.append('./images/' + image_name)
for path in image_path:
    image = Image.open(path).convert('RGB')
    image = transforms.Resize([224,244])(image)
    image = transforms.ToTensor()(image)
    image = image.unsqueeze(0)
    image = net(image)
    image = image.reshape(-1, )
    print(image.shape)
    all_images.append(image.detach().numpy())

print("starting pca")
pca = PCA(n_components=10)
all_images = pca.fit_transform(all_images)
print(pca.explained_variance_ratio_)
print("finish pca")
print(all_images)

clt = KMeans(n_clusters=2, random_state=1234)
clt.fit(all_images)
labelIDs = np.unique(clt.labels_)

for labelID in labelIDs:
	idxs = np.where(clt.labels_ == labelID)[0]
	idxs = np.random.choice(idxs, size=min(25, len(idxs)),
		replace=False)
	show_box = []
	for i in idxs:
		image = cv2.imread(image_path[i])
		image = cv2.resize(image, (96, 96))
		show_box.append(image)
	montage = build_montages(show_box, (96, 96), (5, 5))[0]

	title = "Type {}".format(labelID)
	cv2.imshow(title, montage)
	cv2.waitKey(0)

标签:pca,resnet50,image,降维,path,images,import,PCA,sklearn
来源: https://blog.csdn.net/qq_40714949/article/details/122000809

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有