当windows代码放linux执行的时候,由于缓存(cache)问题引起的文件路径无法正确识别的问题 的解决方法

Windows的文件路径是 \ ,而linux的文件路径是/

一、问题原因:windows的文件放在linux上运行,由于代码里的文件路径(windows路径)问题,导致找不到所对应的文件,故而报错。但是由于第一次加载文件时候其路径(windows路径)存入了缓存cache中,代码每次先找缓存,所以即使把文件加载的路径更正成linux的也无济于事(不知何种原因 缓存cache 不更新)。

解决办法是删除上一次的缓存cache文件,或者把 加载缓存cache 的代码 删除掉。


二、解决办法:1.删除掉缓存cache文件。

以yolov5为例子,缓存文件通常位于数据集目录下,命名为 <dataset_name>.cache,例如:
mydata/labels/train.cache  #训练的数据集的cache文件
mydata/labels/val.cache    #验证的数据集的cache文件
PS:mydata是我自己建立的文件夹和train.py 同一级目录。大家若想找到缓存文件只需要,找到调用的数据集的所在目录下,找到labels目录,注:labels是yolov5必须要求的路径!
笔者的完整路径:yolov5-5.0/mydata/labels/train.cache

2.注释掉加载缓存的代码

在yolov5-5.0/utils/datasets.py里面的 第404行 和 第405行 是 分别 加载训练集和验证集的cache 的代码

在这里插入图片描述


三、笔者的查找过程:
由于自己的电脑跑深度学习yolov5比较慢,所以准备拿服务器跑,
代码在windows电脑端 转移到 linux服务器的时候,由于路径问题,会产生以下报错:

在这里插入图片描述

原因是:Windows的路径是 \ ,而linux是/ 。于是我修改了mydata.yaml的配置文件。(mydata.yaml 里面有加载路径的代码)

在这里插入图片描述

但是修改之后,还是报错!

后来,我逐渐观察报错,发现了一个很好的解决代码问题的方法!
除了最后一行AssertionError: Inage Not Foud mydata\images\train\Bbaicheng1.png
上面这个代码报错逻辑是:
train.py 中     train(hyp,opt,device,tb_writer)                            line 552   调用
train.py中     在train定义函数中的for i, (imgs, targets, paths, _) in pbar:  line 287   再次调用
std.py 中      在 in_iter_定义的函数中的 for obj in iterable                  line 1181  再次调用
dataloader.py  中data = self. _next_data()                                 line 521   再次调用
...
...
...
以此类推
最后定位到datasets.py里面的 load_image line 635

以下都是datasets.py文件里的代码:
经过判断排除了 img==cv2.imread(path)的问题

在这里插入图片描述

初步判断是path的问题。


定位到self.img_files 生成的地方:(用一个 列表f 保存 文件夹 里 所有的文件名)

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

用print(self.img_files ) 发现生成的路径正常。【这里做了很多尝试,比如使用print函数,查看代码执行到了哪一行,后来得到是p.is_dir() 。再如,一开始以为是第375行 处理 列表f 的时候出现的问题,后来发现不是!】

于是再次回到 load_image 发现这里的self.img_files 和刚生成的self.img_files不一样,如下:

刚生成的self.img_files :

在这里插入图片描述

load_image里的self.img_files :

在这里插入图片描述

于是,基本判断 出错原因 是self.img_files 在中间的过程被修改了!
于是,再次经过寻找:(最终发现问题!)

在这里插入图片描述

原因是:我第一次 加载路径 的时候用的是windows的路径,便在本地(linux服务器)生成了缓存文件。每次加载,优先加载缓存。所以,我即使改了 正确的路径名 也不对!(但是有一点奇怪/离谱的是,windows可以 正确更正及加载cache,而linux无法及时更正cache,还是代码里的更正cache那块有一些问题,那块可能是windows和linux更正逻辑不太一样(possible)。)

另:这也是为什么 在探索问题的过程中,换了一个小的数据集就可以运行。一直以为可能是数据集大小的问题。其实是cache 的问题!


反思:其实刚看到AssertionError: Inage Not Foud mydata\images\train\Bbaicheng1.png 就应该判断是路径的问题!
(应该先找到上面报错的所在代码
方法:根据ctrl+f 和关键字 以及确定datasets.py文件 找到所在代码应该不难! )
因为可以观察以下代码:

在这里插入图片描述

从第363行可以知道 其报错的路径有问题,正常是 mydata/images/train/Bbaicheng1.png,而这里是 mydata\images\train\Bbaicheng1.png
进而不用管img==cv2.imread(path) 死盯 路径 即可快速解决。
此问题花费了2025.1.8 9.30-2025.1.9 2:00(笔记本都没电了!11点断电!要不少说也得 干到3点钟!)
2025 1.9 9.00-10:20 共计5h50min 解决!!!MD!!!(早上起床睁眼第一件事 继续干!)


ls mydata/labels/*.cache:

在这里插入图片描述

cache路径:yolov5-5.0/mydata/labels/train.cache

在这里插入图片描述

print(cache.keys()) # 查看缓存中的键(图像路径列表):

在这里插入图片描述

print(cache) # 查看完整的缓存内容

在这里插入图片描述

同时我也将cache文件下载了下来,但是用记事本打开是乱码,便没再继续研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值