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,这是程序运行后产生的文件夹,无法进一步打开
抱歉,我没有找到\Dancetrack\val\的由来,但我对您代码的改动仅限于yaml文件中DATA_ROOT: 后的D:/MOT_dataset/
我刚才执行了一遍您使用的同样代码,目前没能复现这个问题。
在如下代码处:
Line 215 in bac77ad
可否麻烦您输出一下
outputs_dir
和seq_name
这两个变量,然后把输出结果告诉我一下~分别是./outputs/dancetrack_trackers/submit\default\val\r50_deformable_detr_motip_dancetrack和DanceTrack\val\dancetrack0004
是seq_name的问题
问题就出现在seq_name
这个变量了,在我的机器上,该变量应该只为dancetrack0004
,也就是视频序列的名字。
如果你确定你的数据集文件树和我完全一致的话,我目前主要的考虑就是 windows 系统下的某些函数行为和 Linux 有区别。因为我手边并没有 windows 的环境,因此我可能无法去对这个问题作出修改。一个简单的方法是你直接截断这个变量,保留序列名即可。
你可以看一下这里:
Lines 239 to 240 in bac77ad
这里在我的 Linux 下返回的每一项是一个文件夹的名称,您这里返回的应该是
Dancetrack/val/<seq name>
。不对欸,怎么是datasetdir 指是D:/MOT_dataset/DanceTrack\val val
这个应该是对的,因为dataset_dir
是组合了data_root
、dataset
和data_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的文件目录要以双斜线\划分
Under the Windows system, this line:
Line 123 in bac77ad
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 系统环境进行测试,可能还要麻烦您有时间的话测试一下这个代码是否有效。
我已经测试过了,现在没有问题,可以成功运行。