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