MCG-NJU/MOTIP

evaluate报错(Path truncation error under Windows system)

Closed this issue · 26 comments

在验证集上评估遇到了错误
已下载您提供的权重文件,并将其放置到指定位置
命令行:python main.py --mode submit --use-wandb False --config-path ./configs/r50_deformable_detr_motip_dancetrack.yaml --inference-model ./outputs/r50_deformable_detr_motip_dancetrack.pth --outputs-dir ./outputs/dancetrack_trackers/ --inference-dataset DanceTrack --inference-split val
另外在dancetrack对应的配置文件中,将DATA_ROOT:的地址修改为我这边具体的地址

报错:[Errno 2] No such file or directory: './outputs/dancetrack_trackers/submit\default\val\r50_deformable_detr_motip_dancetrack\tracker\MOT_dataset\DanceTrack\val\dancetrack0004.txt'

麻烦您看看是哪里的问题

请问一下这个报错的上下文信息可以多给一点儿吗?

Start >> Submit seq DanceTrack\val\dancetrack0004, 1203 frames ......
Traceback (most recent call last):
File "D:\program\MOTIP-main\main.py", line 185, in
main(config=update_config(config=cfg, option=opt))
File "D:\program\MOTIP-main\main.py", line 171, in main
submit(config=config, logger=logger)
File "D:\program\MOTIP-main\submit_engine.py", line 51, in submit
submit_one_epoch(
File "D:\env\anaconda\envs\shiro\Lib\site-packages\torch\utils_contextlib.py", line 115, in decorate_context
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "D:\program\MOTIP-main\submit_engine.py", line 83, in submit_one_epoch
submit_one_seq(
File "D:\env\anaconda\envs\shiro\Lib\site-packages\torch\utils_contextlib.py", line 115, in decorate_context
return func(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^
File "D:\program\MOTIP-main\submit_engine.py", line 216, in submit_one_seq
with open(result_file_path, "a") as file:
^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: './outputs/dancetrack_trackers/submit\default\val\r50_deformable_detr_motip_dancetrack\tracker\DanceTrack\val\dancetrack0004.txt'

我只在单卡上评估,所有把分布式相关的命令去掉了,会是这个的影响吗

按理说分布式指令应该不影响这个代码的正确性,你可否查看一下在运行这个程序报错之后,你是有./outputs/dancetrack_trackers/submit\default\val\r50_deformable_detr_motip_dancetrack\tracker\DanceTrack\val\这个文件夹呢?如果没有的话,最近的存在的父文件夹方便告诉我一下吗?

outputs/dancetrack_trackers/submit/default/val/r50_deformable_detr_motip_dancetrack/tracker,这是程序运行后产生的文件夹,无法进一步打开

很奇怪,按理来说,outputs/dancetrack_trackers/submit/default/val/r50_deformable_detr_motip_dancetrack/tracker文件夹就是最后一层文件夹,内部就应该直接包含了所有的 tracking results,该文件夹在这里被创建。并且根据代码,应该在此之后该路径没有被修改,直到你报错的前一行代码
你可否查看一下你代码中\DanceTrack\val\这一段文件名的来源呢?是否是这一行{seq_name}.txt出了问题?

抱歉,我没有找到\Dancetrack\val\的由来,但我对您代码的改动仅限于yaml文件中DATA_ROOT: 后的D:/MOT_dataset/

我刚才执行了一遍您使用的同样代码,目前没能复现这个问题。
在如下代码处:

result_file_path = os.path.join(outputs_dir, "tracker", f"{seq_name}.txt")

可否麻烦您输出一下outputs_dirseq_name这两个变量,然后把输出结果告诉我一下~

分别是./outputs/dancetrack_trackers/submit\default\val\r50_deformable_detr_motip_dancetrack和DanceTrack\val\dancetrack0004

是seq_name的问题

问题就出现在seq_name这个变量了,在我的机器上,该变量应该只为dancetrack0004,也就是视频序列的名字。
如果你确定你的数据集文件树和我完全一致的话,我目前主要的考虑就是 windows 系统下的某些函数行为和 Linux 有区别。因为我手边并没有 windows 的环境,因此我可能无法去对这个问题作出修改。一个简单的方法是你直接截断这个变量,保留序列名即可。

你可以看一下这里:

MOTIP/submit_engine.py

Lines 239 to 240 in bac77ad

dataset_dir = os.path.join(data_root, dataset, data_split)
return sorted(os.listdir(dataset_dir))

这里在我的 Linux 下返回的每一项是一个文件夹的名称,您这里返回的应该是Dancetrack/val/<seq name>

不对欸,怎么是datasetdir 指是D:/MOT_dataset/DanceTrack\val val

这个应该是对的,因为dataset_dir是组合了data_rootdatasetdata_split,但是os.listdir(dataset_dir)应该返回的是所有的序列文件夹的名称,例如dancetrack0004,而不应该是DanceTrack/val/dancetrack0004这样的文件夹形式。

get_seq_names我改好了,已经可以输出dancetrack0004这样的形式了,但仍然报错。好像还有别的地方也要改

噢噢,我自己创建了中间目录,已经可以运行了

谢谢您的耐心指导!

不用谢~

关于这里:

get_seq_names我改好了,已经可以输出dancetrack0004这样的形式了

是什么问题呀?是os.listdir(dataset_dir)的输出不符合预期吗?还是什么其他的问题。

是没有中间两级目录的问题,第215行,seqname已经被截掉了,但是它还是要去找有那两级目录(dancetrack/val)的地址
result_file_path = os.path.join(outputs_dir, "tracker", f"{seq_name}.txt")

另外我知道是什么引起这个问题了,确实是Linux和Win的区别
seq_name.split('/')[-1],win的文件目录要以双斜线\划分

懂了,是这里的问题:

seq_name = seq_dir.split("/")[-1]

在 Windows 系统中未能正确截断。如果之后有时间的话,我考虑在这里用一些更优美的实现吧。
也感谢你帮我找到了一个 BUG,哈哈。

Under the Windows system, this line:

seq_name = seq_dir.split("/")[-1]

may cause an unexpected cut-off for the sequence's path, resulting in FileNotFoundError: [Errno 2] No such file or directory during inference.
I will fix this bug in the future.

hh,主要是您耐心的帮助,不然我得花更多时间才能找到这个问题。谢谢您,我没有其他问题了,可以关闭这个issue啦。

没事儿,我之后修复这个问题之后,再关闭这个 issue。

我这边理论上修复了这个 BUG。但是由于我无法找到相应的 Windows 系统环境进行测试,可能还要麻烦您有时间的话测试一下这个代码是否有效。

我已经测试过了,现在没有问题,可以成功运行。

好的,感谢。那我就关闭这个 issue 了。


Thanks for the testing by @shirosy , the submit process now can be run on Windows systems.