【问题标题】:How to density based clustering for speed trajectories in a video?如何对视频中的速度轨迹进行基于密度的聚类?
【发布时间】:2019-07-18 22:29:14
【问题描述】:

我在每一帧都有一个特征点的速度。在这里,我在视频中有 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()

我得到了以下结果。

Y轴是速度,x轴是帧数 我想根据速度进行基于密度的聚类。例如,在一个集群中速度高达 1.0,从 1 到 1.5 的速度作为异常值,在另一个集群中速度从 1.5 到 2.0,在另一个集群中速度超过 2.0。这有助于识别常见的运动模式类型。我该怎么做?

【问题讨论】:

    标签: python-3.x scikit-learn dbscan


    【解决方案1】:

    不要使用欧几里得距离。

    由于您的 x 和 y a 的含义非常不同,因此使用了错误的距离函数。

    您的情节具有误导性,因为轴的比例不同。如果您以相同的方式缩放 x 和 y,您就会明白发生了什么...... y 轴实际上被忽略了,您可以通过离散整数时间轴对数据进行切片。

    您可能需要使用Generalized DBSCAN,并将时间和价值分开处理!

    【讨论】:

    • 使用 Dbscan,我可以根据速度对视频帧(此处为 165)中的特征点进行聚类吗?
    • 是的,一次工作一帧可能是个好主意。只需拆分您的数据...
    • 我想在所有帧的一个集群中集群速度为 0.5 到 1.0。我从上周开始尝试。你能帮我写几行python代码吗?
    • 如果您已经知道间隔:根本不要集群。只需选择个速度在 0.5 到 1 之间的数据点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 2015-10-27
    • 2020-08-24
    • 2017-11-01
    • 2017-08-27
    • 2016-04-17
    • 2013-02-11
    相关资源
    最近更新 更多