- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在这一行有一个错误:neigh.fit(X, y):ValueError:使用序列设置数组元素。
我检查了拟合函数,X是:{类数组,稀疏矩阵,BallTree,cKDTree}我的 X 是一个列表列表,其中第一个元素的实体编号和第二个元素的幽默列表(7 个单元格)。如果我改变并且我只取第一个幽默数字来获得一个纯粹的列表列表报错:查询数据维度必须与 BallTree 数据维度匹配。
我的代码:
listafeaturevector = list()
path = 'imgknn/'
for infile in glob.glob( os.path.join(path, '*.jpg') ):
print("current file is: " + infile )
gray = cv2.imread(infile,0)
element = cv2.getStructuringElement(cv2.MORPH_CROSS,(6,6))
graydilate = cv2.erode(gray, element)
ret,thresh = cv2.threshold(graydilate,127,255,cv2.THRESH_BINARY_INV)
imgbnbin = thresh
#CONTOURS
contours, hierarchy = cv2.findContours(imgbnbin, cv2.RETR_TREE ,cv2.CHAIN_APPROX_SIMPLE)
print(len(contours))
for i in range (0, len(contours)):
fv = list() #1 feature vector
#HUMOMENTS
#print("humoments")
mom = cv2.moments(contours[i], 1)
Humoments = cv2.HuMoments(mom)
#print(Humoments)
fv.append(Humoments) #query data dimension must match BallTree data dimension
#SOLIDITY
area = cv2.contourArea(contours[i])
hull = cv2.convexHull(contours[i]) #ha tanti valori
hull_area = cv2.contourArea(hull)
solidity = float(area)/hull_area
fv.append(solidity)
#fv.append(elongation)
listafeaturevector.append(fv)
print("i have done")
print(len(listafeaturevector))
lenmatrice=len(listafeaturevector)
#KNN
X = listafeaturevector
y = [0,1,2,3]* (lenmatrice/4)
from sklearn.neighbors import KNeighborsClassifier
neigh = KNeighborsClassifier(n_neighbors=3)
neigh.fit(X, y) #ValueError: setting an array element with a sequence.
print(neigh.predict([[1.1]]))
print(neigh.predict_proba([[0.9]]))
如果我尝试将其隐藏在 numpy 数组中:
listafv = np.dstack(listafeaturevector)
listafv=np.rollaxis(listafv,-1)
print(listafv.shape)
data = listafv.reshape((lenmatrice, -1))
print(data.shape)
#KNN
X = 数据
我得到:用序列设置数组元素
最佳答案
一些建议/问题:
Humoments = cv2.HuMoments(mom)
返回值Humoments
的类是什么? float
还是 list
?如果 float
,那就没问题了。
for each image file
for i in range (0, len(contours)):
fv = list() #1 feature vector
...
fv.append(Humoments)
...
fv.append(solidity)
listafeaturevector.append(fv)
上面的代码看起来不正确。在你的问题中,我认为你需要为每个图像构造一个特征向量。因此,与图像i
相关的任何内容都应该进入相同的特征向量x_i
。然后,组合所有特征向量以获得特征向量X
列表。但是,您的 listafeaturevector
(或 X
)出现在最内层循环中,这显然不正确。
其次,您对轮廓中的元素数量有一个循环,您确定每个图像的元素数量保持相同吗?否则,不同图像的特征数量(|x_i|
)完全不同,可能会导致错误
setting an array element with a sequence.
第三,您清楚要如何对图像进行分类吗?不同图像的目标值/标签是什么?我看到您只是使用 [0,1,2,3]* (lenmatrice/4)
设置标签。您能详细说明一下您想对这些图像做什么吗?它们是否包含不同类型的对象?他们表现出不同的模式吗?这些图像是否描述了不同的主题/颜色?如果是,对于每种不同的类型,您给出不同的标签 - 0、1、2 或“红色”、“白色”、“黑色”(假设您只有 3 种类型)。标签的值并不重要。重要的是他们有多少值(value)观。我试图了解您的情况下标签
的区别。
另一方面,如果您只想检索相似的图像,则不需要使用分类器或为每个图像指定标签。相反,请尝试使用NearestNeighbors
。
print(neigh.predict([[1.1]]))
print(neigh.predict_proba([[0.9]]))
第四,上面两行测试不正确。您需要设置一个类似 X
的对象才能从分类器中获取预测。也就是说,您需要一个与您在训练示例中构造的结构相同的特征向量 x
(所有 h,e,s
的顺序相同)。
关于numpy - k 最近邻中的 ValueError : setting an array element with a sequence at fit(X, y),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14536686/
我是一名优秀的程序员,十分优秀!