0

この行にエラーがあります: neigh.fit(X, y) : ValueError: シーケンスで配列要素を設定しています。

私は適合関数をチェックし、X は次のとおりです。変更して、リストの純粋なリストを取得するために最初の数のみを取得すると、次のエラーが発生します。クエリ データの次元は、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 = データ

私が得た: シーケンスで配列要素を設定する

4

1 に答える 1

1

いくつかの提案/質問:

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) は最も内側のループに存在しますが、明らかに正しくありません。

次に、 の要素数に対してループがありcontoursます。各画像の要素数は同じままですか? そうしないと、特徴の数 ( |x_i|) が画像ごとにまったく異なり、次のエラーが発生する可能性があります。

setting an array element with a sequence.

第三に、画像をどのように分類したいか明確ですか? 異なる画像のターゲット値/ラベルは何ですか? でラベルを設定しているよう[0,1,2,3]* (lenmatrice/4)です。それらの画像で何をしようとしているのか詳しく説明していただけますか? 異なるタイプのオブジェクトが含まれていますか? 彼らは異なるパターンを示していますか?それらの画像は異なるトピック/色を説明していますか? はいの場合、異なるタイプごとに、0、1、2 または「赤」、「白」、「黒」のいずれかの異なるラベルを付けます (タイプが 3 つしかないと仮定します)。ラベルの値は重要ではありません。重要なのは、それらがいくつの値を持っているかです。あなたの場合の違いを理解しようとしていlabelsます。

一方、類似した画像のみを取得する場合は、分類子を使用したり、各画像にラベルを指定したりする必要はありません。代わりに、使用してみてくださいNearestNeighbors

print(neigh.predict([[1.1]]))
print(neigh.predict_proba([[0.9]]))

第 4 に、上記の 2 行のテストは正しくありません。X分類子から予測を取得するには、 のようなオブジェクトを設定する必要があります。つまりx、トレーニング例で構築したのと同じ構造を持つ特徴ベクトルが必要です (すべてh,e,s同じ順序で)。

于 2013-01-26T19:08:36.257 に答える