Advertisement

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

然后运行了一晚上总共迭代两次,成了这个样子
这里写图片描述

但是应该是对的。

全部评论 (0)

还没有任何评论哟~