Gmtracker_深度学习驱动的图匹配多目标跟踪项目启动与算法流程

news2024/9/24 15:28:58

Gmtracker深度学习驱动的图匹配多目标跟踪项目启动与算法流程

说明:对于Gmtracker多目标跟踪算法中涉及到的QP或者是QAP等一些有关图匹配的问题,不做过多的说明只提供源代码中通过图网络的具体实现细节。
对于配置环境时产生的报错的具体信息,因为没有报错的缘故只做简单的说明。

在这里插入图片描述

  • 论文题目:Learnable Graph Matching: Incorporating Graph Partitioning with Deep
    Feature Learning for Multiple Object Tracking

  • 官方代码地址: https://github.com/jiaweihe1996/GMTracker.git

在这里插入图片描述

环境配置

  1. 相比较于之前学习过的一些MOT算法,我大多数都没有使用论文官方提供的代码。

    • DeepSort:没有使用官方提供的TensorFlow版本,而是用的github中的Yolo v5 + Deepsort实现的

    • ByteTrack:也是选择使用的Yolo v8官方提供的代码来进行实现。

  2. 之前的环境安装较为简单对版本的要求并不是特别的高。而yolox + Gmtracker官方提供的代码,因为时间原因对版本和环境配置的要求高自己在配置环境的时候也是踩了许多的坑。

计算库配置

下面是官方所提供的前置环境要求。

Python == 3.6.X
PyTorch >= 1.4 with CUDA >=10.0 (tested on PyTorch 1.4.0)
torchvision
torch_geometric

  1. python的版本不能过高,自己在安装过程中发现采用高版本的python不支持官方要求的numpy==1.19.5的版本,即使勉强下载所有的计算环境也会报错

  2. scikit-learn库的版本要求不能过高,否则在代码里面会存在报错原因是0.23版本之后不在对一个util包进行支持了

  3. 如果使用pip进行安装的时候 cvxpy计算库和scs库两个计算库会存在版本冲突的问题。导致整合环境失败opencv或者是scs库(cpu)版下载卡住PE517…

  4. 安装时一定是使用conda进行下载,而且保证要有torch_geometric图计算库的支持。

自己对图计算资源库的下载是采用离线安装的形式,先安装的4个拓展的支持库,在进行安装的。

在这里插入图片描述

  1. 对于torch的安装尽量不要采用离线安装1.4.0的版本,我安装的是1.5.0的cpu版本。(conda安装

在这里插入图片描述

使用用服务器,在云服务器中使用conda环境 python = 3.6的版本环境.

pip install -r requirements.txt

在这里插入图片描述

在网上查找资料:opencv安装失败卡在这里是因为没有使用高版本的python环境

在这里插入图片描述

切换环境继续进行安装 python =3.7

在这里插入图片描述

换高于3.6版本的安装存在问题报错

网上解决方法:

pip install lxml

但还是安装失败。导致GMtracker启动失败。

项目启动

首先在你确保环境安装成功之后要下载MOT17的数据集安装官方提供的格式进行解压。

— data
— MOT17
— train
— MOT17-02
— MOT17-04

— test
— MOT17-01
— MOT17-03

在这里插入图片描述
官方提供给你的npy文件进行解压

在这里插入图片描述

在数据进行预处理加载的过程中会产生一个类型错误需要进行改正之后的就可以启动成功了

gmtracker_app.py的启动参数

--sequence_dir
data/MOT17/test/MOT17-01-DPM
--detection_file
npy/npytest_tracktor/MOT17-01-DPM.npy
--checkpoint_dir
experiments/static/params/0001
--max_age
100
--reid_thr
0.6
--output_file
results/test/MOT17-01-DPM.txt
# 注意修改多了一个参数
    (cc, warp_matrix) = cv2.findTransformECC (src, dst, warp_matrix, warp_mode, criteria, None)

在这里插入图片描述

执行完成之后会显示一个txt文件,用于下一步的显示视频效果的操作

show_result.py文件的启动参数。

--sequence_dir
data/MOT17/test/MOT17-01-DPM
--result_file
results/test/MOT17-01-DPM.txt
--output_file
/show/MOT17-01-DPM.avi

在启动的时候需要自己断点调试,去除注释的部分代码,才能显示视频效果,视频的保存还可能存在部分的问题

在这里插入图片描述

算法执行流程

在自己看完代码之后发现整个gmtracker_app.py跟踪算法的执行过程,于DeepSort有很大的相似之处

  • 两个阶段的匹配。
  • 特征的保存与添加确认态的状态。
  • 将级联匹配转换为深度图网络的二阶相似度匹配的问题

下面是我经过断点调试分析之后绘制的算法流程图,简单的说明算法的执行过程

核心的启动函数:

    def frame_callback(frame_idx): #执行跟踪的核心函数
        print("Processing %s"%seq_info["sequence_name"], "frame %05d" %frame_idx)

        # Load image and generate detections.(创建跟踪对象)
        detections = create_detections(
            seq_info["detections"], frame_idx, w_img=seq_info["image_size"][1],h_img=seq_info["image_size"][0])
        
        # Update tracker.
        tracker.predict(warp_matrix[frame_idx-2]) #执行卡尔曼滤波的预测
        tracker.update(detections, seq_info["sequence_name"], frame_idx, checkpoint_dir) #卡尔曼滤波的更新和匹配

        # Store results.
        for track in tracker.tracks:
            if track.time_since_update >= 1:
                continue
            bbox = track.to_tlwh2()
            results.append([ # 添加4个点的坐标位置信息连同跟踪器的id进行存储
                frame_idx, track.track_id, bbox[0], bbox[1], bbox[2], bbox[3]])

    # Run tracker.
    frame_idx = seq_info["min_frame_idx"]
    while frame_idx <= seq_info["max_frame_idx"]:
        frame_callback(frame_idx)
        frame_idx += 1

在这里插入图片描述
在这里插入图片描述

    def _match(self, detections,video,frame,checkpoint_dir):

        confirmed_tracks = [
            i for i, t in enumerate(self.tracks) if t.is_confirmed()]

        unconfirmed_tracks = [
            i for i, t in enumerate(self.tracks) if not t.is_confirmed()]
 
        matches_a, unmatched_tracks_a, unmatched_detections = \
            assignment.graph_matching( # Gmtracker执行图匹配的操作
                self.max_age, self.tracks, detections, confirmed_tracks,reid_thr=self.reid_thr,seq_name=video,ckp_dir=checkpoint_dir)
   
        iou_track_candidates = unconfirmed_tracks + [
            k for k in unmatched_tracks_a if
            self.tracks[k].time_since_update == 1]
   
        unmatched_tracks_a = [
            k for k in unmatched_tracks_a if
            self.tracks[k].time_since_update != 1]
        # 没匹配到的检测框进行第二次最小cost的级联匹配
        matches_b, unmatched_tracks_b, unmatched_detections = \
            assignment.min_cost_matching(
                iou_matching.iou_cost, self.max_iou_distance, self.tracks,
                detections, iou_track_candidates, unmatched_detections)
        # 返回第二次的匹配结果之后将结果相加
        matches = matches_a + matches_b

        unmatched_tracks = list(set(unmatched_tracks_a + unmatched_tracks_b))

        return matches, unmatched_tracks, unmatched_detections

在这里插入图片描述
涉及论文公式的最难的一个部分,个人不太理解

def quadratic_matching(
        tracks, detections, track_indices=None,
        detection_indices=None,reid_thr=0.8,seq_name=None,ckp_dir=None):

    if track_indices is None:
        track_indices = np.arange(len(tracks))
    if detection_indices is None:
        detection_indices = np.arange(len(detections))

    if len(detection_indices) == 0 or len(track_indices) == 0:
        return [], track_indices, detection_indices  # Nothing to match.
    
    dets = np.array([detections[i].feature for i in detection_indices]) # 检测
    tras = np.array([tracks[i].mov_ave for i in track_indices]) # 跟踪
    tra = torch.Tensor(tras) # 转为tensor张量
    det = torch.Tensor(dets)
    det_geos = np.array([[detections[i].tlwh[0],detections[i].tlwh[1],detections[i].tlwh[2]+detections[i].tlwh[0],detections[i].tlwh[3]+detections[i].tlwh[1]] for i in detection_indices])# 计算检测对象的4个坐标
    det_geo = torch.Tensor(det_geos)

    tra_means = np.array([[to_tlwh(tracks[i].mean[0:4])[0],to_tlwh(tracks[i].mean[0:4])[1],to_tlwh(tracks[i].mean[0:4])[0]+to_tlwh(tracks[i].mean[0:4])[2],to_tlwh(tracks[i].mean[0:4])[1]+to_tlwh(tracks[i].mean[0:4])[3]] for i in track_indices]) #计算跟踪对象的平均边界框(Bounding Box)的坐标
    tra_geo = torch.Tensor(tra_means)
    iou = torchvision.ops.box_iou(tra_geo,det_geo) # 计算两种边界框的Iou
    data1 = tra # 追踪器框的坐标
    data2 = det # 检测器框的坐标
    kf_gate = gate( # 该函数用于计算卡尔曼滤波门限。这个门限用于评估跟踪对象和检测对象之间的匹配可能性
            kalman_filter.KalmanFilter(), tracks, detections, track_indices,
            detection_indices)
    _, _, start_src, end_src = gh(data1.shape[0])
    _, _, start_tgt, end_tgt = gh(data2.shape[0])
    data1 = data1.t().unsqueeze(0) # 转置并拓展维度
    data2 = data2.t().unsqueeze(0)
    start_src = torch.tensor(start_src)
    end_src = torch.tensor(end_src)
    start_tgt = torch.tensor(start_tgt)
    end_tgt = torch.tensor(end_tgt)  # 上面是生成匹配矩阵的过程

    with torch.no_grad():
        graphnet = GraphNet() # 创建一个图网络
        params_path = os.path.join(ckp_dir, f"params.pt") # 读取预训练的图网络模型
        graphnet.load_state_dict(torch.load(params_path), strict=False) # 加载模型参数值
        if iou.shape[0] >= iou.shape[1]: # .forward输入到图网络进行图匹配
            indices, thr_flag = graphnet.forward(data1, data2, kf_gate, reid_thr, iou, start_src, end_src, start_tgt, end_tgt, seq_name, inverse_flag=False)
        if iou.shape[0] < iou.shape[1]:
            indices, thr_flag = graphnet.forward(data2, data1, kf_gate.T, reid_thr, iou.t(), start_tgt, end_tgt, start_src, end_src, seq_name, inverse_flag=True)

    # Gmtracker算法的核心部分(使用深度图网络进行匹配的过程)
    matches, unmatched_tracks, unmatched_detections = [], [], []
    for col, detection_idx in enumerate(detection_indices):
        if col not in indices[:, 1]:
            unmatched_detections.append(detection_idx)
    for row, track_idx in enumerate(track_indices):
        if row not in indices[:, 0]:
            unmatched_tracks.append(track_idx)
    for row, col in indices:
        track_idx = track_indices[row]
        detection_idx = detection_indices[col]
        
        if thr_flag[row, col] == 1:
            unmatched_tracks.append(track_idx)
            unmatched_detections.append(detection_idx)
        else:  
            matches.append((track_idx, detection_idx))
    return matches, unmatched_tracks, unmatched_detections

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2121769.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity Apple Vision Pro 开发(八):模型分离与组装

XR 开发者社区链接&#xff1a; SpatialXR社区&#xff1a;完整课程、项目下载、项目孵化宣发、答疑、投融资、专属圈子 课程试看&#xff1a;https://www.bilibili.com/video/BV11b421E74g 课程完整版&#xff0c;答疑仅社区成员可见&#xff0c;可以通过文章开头的链接加入…

调度算法及其性能指标

一、调度算法的评价指标 1.CPU利用率 由于早期的CPU造价极其昂贵&#xff0c;因此人们会希望让CPU尽可能多地工作 CPU利用率:指CPU“忙碌”的时间占总时间的比例。 利用率忙碌的时间/总时间 Eg: 某计算机只支持单道程序&#xff0c;某个作业刚开始需要在CPU上运行5秒&a…

python画图|极坐标中画散点图

python极坐标画图时&#xff0c;不仅可以画实线图&#xff0c;也可以画散点图。 实线图画法如下述链接。 python画图|极坐标画图基础教程-CSDN博客 今天我们一起学习一下散点图画法。 【1】官网教程 首先依然是导航到官网&#xff0c;乖乖学习官网教程&#xff1a; Scatt…

产品3D交互展示是什么?3D可视化有什么优势?

产品3D交互展示是一种通过互联网平台&#xff0c;利用3D技术对产品进行全方位、多角度展示的方式。它允许用户通过旋转、缩放、移动等操作&#xff0c;以更直观、更互动的方式了解产品的外观、结构和细节。这种展示方式不仅提升了用户的参与感和体验感&#xff0c;还增强了产品…

【触想智能】工业一体机在物流领域上的四大应用分析

随着物流业的快速发展&#xff0c;工业一体机在物流领域上的应用越来越普遍。工业一体机是一种高级智能设备&#xff0c;是多种技术的综合应用&#xff0c;包括机械、电子、计算机、通讯等。 在物流行业中&#xff0c;工业一体机可以发挥其先进的技术和功能&#xff0c;提高物流…

重磅资源来袭。快看看有没有你要的那一款!

Java 相关的技能主要包括以下几个方面‌&#xff1a; 资源在末尾 ‌Java编程语言基础‌&#xff1a;这是Java开发的基础&#xff0c;包括熟悉Java的语法、数据类型、控制结构、异常处理、面向对象编程&#xff08;OOP&#xff09;等基本概念。‌Java EE和Spring框架‌&#x…

【算法】模拟退火

一、引言 模拟退火算法&#xff08;Simulated Annealing, SA&#xff09;是一种启发式搜索算法&#xff0c;它通过模拟物理中的退火过程来解决优化问题。这种算法能够跳出局部最优解&#xff0c;寻找全局最优解&#xff0c;特别适用于解决复杂的优化问题。 二、算法原理 模拟退…

NS4263 3.0Wx2 双声道 AB/D 类双模音频功率放大器附加耳机模式

1 特性 ● 工作电压范围:3.0V-5.25V ● AB 类和 D类工作模式切换 ● 一线脉冲控制工作模式与关断模式 ● 内置立体声耳机输出功能 ● 输出功率 3WClass D/Load4ohm ● THDN0.1%VDD5V/Po1W ● 优异的全带宽 EMI抑制能力 ● 优异的“上电和掉电”噪声抑制 ● 内置过流保护、欠压保…

PMP证书可不可以挂靠?看看考过的人怎么说

或许我们经常听到人们说可以把律师证、注册会计师证等挂靠在单位&#xff0c;从而每年获得额外收入。但是需要说明的是&#xff0c;PMP证书并不适用于挂靠这种情况。因为PMP并不属于我国体制内的职业资格证书&#xff0c;企业升级资质也不需要使用PMP证书&#xff0c;所以PMP是…

unity导入半透明webm + AE合成半透明视频

有些webm的文件导入unity后无法正常播报&#xff0c;踩坑好久才知道需要webm中的&#xff1a;VP8 标准 现在手上有几条mp4双通道的视频&#xff0c;当然unity中有插件是可以支持这种视频的&#xff0c;为了省事和代码洁癖&#xff0c;毅然决然要webm走到黑。 mp4导入AE合成半透…

如何使用dcmtk将dcm数据集中信息输出到可读文件

1. 缘起 在生成RDSR报告时候&#xff0c;代码中已经将患者的一些信息写入到dcm数据集中&#xff0c;但是最后保存的文件中没有这些值&#xff0c;因此需要将过程中的数据集信息打印出来&#xff0c;看是在什么地方出现问题了。 2. 将数据值保存到文件 std::unique_ptr<Dc…

“月薪3w,被人工智能玩弄。“

自从有了萝卜快跑无人驾驶车&#xff0c;一天天的都要被这些梗笑死&#xff1a; 萝卜快跑的萝卜&#xff0c;是指的乘客我吧&#xff1f;&#xff1f;&#xff1f; 15公里的路程&#xff0c;乘客自己追了14公里&#xff0c;还停在路中央让乘客上车哈哈哈哈&#xff01; 好消…

MATLAB求解微分方程和微分方程组的详细分析

目录 引言 微分方程的定义 MATLAB求解常微分方程 参数分析&#xff1a; MATLAB求解偏微分方程 刚性和非刚性问题 总结 引言 微分方程在物理、工程、经济和生物等多个领域有着广泛的应用。它们用于描述系统中变量与其导数之间的关系&#xff0c;通过这些方程可以解释和预…

如何通过可视化大屏,打通智慧城市建设的“最后一公里”?

在智慧城市的宏伟蓝图中&#xff0c;技术的融合与创新是推动城市发展的关键力量。然而&#xff0c;真正的挑战在于如何将这些技术成果转化为市民的实际体验&#xff0c;实现智慧城市建设的“最后一公里”。可视化大屏&#xff0c;作为连接技术与市民的桥梁&#xff0c;正以其独…

【吉利汽车安全应急响应中心-登录/注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

ssl证书过期怎么解决

SSL证书过期的解决方案主要是及时续费或更换新的SSL证书重新部署。rak小编为您整理发布具体解决方法。 当SSL证书即将过期时&#xff0c;最有效的方法是提前进行续费。 在证书到期前办理续费可以确保服务的连续性&#xff0c;并避免因证书失效而引发的网站访问问题。一旦续费完…

如何在HTML中实现m3u8视频播放:多种解决方案大比拼

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 HTML & M3U8 📒📝 HTML 播放 m3u8 的方式1. Video.js2. hls.js3. DPlayer📝 优缺点对比📝 使用建议📝 常见问题及解决方案⚓ 相关链接 ⚓📖 介绍 📖 在网页上播放 m3u8 格式的视频已经成为主流,尤其是在直播…

AI制药领域的中英文对照表

AI制药&#xff08;AIDD&#xff09;是指利用AI技术在药物研发、药物设计、药物筛选、临床试验和药物生产等各个环节中应用的制 药领域。AI在药物研发中可以通过数据挖掘、机器学习和深度学习等技术&#xff0c;加速药物发现和设计过程&#xff0c;提高研发 效率和成功率。AI还…

常见分组加密算法的整体结构

常见分组加密算法的整体结构 0x1 两分支平衡Feistel结构(典型) S(i)为Feistel结构密码的第i1轮中间输入状态&#xff0c;S(i1)为第i1轮中间输出状态。则其轮函数为 0x2 四分支非平衡Feistel结构(非典型) S(i)为四分支非平衡Feistel结构密码的第i1轮中间输入状态&#xff0c;…

【linux005】目录操作命令篇 - pstree 命令

文章目录 1、基本用法2、常见选项3、举例4、注意事项 pstree 命令在 Linux 中用于以树状结构显示进程及其子进程的层次结构。它提供了一种直观的方式来查看进程的父子关系&#xff0c;与 ps 命令的线性输出相比&#xff0c; pstree 更容易理解进程的继承关系 1、基本用法 ps…