Как сделать плотную кластеризацию для скоростных траекторий в видео? - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть скорость характерных точек в каждом кадре.Здесь у меня есть 165 кадров в видео, где каждый кадр содержит скорость характерных точек. Это мои данные.

TrajDbscanData

array([[  1.        ,   0.51935178],
       [  1.        ,   0.52063496],
       [  1.        ,   0.54598193],
       ...,
       [165.        ,   0.47198981],
       [165.        ,   2.2686042 ],
       [165.        ,   0.79044946]])

, где первый индекс - номер кадра, а второй - скорость характерной точки в этом кадре.

Здесь я хочу выполнить кластеризацию на основе плотности для другого диапазона скоростей.Для этого я использую следующий код.

import sklearn.cluster as sklc
core_samples, labels_db = sklc.dbscan(
    TrajDbscanData,  # array has to be (n_samples, n_features)
    eps=0.5,
    min_samples=15,
    metric='euclidean',
    algorithm='auto'
)
core_samples_mask = np.zeros_like(labels_db, dtype=bool)
core_samples_mask[core_samples] = True

unique_labels = set(labels_db)

n_clusters_ = len(unique_labels) - (1 if -1 in labels_db else 0)

colors = plt.cm.Spectral(np.linspace(0, 1, len(unique_labels)))
plt.figure(figcount)
figcount+=1
for k, col in zip(unique_labels, colors):
    if k == -1:
        # Black used for noise.
        col = 'k'

    class_member_mask = (labels_db == k)

    xy = TrajDbscanData[class_member_mask & core_samples_mask]
    plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=col, markeredgecolor='k', markersize=6)

    xy = TrajDbscanData[class_member_mask & ~core_samples_mask]
    plt.plot(xy[:, 0], xy[:, 1], 'x', markerfacecolor=col, markeredgecolor='k', markersize=4)

plt.rcParams["figure.figsize"] = (10,7)
plt.title('Estimated number of clusters: %d' % n_clusters_)
plt.grid(True)
plt.show()

Я получил следующий результат.

enter image description here

Ось Y - это скорость, а хось - номер кадра. Я хочу сделать кластеризацию на основе плотности в соответствии со скоростью.например, скорость до 1,0 в одном кластере, скорость от 1 до 1,5 как выброс, скорость от 1,5 до 2,0 в другом кластере и скорость выше 2,0 в другом кластере.Это помогает идентифицировать общие типы шаблонов движения.Как я могу это сделать?

1 Ответ

0 голосов
/ 27 февраля 2019

Не используйте евклидово расстояние.

Поскольку ваши x и y имеют очень разное значение, это неправильная функция расстояния, которую нужно использовать.

Ваш график вводит в заблуждение, потому что осиимеют разные масштабы.Если бы вы масштабировали x и y таким же образом, вы бы поняли, что происходит ... Ось y фактически игнорируется, и вы разбиваете данные по оси дискретного целого времени.

Возможно, вам потребуетсяиспользуйте Обобщенный DBSCAN и обрабатывайте время и значение отдельно!

...