利用FCN-32s,FCN-16s和FCN-8s训练自己制作的数据集

前言

之前写过一篇博客是制作自己的数据集利用FCN-32s模型训练,对FCN-16s和FCN-8s训练写的比较粗略,所以写这篇博客主要是补充FCN-16s和FCN-8s训练过程。

训练前准备

在使用fcn之前需要配置caffe环境,可以参考win10+vs2013+caffe+gpu+python环境配置这篇博客,对如何制作自己的数据集以及FCN-32s训练过程可以参考FCN制作自己的数据集并训练和测试这篇博客

训练过程

训练FCN-16s
如果你的fcn-32s模型训练好之后,会在路径D:\caffe\caffe-master\fcn-master\voc-fcn32s\snapshot(这是我fcn-master代码的路径)中看到train_iter_100000.caffemodel文件,这个文件就是FCN-32s模型权重。如果你的fcn-32s模型训练好之后,会在路径D:\caffe\caffe-master\fcn-master\voc-fcn32s\snapshot(这是我fcn-master代码的路径)中看到train_iter_100000.caffemodel文件,这个文件就是FCN-32s模型权重。
利用FCN-32s,FCN-16s和FCN-8s训练自己制作的数据集_第1张图片
接着在fcn-master目录下找到所有py文件复制到voc-fcn16s文件夹中,同时新建文件夹snapshot
利用FCN-32s,FCN-16s和FCN-8s训练自己制作的数据集_第2张图片
你的文件夹中可能没有deploy.prototxt文件,这里给出下载地址deploy,里面有两个文件,将deploy_fcn16.prototxt重命名为deploy.prototxt并复制到到voc-fcn16s文件夹中
利用FCN-32s,FCN-16s和FCN-8s训练自己制作的数据集_第3张图片
用vs打开solver.prototxt文件,这里面是一些参数配置,由于我的图片较少,所以我把test_iter参数改为2,这个参数是指在测试时一次测试多少张图片。其他参数默认就行。
利用FCN-32s,FCN-16s和FCN-8s训练自己制作的数据集_第4张图片
对于train.prototxt,val.prototxt和voc_layers.py三个文件修改的方法和训练fcn-32s时一模一样,所以参考上述的FCN制作自己的数据集并训练和测试的博客就行。

打开solve.py文件,修改代码为下

import caffe
import surgery, score

import numpy as np
import os
import sys
sys.path.append('D:/caffe/caffe-master/python')
try:
    import setproctitle
    setproctitle.setproctitle(os.path.basename(os.getcwd()))
except:
    pass

weights = 'D:/caffe/caffe-master/fcn-master/voc-fcn32s/snapshot1/train_iter_100000.caffemodel'

# init
#caffe.set_device(int(sys.argv[1]))
caffe.set_mode_gpu()
caffe.set_device(0)

solver = caffe.SGDSolver('solver.prototxt')
solver.net.copy_from(weights)


# 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('D:/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')

到这所有准备工作都已结束,下面开始训练。
在cmd命令窗口中,指定到fcn-master\voc-fcn16s目录下,输入python solve.py命令,如下所示。
利用FCN-32s,FCN-16s和FCN-8s训练自己制作的数据集_第5张图片
等待漫长的训练后,在voc-fcn16s\snapshot目录下生成train_iter_100000.caffemodel文件
利用FCN-32s,FCN-16s和FCN-8s训练自己制作的数据集_第6张图片

测试单张图片
打开infer.py文件,修改代码如下,其中data文件夹是我在voc-fcn16s目录下创建的,不是fcn-master目录下的data

import numpy as np
from PIL import Image

import caffe
import vis
import sys
sys.path.append('D:/caffe/caffe-master/python')

# 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('data/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('deploy.prototxt', 'snapshot/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)

# visualize segmentation in PASCAL VOC colors
voc_palette = vis.make_palette(5)
out_im = Image.fromarray(vis.color_seg(out, voc_palette))
out_im.save('data/output.png')
masked_im = Image.fromarray(vis.vis_seg(im, out, voc_palette))
masked_im.save('data/visualization.jpg')

到此所有的fcn-16s模型训练工作都已结束。

训练FCN-16s用的是FCN-32s的权重,训练FCN-8s用的是FCN-16s的权重,所以对于FCN-8s模型的训练和FCN-16s训练的过程一模一样,所以在这就不在重复叙述了,如果又不懂的地方可以随时问我,我的邮箱是[email protected],欢迎一起交流探讨。

你可能感兴趣的:(利用FCN-32s,FCN-16s和FCN-8s训练自己制作的数据集)