首页 » 技术分享 » win7+cpu+caffe+fcn+vgg16+训练voc2012数据集

win7+cpu+caffe+fcn+vgg16+训练voc2012数据集

 

一、 前言

这篇博客的主要内容是基于caffe的框架,利用全卷积神经网络(FCN)训练voc数据集。很多人刚接触FCN的时候很着急的想要制作并训练自己的数据集,我只想说路要一步一步走,先训练网上的数据集,一方面可以熟悉FCN构造和参数,一方面可以测试一下你电脑的性能。由于我的电脑配置太低了,这里我使用的是cpu,以后会补上使用gpu的方法,话不多说直接说步骤。

二、训练步骤

  1. 前期工作
    要想使用FCN训练数据集,首先必须安装caffe框架,如果你还没安装的话,可以参考我这篇博客https://blog.csdn.net/weixin_42795611/article/details/83413951

  2. 安装fcn
    下载fcn源码 fcn源码
    下载完成后,将其解压进caffe-windows目录下,如下图所示(在这里我将其重名为了fcn-master)。
    在这里插入图片描述
    如果你想测试fcn代码是否可以使用的话,可以参考这篇博客https://blog.csdn.net/nichengwuxiao/article/details/79155610,这里就不在叙述了。

  3. 数据准备
    benchmark数据集下载地址:benchmark数据集下载地址
    VOC2012数据集下载地址:VOC2012数据集下载
    benchmark数据集是用来存放训练的数据,VOC2012数据集用来存放测试数据。

  4. 了解数据集
    (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中,用来存放测试数据名称,为什么要新建一个文件夹,其实我也不太清楚,网上都是这么操作的,那我也就这么操作了,希望以后明白了可以补充下。
    在这里插入图片描述

  5. 修改网络参数
    (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

如下图所示:
在这里插入图片描述
当你命令窗口出现如下图所示时,
在这里插入图片描述
说明你的配置成功了,接下来就是漫长的等待了,由于我的电脑配置太差,跑了一天一夜没有反应,嘿嘿,所有就没有在继续跑下去了

  1. 单张测试
    由于我没能跑到最后一步,所以单张测试这一段我借用别人的博客的内容,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-32s和fcn-8s是没有deploy.prototxt文件的,网上的博客说 可以自己创建deploy.prototxt文件,我亲自试了,运行时会报错,所以我这里给出链接deploy.prototxt,下载直接解压到相应的路劲即可。

三、总结

由于我也是刚开始接触的深度学习,对于零基础的人来说,要想制作并训练自己的数据集真的是有一点的难度,还是那句话,路要一步一步的走。这篇博客主要是介绍FCN数据集,以及熟悉整个训练的流程,如果以上步骤你都成功的话,说明你已经真正开始踏入深度学习的路途中了,希望我们一起共同进步。如果有任何问题的话,欢迎一起讨论。我的邮箱是905885574@qq.com。下一篇博客我将介绍如何制作自己的数据集。

转载自原文链接, 如需删除请联系管理员。

原文链接:win7+cpu+caffe+fcn+vgg16+训练voc2012数据集,转载请注明来源!

0