caffe实战,deep retinal image understanding 实现
安装好caffe之后在官方网站下载model和script和image。分别代表模型,直接使用的脚本和测试图像。
放到/caffe/DRIU/中。
打开test.py
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import scipy.misc
from PIL import Image
import scipy.io
import os
import scipy
import sys
# Point to Caffe folder /path/to/caffe
caffe_root = '../'
# Choose between 'DRIVE', 'STARE', 'DRIONS', and 'RIMONE'
database = 'DRIVE'
# Use GPU?这里将use_gpu设置为1,将gpu_id设置为0,caffe.set_device的gpu_id从0开始计数。
use_gpu = 1;
gpu_id = 'gpu 0';
#sys.path.insert(0, caffe_root+'python/') 这里注释掉了,因为ms的caffe的根目录不在python下,在build\x64\release\pycaffe\caffe下。由于我将caffe的根目录直接放在python的sitepackage下,所以不用这句话直接使用import caffe也没问题。
import caffe
os.chdir(caffe_root+'/DRIU/')
def imshow_im(im):
plt.imshow(im,interpolation='none',cmap=cm.Grays_r)
net_struct = 'deploy_'+database+'.prototxt'
data_root = caffe_root+'/DRIU/Images/'+database+'/'
save_root = caffe_root+'/DRIU/results/'+database+'/'
if not os.path.exists(save_root):
os.makedirs(save_root)
with open(data_root+'test_'+database+'.txt') as f:
imnames = f.readlines()
test_lst = [data_root+x.strip() for x in imnames]
if use_gpu:
caffe.set_mode_gpu()
caffe.set_device(gpu_id)
# load net
net = caffe.Net('./'+net_struct, './DRIU_'+database+'.caffemodel', caffe.TEST)
for idx in range(0,len(test_lst)):
print("Scoring DRIU for image " + imnames[idx][:-1])
#Read and preprocess data
im = Image.open(test_lst[idx])
in_ = np.array(im, dtype=np.float32)
in_ = in_[:,:,::-1] #BGR
in_ -= np.array((171.0773,98.4333,58.8811)) #Mean substraction
in_ = in_.transpose((2,0,1))
#Reshape data layer
net.blobs['data'].reshape(1, *in_.shape)
net.blobs['data'].data[...] = in_
#Score the model
net.forward()
fuse = net.blobs['sigmoid-fuse'].data[0][0,:,:]
#Save the results
scipy.misc.imsave(save_root+imnames[idx][:-1], fuse)
执行一下:
出现异常,可能是因为显存不够,所以只执行了两张图片:

分割线
再尝试一下使用digits的实验结果,还是失败,于是乎试试命令行可不可做到。
狗日的编辑器没有自动保存!!
一般来说,图像的分类简单,lmdb直接提供这样的服务,可以将图像和label揉到一个数据库里面,只需要先把图像和label照这样放在txt文件就好了:

caffe分割图像的具体操作一直没搞得定,网上也没有教程,只能自己摸索,不过好像玩出点花样来了。
而图像分割好像没这么简单,label同样也是一个图像,所以如何用caffe还要用lmdn进行快速进行分割的训练就成了一个问题。其实归根结底就是不知道怎么在caffe里面分割图像时,设计正确的label格式(大概是这个意思)
一般来说,分类的时候data层的设计如下:
layer {
name: "mnist"
type: "Data"
top: "data"
top: "label"
include {
phase: TRAIN
}
transform_param {
scale: 0.00390625
}
data_param {
source: "examples/mnist/mnist_train_lmdb"
batch_size: 64
backend: LMDB
}
}
label和data 同时在这个层作为输出。而source只有一个路径。
所以是否可以尝试使用两个data层,一个输出data,一个输出label。打开给的那个啥视觉层文件,data层居然都没有:
name: "DRIU_STARE"
input: "data"
input_dim: 1
input_dim: 3
input_dim: 605
input_dim: 700
将其删除并进行增添:
简而言之就是分为四个层分别用于训练和测试的特征与label的输入。这里使用的batch-size为2是因为内存不够了(lll¬ω¬)
layer {
name: "data"
type: "Data"
top: "data"
include {
phase: TRAIN
}
data_param {
source: "/home/lwm/caffe-master/examples/DRIU/train_db/features"
batch_size: 2
backend: LMDB
}
}
layer {
name: "label"
type: "Data"
top: "label"
include {
phase: TRAIN
}
data_param {
source: "/home/lwm/caffe-master/examples/DRIU/train_db/labels"
batch_size: 2
backend: LMDB
}
}
layer {
name: "data"
type: "Data"
top: "data"
include {
phase: TEST
}
data_param {
source: "/home/lwm/caffe-master/examples/DRIU/val_db/features"
batch_size: 2
backend: LMDB
}
}
layer {
name: "label"
type: "Data"
top: "label"
include {
phase: TEST
}
data_param {
source: "/home/lwm/caffe-master/examples/DRIU/val_db/labels"
batch_size: 2
backend: LMDB
}
}
具体步骤
首先先预处理数据,在工程目录建立两个文件夹分别用于存放训练和测试数据:

然后在里面存入特征的图像和label的图像:

再编辑solver文件
test_iter: 1
test_interval: 2
base_lr: 0.01
display: 1
max_iter: 60
lr_policy: "step"
gamma: 0.1
momentum: 0.9
weight_decay: 0.0001
stepsize: 20
snapshot: 2
snapshot_prefix: "snapshot"
solver_mode: CPU
net: "/home/lwm/caffe-master/examples/DRIU/train_val.prototxt"
solver_type: SGD
视觉层的设计还是按照之前说得做,网络的层次结构什么的直接套用原作者的(这个不是重点,用什么结构都ok)。
接下来执行命令:
caffe train -solver examples/DRIU/solver.prototxt -weights exampls/DRIU/DRIU_STARE.caffemodel
然后运行了一晚上总共迭代两次,成了这个样子

但是应该是对的。
