Python 如何绘制SVC的培训数据和培训目标
在加载图像并提取关键点后,我试图通过绘制数据来可视化数据。然而,当我试图分散它,在绘图之前,我得到的错误是我的x和y值应该是相同的大小 这是我从加载自己的数据集中得到的: 数据:Python 如何绘制SVC的培训数据和培训目标,python,numpy,opencv,matplotlib,computer-vision,Python,Numpy,Opencv,Matplotlib,Computer Vision,在加载图像并提取关键点后,我试图通过绘制数据来可视化数据。然而,当我试图分散它,在绘图之前,我得到的错误是我的x和y值应该是相同的大小 这是我从加载自己的数据集中得到的: 数据: [[0.06887255 0.06887255 0.06887255 ... 0.08921569 0.08921569 0.08921569] [0.06666667 0.06666667 0.06666667 ... 0.08823529 0.08823529 0.08823529] [0.07598039 0
[[0.06887255 0.06887255 0.06887255 ... 0.08921569 0.08921569 0.08921569]
[0.06666667 0.06666667 0.06666667 ... 0.08823529 0.08823529 0.08823529]
[0.07598039 0.07598039 0.07598039 ... 0.08848039 0.08848039 0.08848039]
...
[0.01568627 0.01568627 0.01568627 ... 0.1129902 0.1129902 0.1129902 ]
[0.01666667 0.01666667 0.01666667 ... 0.1129902 0.1129902 0.1129902 ]
[0.01666667 0.01666667 0.01666667 ... 0.1129902 0.1129902 0.1129902 ]]
目标:[0 0 0 1 1 1 2 2 2 2 3 3 3 3 4 4]
复制代码
import matplotlib.pyplot as plt
import numpy as np
import skimage
import cv2
from skimage.io import imread
from skimage.transform import resize
DATADIR = "C:/Dataset"
CATEGORIES = ["class 1", "class 2", "class 3", "class 4", "class 5"]
def load_image_files(fullpath, dimension=(35, 35)):
descr = "A image classification dataset"
flat_data = []
target = []
images = []
dimension=(64, 64)
for category in CATEGORIES:
path = os.path.join(DATADIR, category)
for person in os.listdir(path):
personfolder = os.path.join(path, person)
for imgname in os.listdir(personfolder):
class_num = CATEGORIES.index(category)
fullpath = os.path.join(personfolder, imgname)
imageList = skimage.io.imread(fullpath)
orb = cv2.ORB_create(edgeThreshold=1)
orb = cv2.ORB_create()
key_points = [cv2.KeyPoint(65, 9, 10), cv2.KeyPoint(66, 40, 10),cv2.KeyPoint(49, 200, 10), cv2.KeyPoint(76, 187, 10), cv2.KeyPoint(139, 188, 10), cv2.KeyPoint(176, 200, 10)]
kp, des = orb.compute(imageList, key_points)
kparray = cv2.drawKeypoints(imageList, kp, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
img_resized = resize(kparray, dimension, anti_aliasing=True, mode='reflect')
img_resized = img_resized.flatten()
flat_data.append(img_resized)
images.append(flat_data)
target.append(class_num)
flat_data = np.array(flat_data)
target = np.array(target)
images = np.array(images)
return Bunch(data=flat_data,
target=target,
target_names=CATEGORIES,
images=images,
DESCR=descr)
值得注意的是,在每个类中,都有一个John Doe文件夹,基本上是第1类/John Doe、第2类/John Doe、第3类/John Doe、第4类/John Doe、第5类/John Doe,每个文件夹中都有任何图像
我像这样加载图像:image\u dataset=load\u image\u filesC:\dataset
然后我试着简单地分散和绘制:
plt.scatter(image_dataset.data, image_dataset.target)
plt.show()
得到的错误是x和y应该是相同的大小
我想知道如何将我的数据x值调整为我的类值y值,因此这里plt.scatter需要在XY 2D平面上绘制的每个点的x和y值。每个点表示数据集中的一个样本。所以plt.scatter采用1D数组或列表来表示X和Y值
EX:
X = [1,2,3,4] , Y = [4,2,1,4]
Dot1 => 1,4
Dot2 => 2,2
.
.
.
在这里,您的image_dataset.data实际上是展平图像像素值的列表。这是一个二维数据,使用它来绘制散点图没有任何意义。另外,您正试图将其作为X轴坐标传递。我不明白你想用它来完成什么
如果您试图绘制图像并说明其类别,则应尝试使用plt.plot绘制子图。。。您可以找到文档
编辑1:
你可以试试:
image_dataset.target = [label for label in image_dataset.target
for i in range(image_dataset.data.shape[0])]
image_dataset.data = image_dataset.data.flatten()
在这里,我们首先将image.data从2D展平到1D。然后,我们根据像素数据的长度创建标签。因此,我们将第一幅图像中的每个像素标记为1
下面是一个简单的例子:
X = np.array([[1,2,3],[1,2,3],[1,2,3],[1,2,3]])
Y = np.array([1,1,2,2])
Y = [label for label in Y
for i in range(X.shape[1])]
X = X.flatten()
len(X)
>>12
len(Y)
>>12
但有一个问题,为什么要再次将数据展平?我在函数里面做这个,我在那部分感到困惑。我的函数基本上返回类别(应该是作为目标的标签)和数据,以便澄清,我从关键点提取特征并使用它进行分类。我试着运行你的代码,它给了我:indexer:tuple索引超出范围。注意我的代码的作用很重要:它在一幅图像上设置22个点,将它们的特征提取到一个22维的向量中,我想在这里加载它们进行分类。好吧,我可能会在这里用你的代码得出结论,因为变量的名称。你能告诉我什么是图像数据集及其形状吗?我假设image_dataset.data是一个由多个1D数组组成的2D数组。绝对没有问题。基本上,我得到了一个包含数组的字典,它由Bunchdata=flat\u data,target=target,target\u names=CATEGORIES,images=images,DESCR=DESCR返回。调整img_大小或image.append的实际形状为12288,。鉴于img_的大小在字典中。现在,>>实际的image_dataset.data.shape是2512288如果image_dataset.data.shape是2512288,则无法将其作为plt.scatter的X轴变量传递。image_dataset.data需要是1D,然后才能使用它绘制散点图。我用我的代码做了一个更改,你能再试一次吗?现在它给出的代码如下:ValueError:x和y的大小必须相同