scores[0][0] = dist_ske(track_proposals[0]['data'][-1][1], poses[0])
会得到一个分数经过循环之后,两行两列的二维数组就会填充了四个分数
分步解释一下这个过程:
-
scores[0][0] = dist_ske(track_proposals[0]['data'][-1][1], poses[0])
- 这行代码会计算
track_proposals[0]['data'][-1][1]
和poses[0]
之间的距离,并将结果赋值给scores[0][0]
。
- 这行代码会计算
-
然后你提到,通过循环,这个二维数组
scores
会被填充4个分数。-
假设
track_proposals
有2个元素,poses
也有2个元素。 -
那么整个过程会是这样的:
scores = [[0, 0], [0, 0]] # 第一次循环 scores[0][0] = dist_ske(track_proposals[0]['data'][-1][1], poses[0]) # 第二次循环 scores[0][1] = dist_ske(track_proposals[0]['data'][-1][1], poses[1]) # 第三次循环 scores[1][0] = dist_ske(track_proposals[1]['data'][-1][1], poses[0]) # 第四次循环 scores[1][1] = dist_ske(track_proposals[1]['data'][-1][1], poses[1])
-
所以,通过这样的循环操作,我们最终可以得到一个2x2的分数矩阵scores
,其中包含4个距离值。这些值可以用于进一步的处理和分析。
row, col = linear_sum_assignment(scores)
其中scores是上面2x2的分数矩阵
来解释一下这个 linear_sum_assignment()
函数的作用。
linear_sum_assignment()
是 SciPy 库中的一个函数,它实现了匈牙利算法(Hungarian Algorithm),用于解决最优分配问题。这个问题也被称为"指派问题"(Assignment Problem)。
在你给出的例子中,scores
是一个 2x2 的分数矩阵,表示不同 track_proposals
和 poses
之间的距离。我们希望找到一个最优的匹配方案,使得总的距离最小。
linear_sum_assignment()
函数的返回结果是两个列表:
row
: 表示最优匹配中track_proposals
的索引。col
: 表示最优匹配中poses
的索引。
也就是说,row[i]
和 col[i]
对应的就是最优匹配中第 i
个 track_proposal
和 pose
的索引。
例如,如果 row = [0, 1]
和 col = [1, 0]
,那么意味着:
track_proposals[0]
应该匹配到poses[1]
track_proposals[1]
应该匹配到poses[0]
这样的匹配方案可以使得总的距离和最小。
总之,linear_sum_assignment()
函数是一个非常有用的工具,可以帮助我们解决各种指派问题,找到最优的匹配方案。
for r, c in zip(row, col):
track_proposals[r]['data'].append((idx, poses[c]))
其中 row = [0, 1] 和 col = [1, 0]
根据之前的分析,我们知道 row = [0, 1]
和 col = [1, 0]
表示:
track_proposals[0]
应该匹配到poses[1]
track_proposals[1]
应该匹配到poses[0]
那么这段代码的作用就是:
for r, c in zip(row, col):
track_proposals[r]['data'].append((idx, poses[c]))
它遍历 row
和 col
列表,将每个匹配的 track_proposal
和 pose
添加到对应的 track_proposal
的 data
列表中。
具体来说:
-
第一次循环中:
r = 0
, 表示选择track_proposals[0]
c = 1
, 表示选择poses[1]
- 因此会将
(idx, poses[1])
添加到track_proposals[0]['data']
中
-
第二次循环中:
r = 1
, 表示选择track_proposals[1]
c = 0
, 表示选择poses[0]
- 因此会将
(idx, poses[0])
添加到track_proposals[1]['data']
中
所以,这段代码的作用就是根据 linear_sum_assignment()
的结果,将每个 track_proposal
与最优匹配的 pose
进行关联,并将这些信息添加到对应的 track_proposal
的 data
列表中。
if 2 > 2:
for j in range(2):
if j not in col:
num_tracks += 1
new_track = dict(data=[])
new_track['track_id'] = num_tracks
new_track['data'] = [(idx, poses[j])]
tracks.append(new_track)
-
if 2 > 2:
- 这个条件永远不会成立,因为
2
肯定不大于2
。 - 所以这个
if
语句内部的代码永远不会被执行。
- 这个条件永远不会成立,因为
pyskl/demo/demo_skeleton.py at main · kennymckormick/pyskl · GitHub