用TrackEval评测自己的数据集

news2025/1/18 16:50:38

TrackEval库虽然很专业,但是设置路径很麻烦,于是我自己基于TrackEval简单写了个对评测自己数据集更友好的,仅限2DMOT数据集,可以评测多类别。

项目地址(欢迎star!)https://github.com/JackWoo0831/Easier_To_Use_TrackEval

以下是使用说明:

Easier to use TrackEval

I. 仓库说明

鉴于TrackEval库写的略有些复杂, 可能对初学者不太友好, 因此我想
简单优化一下, 让评估自定义的数据集更加方便.

跑通代码最重要的就是路径问题, 为此我写了两个config模板, 让配置路径更简单.

仅支持2D MOT数据集

II. 使用方法

目录结构

一般MOT的数据集的目录结构可以分为两大类(如果有别的以后还会补充), 一个是像MOT Challenge这样的(例如: UAVDT)

# ${data_root}:
#    |
#    |___${train_folder_name}(Optional)
#          |
#          |____${seq_name}
#                     |_______${image_folder}
#                                    |____${frame_name}
#                     |_______${gt_folder_name}
#                                    |____${gt_txt_name}
#    |___${test_folder_name}(Optional)
#          |
#          |____${seq_name}
#                     |_______${image_folder}
#                                    |____${frame_name}
#                     |_______${gt_folder_name}   
#                                    |____${gt_txt_name}

例如, 如果我的MOT17数据集在/data/datasets/下, 其中的值就是:

data_root: /data/datasets/MOT17

train_folder_name: train, # 训练集文件夹名称
seq_name: MOT17-02-DPM, ..., MOT17-13-SDP,  # 序列名称
image_folder: img1,  # 存放序列帧图像文件夹的名称
frame_name: 000001.jpg, ..., 000600.jpg, ... ,  # 图片名称
gt_folder_name: gt  # 真值文件夹名称
gt_txt_name: gt.txt  # 真值文件的名称

test_folder_name: test
...同上

当然, 有的数据集没有划分训练集和测试集, 因此train_folder_name, train_folder_name也可以没有, 例如UAVDT数据集.

另一种是类似于yolo格式: (例如, Visdrone)

# ${data_root}:
#    |
#    |___${train_folder_name}(Optional)
#          |
#          |____${seq_folder_name}
#          |          |_______${seq_name}
#          |                         |____${frame_name}
#          |____${gt_folder_name}
#                     |____${gt_txt_name}
#    |___${test_folder_name}(Optional)
#          |
#          |____${seq_folder_name}
#          |          |_______${seq_name}
#          |                         |____${frame_name}
#          |____${gt_folder_name}
#                     |____${gt_txt_name}

例如, Visdrone的测试集目录结构如下(训练集测试集同理):
在这里插入图片描述

在该目录结构中, 真值文件夹和序列文件夹是平级的, 而不是包含在某个序列中. 因此对于Visdrone, 目录结构中的值如下:

data_root: /data/datasets/VisDrone

train_folder_name: VisDrone2019-MOT-train, # 训练集文件夹名称
seq_folder_name: sequences  # 存放序列的文件夹的名称
seq_name: uav0000013_00000_v, ...,  # 序列名称
frame_name: 0000002.jpg, ..., 00000200.jpg, ... ,  # 图片名称
gt_folder_name: annotations  # 真值文件夹名称
gt_txt_name: {seq_name}.txt  # 真值文件的名称, 与序列名称有关, 写成格式化字符串形式

test_folder_name: test
...同上

All you do is to fill in!

您只需按照以下步骤设置:

  1. 选择一个数据集的目录结构模板(configs/template1.yaml或者configs/template2.yaml), 然后按照您的数据集的文件夹名称填入gt_structure_config中对应的值,

注意, gt_loc_format需要谨慎检查, 它的意思是找到一个序列的真值txt的路径. 这是一个格式化的字符串, 里面的变量是gt_structure_config中的变量, 因此名称要保持一致. 如果您的数据集有轻微的差别, 也仅仅需要修改这个地方.

设置其他信息: 您的数据集对应的:

序列信息:

SEQ_INFO:
  序列名称: 序列长度

需要评测的类别名称:

CLASSES_TO_EVAL: 
  - 类别1
  - 类别2
  - ...

类别名称到类别id的映射关系:

CLASS_NAME_TO_CLASS_ID:
  类别名称: 类别id

有效类别(和CLASSES_TO_EVAL一致):

VALID_CLASS:
  - 类别1
  - 类别2
  - ...

设置干扰类别:
(这部分的作用是将跟踪结果中的这部分类别的结果扣去)

DISTRACTOR_CLASSES_NAMES:
  - 类别5
  - 类别6
  - ...
  1. 将您的跟踪结果放在本工程目录的./result下, 如果您要对比多个跟踪器的性能, 按照如下目录设置:
result
   |
   |____tracker1_name
              |
              |______{seq_name}.txt...
   |
   |____tracker2_name
              |
              |______{seq_name}.txt...

并将template.yaml中的has_tracker_name设置为True

如果不需要, 直接按照如下目录:

result
    |
    |______{seq_name}.txt...

并将template.yaml中的has_tracker_name设置为False

  1. 运行!

./run_custom.sh中命令的template_type参数设置一下, 随后

bash run_custom.sh

一个示例

下面用一个小demo来演示一下. 我随便选取了MOT17数据集中的一个txt文件, 作为真值, 同时作为我的模型的跟踪结果.

随后我放在/data/datasets/my_test_data下, 目录结构如下:

在这里插入图片描述

可以看出来, 这属于第二种模板. 同时, 我将跟踪结果放在当前目录./result/seq1.txt下.

为此, 我设置template2.yaml:

gt_structure_config: 
  data_root: '/data/datasets/my_test_data/'
  has_split: True
  train_or_test: test
  train_folder_name: train
  test_folder_name: test
  gt_folder_name: annotations
  gt_txt_name: '{seq_name}.txt'  # gt.txt, {seq_name}.txt, etc.
  gt_loc_format: '{data_root}/{split_name}/{gt_folder_name}/{gt_txt_name}' 

tracker_structure_config:
  trackers_folder: './result'
  has_split: False
  split_name: ''
  has_tracker_name: False
  trackers_to_eval:   # None for all


# other options
OUTPUT_FOLDER: './track_eval_output'   # Where to save eval results (if None  same as TRACKERS_FOLDER)

SEQ_INFO:  # seq_name: seq_length
  'seq1': 600

# CLASS configs
CLASSES_TO_EVAL: 
  - 'pedestrian'
  - 'person_on_vehicle'
  - 'car'

CLASS_NAME_TO_CLASS_ID:
  'pedestrian': 1
  'person_on_vehicle': 2
  'car': 3
  'bicycle': 4
  'motorbike': 5
  'non_mot_vehicle': 6
  'static_person': 7
  'distractor': 8
  'occluder': 9
  'occluder_on_ground': 10
  'occluder_full': 11
  'reflection': 12
  'crowd': 13

VALID_CLASS:
  'pedestrian': 1
  'person_on_vehicle': 2
  'car': 3

DISTRACTOR_CLASSES_NAMES:
  - 'person_on_vehicle'
  - 'static_person'
  - 'distractor'
  - 'reflection'

之后修改run_custom.sh:

template_type=2

python scripts/run_custom_dataset.py --config_path ./configs/template${template_type}.yaml

运行

bash run_custom.sh

运行结果:
在这里插入图片描述

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

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

相关文章

第三十天 Maven高级(分模块设计、继承、聚合、私服)

目录 Maven高级 1. 分模块设计与开发 1.1 介绍 1.2实践 1.3 总结 2. 继承与聚合 2.1 继承 2.2 聚合 2.3 继承与聚合对比 3. 私服 3.1 场景 3.2 介绍 3.3 资源上传与下载 Maven高级 Web开发讲解完毕之后,我们再来学习Maven高级。其实在前面的课程当中&am…

camunda如何处理流程待办任务

在 Camunda 中处理流程任务需要使用 Camunda 提供的 API 或者用户界面进行操作。以下是两种常用的处理流程任务的方式: 1、通过 Camunda 任务列表处理任务:在 Camunda 任务列表中,可以看到当前需要处理的任务,点击任务链接&#…

数据库基础篇 《2. MySQL环境搭建》

1. MySQL的卸载 步骤1:停止MySQL服务 在卸载之前,先停止 MySQL8.0 的服务。按键盘上的 “Ctrl Alt Delete” 组合键,打开 “ 任务管理器 ” 对话框,可以在“ 服务 ” 列表找到 “MySQL8.0” 的服务,如果现在 “ 正…

SAP 生产订单自定义订单状态

1、生产订单通常系统有一整套订单状态,做PP的各位同学都应该知道。 CRTD状态 REL已下达 CNF已报工 DLV已入库 TECO技术性完成 等等状态这里就不在罗列了,可以自行在生产订单中看到 2、这篇文章主要是在生产订单系统外,在自定义一套状态。这个…

Win10系统下,蓝牙开关不见了怎么办

自从更新了Win10系统后,不少驱动人生的用户反馈,Win10系统中蓝牙开关突然不见了,无法连接蓝牙设备。驱动人生就为大家带来Win10系统下,蓝牙开关不见的解决方法。 方法一:检查蓝牙设备驱动程序 首先,检查蓝…

手把手教你 YOLOv8 添加注意力机制 | 适用于【检测任务】【分类任务】【分割任务】【关键点任务】| 20+ 种全打通!

YOLOv8 添加注意力机制 ! 注意力机制介绍 注意力机制(Attention Mechanism)源于对人类视觉的研究。在认知科学中,由于信息处理的瓶颈,人类会选择性地关注所有信息的一部分,同时忽略其他可见的信息。为了合理利用有限的视觉信息处理资源,人类需要选择视觉区域中的特定部…

skyWalking自动建表-逻辑梳理

skyWalking自动建表-逻辑梳理 使用skyWalking后,发现我们不需要创建表,启动skywalking会自动创建表,遂研究官方源码,感觉oap-server设计的自动建表功能很强大,并进行逻辑梳理,仅供参考。 源码地址&#xff…

Guitar Pro8中文版如何下载?有哪些新功能

Guitar Pro是一款专业的吉他制谱软件,现在已更新至Guitar Pro8,新增了支持添加音频轨道、支持嵌套连音符、直观的效果器视图、让指法一目了然的音阶示意图等实用新功能。软件内有多种功能,方便用户使用乐谱,软件界面简洁&#xff…

Vue 模板语法

文章目录 Vue 模板语法插值文本Html属性表达式 指令参数修饰符 用户输入过滤器缩写v-bind 缩写v-on 缩写 Vue 实例构造器属性与方法 Vue 模板语法 Vue.js 使用了基于 HTML 的模版语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。 Vue.js 的核心是一个允…

『OPEN3D』1.7 Ray Casting

1 ray casting ray casting(光线衍射) 和 ray tracing(光线追踪)都属于计算机图形学内的基础方法;用于对三维的实体建模和图片渲染;ray casting一词来自于General Motors Research Labs from 1978–1980;出自论文《Ray Casting for Modeling …

软件测试金融项目经验总结,面试题都问什么?接口加解密如何处理?

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 加/解密接口的处理…

JAVA数据结构之顺序表、单向链表及双向链表的设计和API实现

一、顺序表 顺序表在内存中是数组的形式存储 类名SequenceList构造方法SequenceList(int capacity):创建容量为capacity的SequenceList对象成员方法1. public void clear():空置线性表 2. public boolean isEmpty():判断线性表是否为空&…

浅谈java网络编程及RPC框架

目录 1.计算机网络 2.TCP/IP协议 3.UDP协议 4.RPC框架 1.计算机网络 从资源共享的角度上来说,计算机网络就是以能够相互共享资源的方式互连起来的自治计算机系统的集合。网络建立的主要目的是实现计算机资源的共享。 目前来说,计算机网络分为两大模…

JRE和JDK 及 常用DOS命令

JRE和JDK Java程序开发的三个步骤 ●编写代码 ●编译代码 ●运行代码 1.编写代码 A.txt JRE : JRE是Java Runtime Environment缩写,指Java运行环境,包含JVM虚拟机及Java核心类库。 类:java文件在代码中的集合体现( 类java文件&#xf…

CAD转SHP最好的方法 赶快收藏起来吧

1、利用 ArcToolsbox 工具先将 DWG 文件转为 MDB 通过 CASS 软件生成的 DWG 文件,字段中包含有很多属性内容,所以我们先将 DWG 格式 的文件转换为 MDB 格式,再通过 MDB 转换为 SHP 格式数据进行整理。具体步骤如下: 通过 ArcTool…

jenkins——凭据管理

这里写目录标题 一、Jenkins 凭据管理1、凭据管理入口2、凭据的新增3、用户名和密码方式的凭据配置4、SSH密钥方式的凭据配置5、凭据的更新和删除6、凭据的使用 一、Jenkins 凭据管理 凭据管理的作用:管理ssh、邮箱、git等认证信息 1、凭据管理入口 Dashboard —…

深度学习实战24-人工智能(Pytorch)搭建transformer模型,真正跑通transformer模型,深刻了解transformer的架构

大家好,我是微学AI,今天给大家讲述一下人工智能(Pytorch)搭建transformer模型,手动搭建transformer模型,我们知道transformer模型是相对复杂的模型,它是一种利用自注意力机制进行序列建模的深度学习模型。相较于 RNN 和…

【微信小程序】数据监听器,纯数据字段

一、数据监听器 1.1 什么是数据监听器 数据监听器用于 监听和响应任何属性和数据字段的变化,从而执行特定的操作 。它的作用类似于 vue 中 的 watch 侦听器。在小程序组件中, 在componets中新建一个test2文件夹在文件夹里新建component 在app.json …

C学习笔记3

1、将一个整数转换成二进制形式,就是其原码。(通俗的理解,原码就是一个整数本来的二进制形式。) 例如short a 6;a 的原码就是0000 0000 0000 0110 2、反码就区分正负数,因为正负数的反码是不一样的,正数…

2023年MathorCup数模D题赛题解题思路

MathorCup俗称妈杯,是除了美赛国赛外参赛人数首屈一指的比赛,而我们的妈杯今天也如期开赛。今年的妈杯难度,至少在我看来应该是2023年截至目前来讲最难的一场比赛。问题的设置、背景的选取等各个方面都吐露着我要难死你们的想法。难度是恒定的…