截至目前,现已经跑通了siftflow-fcn32s,voc-fcn32s,并制作好了自己的数据集,现在就等大批数据的到来,进而针对数据进行参数fine-tuning,现对我训练的训练流程和训练过程中遇到的问题,做出总结和记录,从而对以后的学习作铺垫。
通过这篇分析语义分割的文章可以知道,FCN作为2014年的网络,现在看来确实有些老旧了,从下表可以看出FCN的表现得分也不是最高的,但是不管黑猫白猫,能捉住老鼠的就是好猫,能应用到项目中的,解决问题就是ok的。
chapter 1 基础环境安装和搭建
首先,必要的环境是ubuntu操作系统,FCN使用的框架是caffe,所以还要完成caffe的搭建。在搭建cffe环境的时候,建议直接使用干净的系统进行配置,因为常用的深度学习框架除了caffe还有就是tensorflow,而两者之间是不兼容的,当然可以借助于Anaconda环境进行共存,但是由于FCN是对caffe的直接调用且应用的是python2,所以还是建议前期不要借助于anaconda进行安装,从装显卡驱动,装CUDA8.0,装cudnn6.0,再到opencv3.1,最后编译caffe,安装caffe,一气呵成!
参考资料:https://blog.csdn.net/pnan222/article/details/81003725
后期亲测,虽然都说安装了caffe之后再安装tensorflow会出现软链接错误的问题,如果不使用anaconda的话,只能舍去其中一个来成全另一个,但是通过anaconda,借助于conda进行安装,在虚拟的环境下,应用conda install重新安装新的cuda和cudnn(尽量不要优先选择pip,因为pip安装不会重装cuda和cudnn,还是会出现软链接错误),这样就不会出现两个框架公用一个cuda和cudnn的错误,则不会出现软链接错误。
chapter 2 应用训练好的module实现语义分割
1.在GitHub上下载作者开源的FCN代码,链接如下:https://github.com/shelhamer/fcn.berkeleyvision.org ;
相关文献的链接如下:
FCN在多个数据集上都进行了训练,比如:Pascal VOC模型,nyudv2模型,siftflow模型,Pascal-Context模型。
2.下载源码之后解压,首先就是要先应用用作者已经训练好的模型,对满足要求的数据进行预测,看一下效果。通过阅读源码和文章可以知道,训练FCN的过程是:要先根据Vgg16的model,训练FCN32s,再应用得到的FCN32s的model,训练FCN16s,再应用得到的FCN16s的model,训练FCN8s,得到最后的model,应用该model对网络正向传播,可以得到较好的表现结果。
下载voc-fcn32s,voc-fcn16s和voc-fcn8s的caffemodel,并应用于网络正向传播进行预测,作者已经训练好的model可以在每个数据集中进行下载,下载方式为进入对应目录下,找到一个名为caffemodel-url的文件,该文件保存的就是对应model的下载链接,通过链接即可以下载到model,并将model放在对应的目录下,由于fcn8s是最终表现效果最好的model,所以应用的也是该model。
接下来就是修改fcn.berkeleyvision.org目录下的infer.py文件了,以下是我的文件,仅供参考。
import sys
sys.path.append('/home/pzn/caffe/python')
import numpy as np
from PIL import Image
import caffe
import vis
# the demo image is "2007_000129" from PASCAL VOC
# load image, switch to BGR, subtract mean, and make dims C x H x W for Caffe
im = Image.open('demo/image.jpg')
in_ = np.array(im, dtype=np.float32)
in_ = in_[:,:,::-1]
in_ -= np.array((104.00698793,116.66876762,122.67891434))
in_ = in_.transpose((2,0,1))
# load net
net = caffe.Net('voc-fcn8s/deploy.prototxt', 'voc-fcn8s/fcn8s-heavy-pascal.caffemodel', caffe.TEST)
# shape for input (data blob is N x C x H x W), set data
net.blobs['data'].reshape(1, *in_.shape)
net.blobs['data'].data[...] = in_
# run net and take argmax for prediction
net.forward()
out = net.blobs['score'].data[0].argmax(axis=0)
# visualize segmentation in PASCAL VOC colors
voc_palette = vis.make_palette(21)
out_im = Image.fromarray(vis.color_seg(out, voc_palette))
out_im.save('demo/output.png')
masked_im = Image.fromarray(vis.vis_seg(im, out, voc_palette))
masked_im.save('demo/visualization.jpg')
其中,加入