写在前面:“纸上得来终觉浅,绝知此事要躬行”,看了一段时间图像语义分割相关方面的论文,熟知“FCN”、“U-Net”、“SegNet”、“DeepLab”等网络结构,但如何实现这些想法还是一头雾水,按捺不住想去复现的心思,于是,先从深度学习语义分割的奠基网络结构“FCN”开始。本文主要记录了FCN网络结构复现过程中出现的Bug及解决方法,最后介绍了一些GPU显存占用率和利用率的查询,仅供参考。
一、计算机软硬件环境
操作系统:windows 7 64位;
Python:3.5
GPU:NVIDIA GTX 1070Ti
Tensorflow:Tensorflow-GPU 1.10.0
CUDA:9.0
CUDNN:7.6.3.30
二、调试BUG
FCN(Fully Convolutional Networks,全卷积神经网络),在经典的VGGNet的基础上,去掉VGG网络最后的全连接层,换为卷积层,能对图像进行分割,生成和原图一样的尺寸输出,然后经过Softmax就能对图像的每个像素进行分类。具体的网络结构如下:
论文参考《Fully Convolutional Networks for Semantic Segmentation》,原论文作者提供了基于Caffe框架的源代码参考,见
shelhamer/fcn.berkeleyvision.orggithub.com鉴于Tensorflow框架的蓬勃发展,另外一位作者提供了基于Tensorflow框架的源代码参考,见
shekkizh/FCN.tensorflowgithub.com并在MIT提供的场景解析挑战数据集上做了训练和测试。
下载源代码,代码的实现中有四个Python文件,分别是FCN.py,BatchDatasetReader.py,TensorFlowTtils.py和read_MITSceneParsingData.py。将这四个文件放在一个当面目录,运行FCN.py程序,程序即可自动下载VGG网络的权重参数和训练用到的数据集,当然,亦可自行下载VGG网络权重数据集
http://www.vlfeat.org/matconvnet/models/beta16/imagenet-vgg-verydeep-19.matwww.vlfeat.org和数据集
http://data.csail.mit.edu/places/ADEchallenge/ADEChallengeData2016.zipdata.csail.mit.edu下载完毕后放到相应位置,权重参数放置路径为
./Model_zoo/imagenet-vgg-verydeep-19.mat,训练数据集放置路径为
./Data_zoo/MIT_SceneParsing/ADEChallengeData2016.zip,
并对ADEChallengeData2016.zip进行解压,需要特别注意的是,解压后ADEChallengeData2016中的文件务必放在
./Data_zoo/MIT_SceneParsing/ADEChallengeData2016路径下,
而不是
./Data_zoo/MIT_SceneParsing/ADEChallengeData2016/ADEChallengeData2016路径下。
运行FCN.py,相继出现如下问题。
1、TypeError: 'NoneType' object is not subscriptable
报这个错,请再次确认权重参数和训练数据集路径是否正确,尤其是ADEChallengeData2016.zip包含的文件及文件夹务必在
./Data_zoo/MIT_SceneParsing/ADEChallengeData2016路径下;同时,删除
./Data_zoo//MIT_SceneParsing路径下的MITSceneParsing.pickle文件,并重启kernel运行。
2、ValueError: Cannot feed value of shape (0,) for Tensor 'input_image:0', which has shape '(?, 224, 224, 3)'或者出现如下的相关东西
报这个错,主要是read_MITSceneParsingData.py程序中将“”误用为“/”,导致提取出的filename不正确所致。
源代码为:
将“/”更改为“”即可;
同时,删除./Data_zoo//MIT_SceneParsing路径下的MITSceneParsing.pickle文件,然后重启kernel运行。
三、GPU运行信息查询
如果安装的是GPU版本的Tensorflow,且计算机上有支持的GPU,也正确安装了显卡驱动、CUDA和cuDNN,默认情况下,Session会在GPU上运行。下面介绍如何查询GPU的显存占用率和GPU的利用率。
首先将C:Program FilesNVIDIA CorporationNVSMI加入系统环境变量,然后打开CMD窗口,并输入:nvidia-smi.exe –l 5,即可每5秒刷新一次相关信息,如下图所示,图中GPU显存占用为860MB,GPU利用率为10%。
下图为正在进行深度学习时的GPU使用相关信息。由图可知,此时GPU显存占用为7933MB,GPU利用率为98%,从另外一个角度可知,GPU此时已经被正确利用起来了。