论文研读(二):Superpixel Segmentation with Fully Convolutional Networks之代码调试

论文原文https://arxiv.org/abs/2003.12929
论文阅读:SpixelFCN论文研读
代码下载:https://github.com/fuy34/superpixel_fcn
环境安装:与Ubuntu16.04+pycharm+第三方包决战的点点滴滴
  对于SpixelFCN的源代码调试简直痛苦的不要,让一个代码基础为零的小白直接上手调和要我命没啥区别555,但功夫不负有心人,结果不负我初心,在这其中多多少少也学到了不少东西。先是提取下载好的包,然后结合readme大致看一下代码的结构(这里我先说怎么调通的具体的代码解析后面的文章再记录).这里说明一下因为调试过程遇到了很多的问题我大部分是自己百度的但是解决过程方法我忘记了如果我实在想不起来有需要的自行百度。

环境:ubuntu 16.04+torch 1.4+pip 20.2+python 3.5

  这里说明一下,pytorch是torch的python版;关于python版本的问题原文使用的是ubuntu自带的2.7但是在安装某些包的时候由于python2.7版本太低报错我就改成了自带的3.5版,我把我的第三方包的setting给出来供需要的参考:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

README.md+Code

  原文给出的readme一共包括先决条件,演示,数据预处理,训练,测试和评估6部分,结合调试依次来看。源码是在cuda运行的,而我对其进行简单改动将其运行在cpu!

1.Prerequisites

  这部分代码在/third_paty/cython,共包含是三个文件,我们的目标就是setup.py。cython部分的代码是来自第三方SSN,setup.py如果直接在IDE右键run的话会报下图的错,这个时候我在命令行已经能成功执行setup.py了在这里插入图片描述
setup.py是要在命令行command line运行的,具体原因我查了一下似懂非懂,在详细了解之后我会补充进来的,下面是命令行执行的结果:
在这里插入图片描述
  从图中可以看到我第一次运行是报错了的,第二次我用sudo命令来执行,执行成功后会在cython下的自动生成build文件夹,结果如下图所示:
在这里插入图片描述

Error + Method

  这里是我在调试setup.py的时候遇到的几个比较难搞的错误,因为调试过程中遇到了很多问题,图片都是我凑巧留下来的,但都是精华,哈哈
在这里插入图片描述
  第一个就是直接安装connectivity报的错,就是我上边说的由于python2.7版本的问题导致connectivity这个包无法安装最终运行失败;
在这里插入图片描述
  第二个就是因为IDE和系统的解析器版本不一样,系统默认的python解析器是python2.7,在报错之后我百度将系统默认的python2.7换成了3.5;
在这里插入图片描述
  第三个是报了编码格式的错误,网上说这个是因为tensorflow的版本过高我试过之后发现并没有什么卵用,我忘记了最后这个错误是怎么解决的了好像是最后把IDE和系统的解析器都设置成python3.5解决了这个错误。
在这里插入图片描述
  第四个错误就是在connectivity包的问题解决之后再次在command line执行setup.py的时候报的另外一个错,这应该是最好解决的一个无法创建那个.so文件并且说没有权限,我发现ubuntu下好多情况没有文件夹会报这个permission denied的错误,这里不太好懂就是它说的这个路径/usr/xxx这一堆,在任意的文件窗口下鼠标左击空白处,然后在键盘直接敲"/bin"然后它就自己跳出来了最后顺着报错的提示找到对应的路径把build下对应的.so文件整过去,这里需要注意这个文件是无法直接复制粘贴的,我是按照百度的方法解决的,之后按照我上面的步骤就可以执行了。

2.Demo

  这一部分比较好调试,除了因为我使用的python版本和原文不匹配导致导入部分有问题其它的都没有问题,具体import以及结果如图:
在这里插入图片描述

3.Data preparation

  作为实验的数据预处理部分这部分是相当重要的,这里处理的数据目标是BSDS500,在data_preprocessing文件夹中有俩个.py文件,分别是pre_process_bsd500.py这个是处理train和val数据的运行之后会得到俩个对应的train.txt和val.txt文件而pre_process_bsd500_ori_sz.py是处理test数据的运行后会得到test.txt。下载的代码中这三个.txt文件都是运行写入了内容的,在我们自己运行的时候一定要删除这三个文件自己创建空的或者打开将内容全部删除再将空文件保存都可以,否则会报如下找不到数据的错误,一开始以为是路径不对查找了一天多,这么一个小小的错误可以说不是错误的错误耽误了太久的时间,真是丢人…
在这里插入图片描述

4.Training

  由于原文在cuda上运行在这里我需要改一点点东西,首先是if…else…设备判断的地方,用cpu直接跑的会报错说不支持在cpu运行,我改成如下:

os.environ['CUDA_VISIBLE_DEVICES'] = "-1"
if torch.cuda.is_available():
    device = torch.device("cuda")
else:
    device = torch.device("cpu")
print("使用的设备为:",device)

  然后就是注释掉torch.cuda.synchronize()这句话,为什么?因为cuda的任务在gpu是多线程并行的,每个线程执行速度不同通过这句话等待所有gpu线程结束而cpu不是主动划分线程的不存在这个问题主要是电脑不支持,所以注释掉就好了。接下来就是将里面所有的cuda换成cpu,当然了注释里的就不用管了,它不参与运行无所谓。这其实就是如何将一个cuda程序修改为cpu运行的过程。修改之后运行会报如下错:在这里插入图片描述
  这个错误说白了就是没有内容可以循环是None,这时候需要在通过parser.add_argument()语句给函数设置参数的地方给出data和savepath的默认值就ok!

5.Testing

  测试主要就是run_infer_bsds.py和run_infer_nyu.py俩个文件修改方法和之前的类似cuda->cpu,parser.add_argument()语句读取数据和存储结果的默认值,很简单。
  总的来说源码写的很规范评估部分还没有搞定,先手记录一下,接下来要好好研究一下代码的具体实现细节等,上面这些东西现在看起来很简单,但是当初改的时候从费了我整整一周的时间,想想自己简直太菜了…

猜你喜欢

转载自blog.csdn.net/weixin_44825185/article/details/107916771