9

OpenCVのKmeans実装を使用することを検討しています。これは、より高速であると言われているためです...

現在、パッケージcv2と関数kmeansを使用しています。

リファレンスのパラメータの説明を理解できません:

Python: cv2.kmeans(data, K, criteria, attempts, flags[, bestLabels[, centers]]) → retval, bestLabels, centers
samples – Floating-point matrix of input samples, one row per sample.
clusterCount – Number of clusters to split the set by.
labels – Input/output integer array that stores the cluster indices for every sample.
criteria – The algorithm termination criteria, that is, the maximum number of iterations and/or the desired accuracy. The accuracy is specified as criteria.epsilon. As soon as each of the cluster centers moves by less than criteria.epsilon on some iteration, the algorithm stops.
attempts – Flag to specify the number of times the algorithm is executed using different initial labelings. The algorithm returns the labels that yield the best compactness (see the last function parameter).
flags –
Flag that can take the following values:
KMEANS_RANDOM_CENTERS Select random initial centers in each attempt.
KMEANS_PP_CENTERS Use kmeans++ center initialization by Arthur and Vassilvitskii [Arthur2007].
KMEANS_USE_INITIAL_LABELS During the first (and possibly the only) attempt, use the user-supplied labels instead of computing them from the initial centers. For the second and further attempts, use the random or semi-random centers. Use one of KMEANS_*_CENTERS flag to specify the exact method.
centers – Output matrix of the cluster centers, one row per each cluster center.

議論flags[, bestLabels[, centers]])はどういう意味ですか?そして彼のものはどうですか:→ retval, bestLabels, centers

これが私のコードです:

import cv, cv2
import scipy.io
import numpy

# read data from .mat file
mat = scipy.io.loadmat('...')
keys = mat.keys()
values = mat.viewvalues()

data_1 = mat[keys[0]]
nRows = data_1.shape[1] 
nCols = data_1.shape[0]
samples = cv.CreateMat(nRows, nCols, cv.CV_32FC1)
labels = cv.CreateMat(nRows, 1, cv.CV_32SC1)
centers = cv.CreateMat(nRows, 100, cv.CV_32FC1)
#centers = numpy.

for i in range(0, nCols):
    for j in range(0, nRows):
        samples[j, i] = data_1[i, j]


cv2.kmeans(data_1.transpose,
                              100,
                              criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_MAX_ITER, 0.1, 10),
                              attempts=cv2.KMEANS_PP_CENTERS,
                              flags=cv2.KMEANS_PP_CENTERS,
)

そして、私はそのようなエラーに遭遇します:

flags=cv2.KMEANS_PP_CENTERS,
TypeError: <unknown> is not a numpy array

パラメータリストとcv2.kmeansの使用法をどのように理解する必要がありますか?ありがとう

4

2 に答える 2

21

この関数に関するドキュメントを見つけることはほとんど不可能です。次の Python コードを少し急いで書きましたが、私のマシンでは動作します。平均が異なる 2 つの多変量ガウス分布を生成し、cv2.kmeans() を使用してそれらを分類します。このブログ投稿を参照して、パラメーターの概要を理解してください。

インポートの処理:

import cv
import cv2
import numpy as np
import numpy.random as r

いくつかのランダムなポイントを生成し、それらを適切に形成します。

samples = cv.CreateMat(50, 2, cv.CV_32FC1)
random_points = r.multivariate_normal((100,100), np.array([[150,400],[150,150]]), size=(25))
random_points_2 = r.multivariate_normal((300,300), np.array([[150,400],[150,150]]), size=(25))   
samples_list = np.append(random_points, random_points_2).reshape(50,2)  
random_points_list = np.array(samples_list, np.float32) 
samples = cv.fromarray(random_points_list)

分類前後の点をプロットする:

blank_image = np.zeros((400,400,3))
blank_image_classified = np.zeros((400,400,3))

for point in random_points_list:
    cv2.circle(blank_image, (int(point[0]),int(point[1])), 1, (0,255,0),-1)

temp, classified_points, means = cv2.kmeans(data=np.asarray(samples), K=2, bestLabels=None,
criteria=(cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_MAX_ITER, 1, 10), attempts=1, 
flags=cv2.KMEANS_RANDOM_CENTERS)   #Let OpenCV choose random centers for the clusters

for point, allocation in zip(random_points_list, classified_points):
    if allocation == 0:
        color = (255,0,0)
    elif allocation == 1:
        color = (0,0,255)
    cv2.circle(blank_image_classified, (int(point[0]),int(point[1])), 1, color,-1)

cv2.imshow("Points", blank_image)
cv2.imshow("Points Classified", blank_image_classified)
cv2.waitKey()

ここでは、元のポイントを確認できます。

分類前のポイント

分類後のポイントは次のとおりです。 分類後のポイント

この回答が役に立てば幸いです。k-means の完全なガイドではありませんが、少なくともパラメータを OpenCV に渡す方法を示します。

于 2012-08-13T09:40:25.253 に答える
2

ここでの問題はdata_1.transpose、numpy 配列ではないことです。

numpy arrayOpenCV 2.3.1 以降の python バインディングは、画像/配列パラメーター以外は何も取りません。したがって、data_1.transposenumpy 配列でなければなりません。

一般に、OpenCV のすべてのポイントはタイプnumpy.ndarray

例えば。

array([[[100., 433.]],
       [[157., 377.]],
       .
       .  
       [[147., 247.]], dtype=float32)

配列の各要素は

array([[100., 433.]], dtype=float32)

その配列の要素は

array([100., 433.], dtype=float32)
于 2012-08-13T13:32:41.267 に答える