FCN虽然老,但是还很坚挺,效率也还行,适合学习参考。
借鉴了很多此CSDN博客,https://blog.csdn.net/weixin_42795611/article/details/84073879
上了年纪,防止遗忘
设备概述
测试平台i7 6820hq,16g+K1200 4G,训练平台W2133,64g+P4000 8G
Caffe安装
conda create -n mycaffe python=3.7.9
souce activate mycaffe
conda install caffe-gpu
一步到位,注意FCN是跑在Python2上的,如果conda环境是3,后面需要修改一点点源码。其他的几个常用的库,Scipy,numpy,opencv,PIL,应该都会一起安装,没有一起安装就慢慢改。
跑通流程
1、下载测试数据集
下载benchmark和VOC2012数据集,网盘等方式下载。
benchmark数据集是用来存放训练的数据,VOC2012数据集用来存放测试数据。
2、下载必要网络文件
主体结构 https://github.com/shelhamer/fcn.berkeleyvision.org
VGG16的预训练模型(https://pan.baidu.com/s/1qYJeFfQ)
VGG_ILSVRC_16_layers_deploy.prototxt(https://pan.baidu.com/s/1lz-eNBM_zSzOzsEq14TznQ)
3、移动文件到指定位置
1、进入data目录,新建sbdd文件夹,将benchmark解压到sbdd中,进入dataset文件夹,cls是用来存放索引图(标签),img用来存放训练数据(原训练图像),train.txt用来存放训练数据的名称,val.txt用来存放验证集的名称,VOCdevkit数据集直接解压后放入sbdd文件夹即可。
2、VGG16的预训练模型、VGG_ILSVRC_16_layers_deploy.prototxt移动到源码根目录ilsvrc-nets文件夹下
3、复制根目录下所有py文件到voc-fcn32s中。首次训练先选择fcn32s开始。
4、进入VOC2012,进入JPEGImages文件夹,里面存放测试用的原图,然后进入SegmentationClass,里面存放测试用的索引图,最后进入ImageSets/Segmentation,新建seg11valid.txt的文件,它和train.txt的性质一样,存放测试用的图片名。到此,数据集就准备完成了。
4、在fcn32s中新建snapshot文件夹,防止权限问题无法创建报错。
4、修改相关文件
1、修改fcn32s里的voc_layer.py,使其支持非mat类型输入
def load_label(self, idx):
"""
Load label image as 1 x height x width integer array of label indices.
The leading singleton dimension is required by the loss.
"""
im = Image.open('{}/cls/{}.png'.format(self.sbdd_dir, idx))
label = np.array(im, dtype=np.uint8)
label = label[np.newaxis, ...]
return label
2、修改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]))
caffe.set_mode_gpu()
caffe.set_device(0)
#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('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')
3、solver.prototxt 网络参数设置
train_net: "train.prototxt"
test_net: "val.prototxt"
test_iter: 2 #因为我的图片少,所以这里测试图片参数就写少一点,如果图片多的话可以使用默认参数
# make test net, but don't invoke it from the solver itself
test_interval: 999999999
display: 20
average_loss: 20
lr_policy: "fixed"
# lr for unnormalized softmax
base_lr: 1e-10
# high momentum
momentum: 0.99
# no gradient accumulation
iter_size: 1 #batch_size的扩增倍数,必须是整数,1还不行,就换显卡吧
max_iter: 100000
weight_decay: 0.0005
snapshot: 4000
snapshot_prefix: "snapshot1/train"
test_initialization: false
4、train.prototxt 训练网络数据源设置,这个和5都跟着实际路径来
param_str: "{\'sbdd_dir\': \'D:/caffe/caffe-master/fcn-master/data/sbdd/benchmark/benchmark_RELEASE/dataset\', \'seed\': 1337, \'split\': \'train\', \'mean\': (104.00699, 116.66877, 122.67892)}"
5、val.prototxt 验证网络数据源设置
param_str: "{\'voc_dir\': \'D:/caffe/caffe-master/fcn-master/data/pascal/VOCdevkit/VOC2012\', \'seed\': 1337, \'split\': \'seg11valid\', \'mean\': (104.00699, 116.66877, 122.67892)}"
5、可以训练了
执行solver.py即可,如果网络结构报错,可以尝试重新下载试试看。
训练自己的数据
mogrify -format jpg *.png