Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何绘制SVC的培训数据和培训目标_Python_Numpy_Opencv_Matplotlib_Computer Vision - Fatal编程技术网

Python 如何绘制SVC的培训数据和培训目标

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

在加载图像并提取关键点后,我试图通过绘制数据来可视化数据。然而,当我试图分散它,在绘图之前,我得到的错误是我的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.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的大小必须相同