caffe GPU版本使用fcn分割自己的图像
折腾好久终于把caffe的fcn图像分割调通,在此记录一下整个过程
非常感谢supe_king的几篇博客http://blog.****.net/supe_king/article/details/54142973
下面介绍正题
使用caffe-gpu版本需要先安装python2.7或者python3.5,安装cuda7.5或者cuda8.0,最后相应版本的cudnn,安装方法为:
将cudnn解压到cuda对应的目录中,cuda目录加入环境变量
caffe制作自己的数据集
1 训练集
fcn.berkeleyvision.org-master\data\sbdd\dataset\img\ 原始图片
fcn.berkeleyvision.org-master\data\sbdd\dataset\cls\ label图片
fcn.berkeleyvision.org-master\data\sbdd\dataset\train.txt 图片名称列表
2 测试集
fcn.berkeleyvision.org-master\data\pascal\VOC2011\JPEGImages\ 测试用原始图片
fcn.berkeleyvision.org-master\data\pascal\VOC2011\SegmentationClass\ label图片
fcn.berkeleyvision.org-master\data\pascal\VOC2011\ImageSets\Segmentation\seg11valid.txt 测试图片列表
label为索引模式图片,索引图片我是用ps套索抠图做的。
原始图片长宽最好不要超过500,否则容易造成GPU溢出。
训练网络:
要训练自己的数据集,首先从voc-fcn8s中的caffemodel-url下载预训练模型,如果不使用这个模型,那么训练不能收敛
然后要修改以下内容:
1 solver.prototxt
train_net: "G:/caffe512/caffe-master/fcn.berkeleyvision.org-master/voc-fcn8s/train.prototxt"
test_net: "G:/caffe512/caffe-master/fcn.berkeleyvision.org-master/voc-fcn8s/val.prototxt"
修改为自己的路径
snapshot_prefix:
修改为自己保存训练结果的路径
2 train.prototxt
layer {
name: "data"
type: "Python"
top: "data"
top: "label"
python_param {
module: "voc_layers"
layer: "SBDDSegDataLayer"
param_str: "{\'sbdd_dir\': \'G:/caffe512/caffe-master/fcn.berkeleyvision.org-master/data/sbdd/dataset\', \'seed\': 1337, \'split\': \'train\', \'mean\': (104.00699, 116.66877, 122.67892)}"
}
}
修改为自己的训练数据路径
3 val.prototxt
layer {
name: "data"
type: "Python"
top: "data"
top: "label"
python_param {
module: "voc_layers"
layer: "VOCSegDataLayer"
param_str: "{\'voc_dir\': \'G:/caffe512/caffe-master/fcn.berkeleyvision.org-master/data/pascal/VOC2011\', \'seed\': 1337, \'split\': \'seg11valid\', \'mean\': (104.00699, 116.66877, 122.67892)}"
}
}
修改为自己的测试数据路径
4 deploy,val,train.prototxt
这三个文件中fc6和fc7层要重命名,并且把最后几层的输出个数调整为自己的分类数。运行时如果报错说
层名不匹配,则把不匹配的层全部重命名。(我是这么做的 不知道对不对)
5 solver.py
此文件是python文件,执行训练命令
执行此文件可能会出现很多缺失模块的问题,根据提示把缺失的模块装上即可,可使用pip
weights = 'G:/caffe512/caffe-master/fcn.berkeleyvision.org-master/voc-fcn8s/vgg16-fcn.caffemodel'
改为自己的预训练模型路径
solver = caffe.SGDSolver('G:/caffe512/caffe-master/fcn.berkeleyvision.org-master/voc-fcn8s/solver.prototxt')
改为自己的路径
val = np.loadtxt('G:/caffe512/caffe-master/fcn.berkeleyvision.org-master/voc-fcn8s/segvalid11.txt', dtype=str)
改为自己的测试图片列表文件
for _ in range(25):
solver.step(400)
25表示循环25次
400表示每400次测试一次网络
总共会迭代 25*400 = 10000次
全部修改以后 在终端执行 python solver.py 即可开始训练
图像分割
训练好了网络以后就可以开始图像分割了
图像分割的命令在fcn.berkeleyvision.org-master\infer.py
对infer.py进行修改即可
im = Image.open('G:/095.jpg')
改为需要分割的图片路径
net = caffe.Net('fcn.berkeleyvision.org-master/voc-fcn8s/deploy.prototxt', 'fcn.berkeleyvision.org-master/voc-fcn8s/snapshot/train_iter_8000.caffemodel', caffe.TEST)
修改为自己的路径
加上
plt.imshow(out)
plt.axis('off')
plt.savefig('G:\\test.jpg')
可显示与保存分割结果
最后,因为原本训练集的label是.mat的数据格式,而我这里是利用简化的数据集,不需要.mat文件
直接使用索引图片即可,因此还要修改一下voc_layers.py文件
复制class VOCSegDataLayer的load_label函数 替换 class SBDDSegDataLayer的load_label函数,
并修改
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
修改自己的label目录
执行python infer.py即可进行图像分割
补充:
样本均值要改成自己的均值
本文只要是参考上面supe_King的博客,结合他的博客应该是可已完成的
上一张我训练中的图