一、 前言
这篇博客的主要内容是基于caffe的框架,利用全卷积神经网络(FCN)训练voc数据集。很多人刚接触FCN的时候很着急的想要制作并训练自己的数据集,我只想说路要一步一步走,先训练网上的数据集,一方面可以熟悉FCN构造和参数,一方面可以测试一下你电脑的性能。由于我的电脑配置太低了,这里我使用的是cpu,以后会补上使用gpu的方法,话不多说直接说步骤。
二、训练步骤
-
前期工作
要想使用FCN训练数据集,首先必须安装caffe框架,如果你还没安装的话,可以参考我这篇博客https://blog.csdn.net/weixin_42795611/article/details/83413951 -
安装fcn
下载fcn源码 fcn源码
下载完成后,将其解压进caffe-windows目录下,如下图所示(在这里我将其重名为了fcn-master)。
如果你想测试fcn代码是否可以使用的话,可以参考这篇博客https://blog.csdn.net/nichengwuxiao/article/details/79155610,这里就不在叙述了。 -
数据准备
benchmark数据集下载地址:benchmark数据集下载地址
VOC2012数据集下载地址:VOC2012数据集下载
benchmark数据集是用来存放训练的数据,VOC2012数据集用来存放测试数据。 -
了解数据集
(1)进入fcn-master/data目录,新建sbdd文件夹(如果没有),将benchmark解压到sbdd中,进入dataset文件夹,你讲看到如图所示五个文件,cls是用来存放索引图(标签),img用来存放训练数据(原训练图像),train.txt用来存放训练数据的名称,val.txt用来存放验证集的名称。
(2)进入将VOC数据集fcn-master/data/pascal目录下,进入VOC2012目录下,将看到如下图所示几个文件夹。JPEGImages用来存放测试数据(原测试图像),SegmentationClass用来存放索引图(标签)。
进入ImageSets\Segmentation目录下,新建seg11valid.txt,将train.txt里的内容复制到seg11valid.txt中,用来存放测试数据名称,为什么要新建一个文件夹,其实我也不太清楚,网上都是这么操作的,那我也就这么操作了,希望以后明白了可以补充下。 -
修改网络参数
(1)下载VGG16的预训练模型和VGG_ILSVRC_16_layers_deploy.prototxt并放在FCN源码文件夹中的ilsvrc-nets文件夹下
VGG16的预训练模型
VGG_ILSVRC_16_layers_deploy.prototxt
(2)进入fcn-master目录下,将所有py文件全部复制到voc-fcn32s(这里用voc-fcn32s模型训练数据),新建snapshot文件夹。这里面所有的文件我就不过多的介绍其作用了,今天就是想让大家熟悉一下训练流程,等我下一篇博客训练自己制作的数据集的时候在详细介绍。
(3)打开solve.py文件
为了避免运行程序时候出现no module named caffe ,在代码中包含import caffe的py文件的第一行加入import sys sys.path.append('C:/caffe/caffe-master/python')
其中,C:/caffe/caffe-master/python为你下载的caffe源码中python文件夹的路径
(4)修改solve.py文件
import caffe
import surgery, score
import numpy as np
import os
import sys
sys.path.append('C:/caffe/caffe-master/python')
try:
import setproctitle
setproctitle.setproctitle(os.path.basename(os.getcwd()))
except:
pass
#weights = '../ilsvrc-nets/vgg16-fcn.caffemodel'
vgg_weights = '../ilsvrc-nets/vgg16-fcn.caffemodel'
vgg_proto = '../ilsvrc-nets/VGG_ILSVRC_16_layers_deploy.prototxt'
weights = '../ilsvrc-nets/vgg16-fcn.caffemodel'
# init
#caffe.set_device(int(sys.argv[1])) #我的电脑没有gpu,如果你电脑有gpu的话,这一行不用注释
#caffe.set_mode_gpu() #我的电脑没有gpu,如果你电脑有gpu的话,这一行不用注释
#solver = caffe.SGDSolver('solver.prototxt')
#solver.net.copy_from(weights)
solver = caffe.SGDSolver('solver.prototxt')
vgg_net=caffe.Net(vgg_proto,vgg_weights,caffe.TRAIN)
surgery.transplant(solver.net,vgg_net)
del vgg_net
# surgeries
interp_layers = [k for k in solver.net.params.keys() if 'up' in k]
surgery.interp(solver.net, interp_layers)
# scoring
val = np.loadtxt('C:/caffe/caffe-master/fcn-master/data/pascal/VOCdevkit/VOC2012/ImageSets/Segmentation/seg11valid.txt', dtype=str) #根据你电脑自己的路径修改
for _ in range(25):
solver.step(4000)
score.seg_tests(solver, False, val, layer='score')
(5)修改训练,测试文件参数
用vs2013打开train.prototxt文件,根据自己电脑的路径代码修改为:
param_str: "{\'sbdd_dir\': \'C:/caffe/caffe-master/fcn-master/data/sbdd/benchmark/benchmark_RELEASE/dataset\', \'seed\': 1337, \'split\': \'train\', \'mean\': (104.00699, 116.66877, 122.67892)}"
用vs2013打开val.prototxt文件,根据自己电脑的路径代码修改为:
param_str: "{\'voc_dir\': \'C:/caffe/caffe-master/fcn-master/data/pascal/VOCdevkit/VOC2012\', \'seed\': 1337, \'split\': \'seg11valid\', \'mean\': (104.00699, 116.66877, 122.67892)}"
到此所有工作准备完成了,接下来开始训练数据
(6)训练数据
打开cmd命令窗口,将目录指定到voc-fcn32s路径下,输入
python.exe solve.py
如下图所示:
当你命令窗口出现如下图所示时,
说明你的配置成功了,接下来就是漫长的等待了,由于我的电脑配置太差,跑了一天一夜没有反应,嘿嘿,所有就没有在继续跑下去了
- 单张测试
由于我没能跑到最后一步,所以单张测试这一段我借用别人的博客的内容,https://blog.csdn.net/zoro_lov3/article/details/74550735
在fcn源码文件夹,找到 infer.py文件
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import sys
sys.path.append('C:/caffe/caffe-master/python')
import caffe
# load image, switch to BGR, subtract mean, and make dims C x H x W for Caffe
im = Image.open('000030.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)
net = caffe.Net('voc-fcn32s/deploy.prototxt', 'voc-fcn32s/snapshot/train_iter_24000.caffemodel', caffe.TEST)
#net = caffe.Net('voc-fcn8s/deploy.prototxt', 'siftflow-fcn32s/train_iter_100000.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)
#plt.imshow(out,cmap='gray');
plt.imshow(out);
plt.axis('off')
plt.savefig('000030_out32.png')
#plt.show()
三、总结
由于我也是刚开始接触的深度学习,对于零基础的人来说,要想制作并训练自己的数据集真的是有一点的难度,还是那句话,路要一步一步的走。这篇博客主要是介绍FCN数据集,以及熟悉整个训练的流程,如果以上步骤你都成功的话,说明你已经真正开始踏入深度学习的路途中了,希望我们一起共同进步。如果有任何问题的话,欢迎一起讨论。我的邮箱是[email protected]。下一篇博客我将介绍如何制作自己的数据集。