TensorFlow生成tf.record文件触发NotFoundError找不到文件错误如何解决
问题根本原因
generate_tfrecord.py 脚本的xml_to_csv函数是从每个XML标注文件内部的<filename>标签读取图片文件名,并不是通过XML文件本身的文件名匹配对应图片。你给图片和XML文件追加了唯一标识后缀,但XML内部的<filename>字段还是修改前的旧文件名DJI_0001_008.jpg,脚本按这个不存在的旧文件名查找图片,自然触发找不到文件的报错。
修复方案
你可以任选以下任意一种方法修复:
方法1:批量更新XML内部的filename字段(推荐,无需修改官方脚本)
运行以下小批量处理脚本,自动把所有XML内部的filename替换为对应图片的实际文件名,train和test目录分别执行一次即可:import os import xml.etree.ElementTree as ET # 替换为你自己的XML文件存放目录,train和test分别修改路径跑一次 xml_dir = "/home/tensorflow_ihb/Custom-Object-Detector-Workspace/Project/images/test" for xml_file in os.listdir(xml_dir): if not xml_file.endswith(".xml"): continue # 生成对应图片名:XML文件名去掉.xml后缀,替换为图片后缀 img_name = xml_file.rsplit(".", 1)[0] + ".jpg" # 修改XML内部filename字段 xml_path = os.path.join(xml_dir, xml_file) tree = ET.parse(xml_path) root = tree.getroot() root.find("filename").text = img_name tree.write(xml_path)方法2:修改generate_tfrecord.py的读取逻辑
找到脚本xml_to_csv函数里读取filename的行,把原本读XML内部字段的逻辑,替换为直接用当前XML文件名推导图片名:# 原代码行 value = (root.find('filename').text, # 替换为以下代码 value = (os.path.basename(xml_file).rsplit('.',1)[0] + '.jpg',后缀大小写问题额外处理
Ubuntu系统是大小写敏感的,.jpg和.JPG会被识别为不同的文件,你可以提前把所有图片后缀统一改为小写.jpg,避免后续触发同类报错。
相关疑问解答
- 是否属于命名错误?
属于标注数据和实际文件的一致性错误,不是文件本身的命名规则有问题。 - 是否需要重命名文件移除文件名中的DJI_0001_008字符?
完全不需要,只要保证XML内部的filename字段和实际图片文件名一致即可。 - 大小写差异是否是触发本次错误的原因?
本次报错不是这个原因,但如果存在后缀大小写不一致的情况,后续必然会触发同类NotFoundError,建议提前统一后缀格式。
内容的提问来源于stack exchange,提问作者sneeze_shiny
相关产品推荐
相关产品推荐

