在加载图像并提取其关键点之后,我试图通过绘制数据来可视化我的数据。但是,当我尝试将其散布时,在绘制之前,我会得到一个错误,我的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 0 0 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 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的文件夹,基本上它位于Class 1 / John Doe,Class 2 / John Doe,Class 3 / John Doe,Class 4 / John Doe,Class 5 / John美国能源部,每张照片都有。
我正在这样加载图像:image_dataset = load_image_files("C:\Dataset")
然后我尝试简单地散布和绘制:
plt.scatter(image_dataset.data, image_dataset.target)
plt.show()
解决了错误,指出x和y的大小应相同。
我想知道如何将数据(x值)调整为类值(y值)
答案 0 :(得分:1)
因此,这里plt.scatter()在XY 2D平面中绘制的每个点都需要X和Y值。每个点代表数据集中的一个样本。因此,plt.scatter()采用一维数组或X和Y值列表。
EX:
X = [1,2,3,4] , Y = [4,2,1,4]
Dot1 => 1,4
Dot2 => 2,2
.
.
.
这是您的image_dataset.data实际上是展平的图像像素值的列表。它是2D数据,使用它绘制散点图没有任何意义。另外,您尝试将其作为X轴坐标传递。我不明白您要达到的目的。
如果要绘制图像并声明其类,则应尝试使用plt.plot(..)绘制子图。您可以找到文档here。
编辑#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