分析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])

会得到一个分数经过循环之后,两行两列的二维数组就会填充了四个分数

分步解释一下这个过程:

  1. scores[0][0] = dist_ske(track_proposals[0]['data'][-1][1], poses[0])

    • 这行代码会计算track_proposals[0]['data'][-1][1]poses[0]之间的距离,并将结果赋值给scores[0][0]
  2. 然后你提到,通过循环,这个二维数组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() 函数的返回结果是两个列表:

  1. row: 表示最优匹配中 track_proposals 的索引。
  2. 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 列表中。

具体来说:

  1. 第一次循环中:

    • r = 0, 表示选择 track_proposals[0]
    • c = 1, 表示选择 poses[1]
    • 因此会将 (idx, poses[1]) 添加到 track_proposals[0]['data'] 中
  2. 第二次循环中:

    • 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)
  1. if 2 > 2:

    • 这个条件永远不会成立,因为 2 肯定不大于 2
    • 所以这个 if 语句内部的代码永远不会被执行。

pyskl/demo/demo_skeleton.py at main · kennymckormick/pyskl · GitHub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值