解决使用FCN网络训练ADEChallengeData2016数据集缺少MITSceneParsing.pickle文件产生的异常

解决使用FCN网络训练ADEChallengeData2016数据集缺少MITSceneParsing.pickle文件的异常

    • 划重点,问题解决总结:

最近想要使用FCN网络进行语义分割项目的学习,恰巧在网上看到ADEChallengeData2016数据集有完备的代码、数据集以及预训练参数,不由得暗自庆幸,修改完成一些参数,运行之后发现系统总是提示下图类似的异常。
解决使用FCN网络训练ADEChallengeData2016数据集缺少MITSceneParsing.pickle文件产生的异常_第1张图片
根据这个异常结果,我大概猜测就是说根据给定的路径找不到Annotation(标注)数据集。后来看帖子说缺少一个名叫**【MITSceneParsing.pickle】**的文件,经过千辛万苦的资源寻找,终于白嫖到了该文件并下载到了指定路径,代码终于运行正常,开始了我的FCN之旅,真香。

先来简单说一下我对【MITSceneParsing.pickle】文件的理解:为了快速、正确读取训练集数据以提升代码效率,作者先将所有数据的全路径以字典的形式存储在pickle(代码里用到了python序列化【即转换为二进制数据】)这个二进制文件中。

但随着对代码的深入了解,觉得事情并不简单,在read_MITSceneParsingData.py脚本文件中,我发现其实当代码在检测到本地不存在【MITSceneParsing.pickle】文件时,本应自动生成,详见read_MITSceneParsingData.py脚本文件中的,create_image_lists(image_dir)函数,但种种迹象表明该函数并未成功运行。接下来便进入了盘根问底拦不住栏目,我单独拿出该函数进行调试。其中某一annotation_file局部变量值如下图所示:
调试过程中显示的annotation_file局部变量值
咦!我的标签文件全路径不应该是:
‘……\annotations\training\Water_train_1.png’
谁把中间的annotations改成了images,我猜应该是上面的代码出了差错。
在进一步的调试中我又发现下图代码块中的filename值本应该为某一个不包含扩展名的文件名如【ADE_train_00000001】

if not file_list:  # 文件为空
    print('No files found')
else:
    for f in file_list:  # 扫描文件列表   这里f对应文件全路径
        # 获取图片名字
        filename = os.path.splitext(f.split("/")[-1])[0]

但经过几番调试我的filename值总是为不包含扩展名的全路径(下图所示)
调试过程中显示的filename局部变量值
所以问题肯定出在下面这个代码上

filename = os.path.splitext(f.split("/")[-1])[0]

按照它的思路,直观来看应该没毛病啊,我先说一下我对该行代码的理解

f.split("/")[-1]

即:使用“/”字符拆分全路径,获取最后一个目录中的文件名。

os.path.splitext(*.txt)[0] 

即:去除*.txt文件的扩展名.txt,获取文件名*。

忽然当我看到debug的参数值我恍然大悟,编译后的代码中将子目录用“\”符号分隔开而不是“/”符号,果断将”/“改成“\”然后就好了。
**

划重点,问题解决总结:

**
在白嫖的read_MITSceneParsingData.py脚本文件中
将代码

SceneParsing_folder = os.path.splitext(DATA_URL.split("/")[-1])[0]
...
filename = os.path.splitext(f.split("/")[-1])[0]

改为

SceneParsing_folder = os.path.splitext(DATA_URL.split("\\")[-1])[0]
...
filename = os.path.splitext(f.split("\\")[-1])[0] 

就这么简单,hhhh.
不知是因为我下载的源代码版本低的缘故还是他人有所改动才有这样的异常,希望同大家多多交流共同进步

你可能感兴趣的:(FCN,python,机器学习,深度学习)