智慧交通day02-车流量检测实现08:目标跟踪中的数据关联(将检测框bbox与卡尔曼滤波器的跟踪框进行关联匹配)

简介: 智慧交通day02-车流量检测实现08:目标跟踪中的数据关联(将检测框bbox与卡尔曼滤波器的跟踪框进行关联匹配)

20200508003307488.png


# 将YOLO模型的检测框和卡尔曼滤波的跟踪框进行匹配
def associate_detection_to_tracker(detections,trackers,iou_threshold=0.3):
    """
       将检测框bbox与卡尔曼滤波器的跟踪框进行关联匹配
       :param detections:检测框
       :param trackers:跟踪框,即跟踪目标
       :param iou_threshold:IOU阈值
       :return:跟踪成功目标的矩阵:matchs
               新增目标的矩阵:unmatched_detections
               跟踪失败即离开画面的目标矩阵:unmatched_trackers
    """
    #跟踪/检测为0时:直接构造返回结果
    if len(trackers) == 0 or (len(detections)==0):
        return np.empty((0,2),dtype=int),np.arange(len(detections)),np.empty((0,5),dtype=int)
    # 跟踪/检测不为0时:
    # iou 不支持数组计算,故IOU 逐个进行交并比计算,构造矩阵scipy.linear_assignment进行匹配
    iou_matrix = np.zeros((len(detections), len(trackers)), dtype=np.float32)
    # 遍历目标检测的bbox集合,每个检测框的标识为d
    for d,det in enumerate(detections):
        # 遍历跟踪框(卡尔曼滤波器预测)bbox集合,每个跟踪框标识为t
        for t,trk in enumerate(trackers):
            iou_matrix[d,t] = iou(det,trk)
    #通过匈牙利算法(linear_assignment)将跟踪框和检测框以[[d,t]...]的二维矩阵的形式存储在match_indices中
    result = linear_sum_assignment(-iou_matrix)
    #将匹配结果以 [[d,t]]的形式存储匹配结果
    matched_indices = np.array(list(zip(*result)))
    #记录未匹配的检测框及跟踪框
    #未匹配的检测框放入unmatched_detections中,表示有新的目标进入画面,要新增所要跟踪的目标序列
    unmatched_detecetions = []
    for d,det in enumerate(detections):
        if d not in matched_indices[:,0]:
            unmatched_detecetions.append(d)
    #未匹配的跟踪框放入unmatched_trackers中,表示目标离开之前的画面,应删除对应的跟踪器
    unmatched_tracker = []
    for t,trk in enumerate(trackers):
        if t not in matched_indices[:,1]:
            unmatched_tracker.append(t)
    #将匹配成功的跟踪框放入matches中进行存储
    matchs = []
    for m in matched_indices:
        # 过滤掉IOU低的匹配,将其放入到unmatched_detections和unmatched_trackers
        if iou_matrix[m[0],m[1]]<iou_threshold:
            unmatched_tracker.append([m[1]])
            unmatched_detecetions.append(m[0])
        else:
            matchs.append(m.reshape(1,2))
    #格式转换:初始化matchs,以np.array的形式返回
    if len(matchs) == 0 :
        matchs = np.array((0,2),dtype=int)
    else:
        matchs = np.concatenate(matchs, axis=0)
    return matchs,np.array(unmatched_detecetions,np.array(unmatched_detecetions))
目录
相关文章
|
存储 人工智能 Docker
Heygem:开源数字人克隆神器!1秒视频生成4K超高清AI形象,1080Ti显卡也能轻松跑
Heygem 是硅基智能推出的开源数字人模型,支持快速克隆形象和声音,30秒内完成克隆,60秒内生成4K超高清视频,适用于内容创作、直播、教育等场景。
4626 8
|
机器人 芯片
ChatGPT提问技巧——对话提示
ChatGPT提问技巧——对话提示
1265 8
|
监控 安全 数据安全/隐私保护
|
机器学习/深度学习 固态存储 计算机视觉
【YOLOv8改进】 RFB (Receptive Field Block):多分支卷积块
**RFB Net是针对目标检测的轻量级解决方案,它通过设计灵感来自人眼感受野的模块提升特征表示。RFB块包含多分支卷积,模拟不同尺度和偏心率,增强轻量模型如SSD的性能。在保持实时速度的同时,RFB Net在准确性上媲美深度检测器。代码可在GitHub找到。**
|
Linux 编译器 API
eBPF技术学习
eBPF技术学习
|
机器学习/深度学习 计算机视觉
YOLOv5改进 | 卷积模块 | 将Conv替换为轻量化的GSConv【原理 + 完整代码】
在这个教程中,作者介绍了如何将YOLOv5中的Conv模块替换为新型轻量级卷积GSConv,以实现模型瘦身并保持准确性。GSConv结合了分组卷积和空间卷积,减少了计算量。文章详细阐述了GSConv的原理,并提供了添加GSConv到YOLOv5的代码实现步骤。此外,还提到了Slim-neck by GSConv技术,它通过通道压缩和高效连接优化网络结构。读者可以获取完整代码进行实践,适用于资源受限的环境,如移动设备和实时应用。
|
缓存 算法 开发者
【Conan 入门教程 】了解 Conan2.1 中内置部署策略
【Conan 入门教程 】了解 Conan2.1 中内置部署策略
457 1
|
存储 缓存 算法
IM技术干货:假如你来设计微信的群聊,你该怎么设计?
微信背后的这个IM群聊系统到底是如何实现的呢?这个问题一直困扰着,于是我决定深入了解一下,看看微信的群聊系统背后的设计是怎样的。
669 1
|
消息中间件 分布式计算 资源调度
|
NoSQL Shell Go
在go中简单使用go-redis库
在go中简单使用go-redis库

热门文章

最新文章