一、说明

SIFT Flow 是一个标注的语义分割的数据集,有两个label,一个是语义分类(33类),另一个是场景标签(3类)。

  1. Semantic and geometric segmentation classes for scenes.
  2.  
  3. Semantic: 0 is void and 133 are classes.
  4.  
  5. 01 awning
  6. 02 balcony
  7. 03 bird
  8. 04 boat
  9. 05 bridge
  10. 06 building
  11. 07 bus
  12. 08 car
  13. 09 cow
  14. 10 crosswalk
  15. 11 desert
  16. 12 door
  17. 13 fence
  18. 14 field
  19. 15 grass
  20. 16 moon
  21. 17 mountain
  22. 18 person
  23. 19 plant
  24. 20 pole
  25. 21 river
  26. 22 road
  27. 23 rock
  28. 24 sand
  29. 25 sea
  30. 26 sidewalk
  31. 27 sign
  32. 28 sky
  33. 29 staircase
  34. 30 streetlight
  35. 31 sun
  36. 32 tree
  37. 33 window
  38.  
  39. Geometric: -1 is void and 13 are classes.
  40.  
  41. 01 sky
  42. 02 horizontal
  43. 03 vertical

二、模型训练

1、源码下载

  1. git clone git@github.com:shelhamer/fcn.berkeleyvision.org.git

2、数据准备

下载标注好的SiftFlowDataset.zip数据集,地址:http://www.cs.unc.edu/~jtighe/Papers/ECCV10/siftflow/SiftFlowDataset.zip

将压缩包解压至data/sift-flow文件夹下。

3、代码修改

  1. git clone git@github.com:litingpan/fcn.git

或从https://github.com/litingpan/fcn 下载,替换掉siftflow-fcn32s整个文件夹。

其中solve.py修改如下:

  1. import caffe
  2. import surgery, score
  3.  
  4. import numpy as np
  5. import os
  6. import sys
  7.  
  8. try:
  9. import setproctitle
  10. setproctitle.setproctitle(os.path.basename(os.getcwd()))
  11. except:
  12. pass
  13.  
  14. # weights = '../ilsvrc-nets/vgg16-fcn.caffemodel'
  15. vgg_weights = '../ilsvrc-nets/VGG_ILSVRC_16_layers.caffemodel'
  16. vgg_proto = '../ilsvrc-nets/VGG_ILSVRC_16_layers_deploy.prototxt'
  17.  
  18. # init
  19. # caffe.set_device(int(sys.argv[1]))
  20. caffe.set_device(0)
  21. caffe.set_mode_gpu()
  22.  
  23. # solver = caffe.SGDSolver('solver.prototxt')
  24. # solver.net.copy_from(weights)
  25. solver = caffe.SGDSolver('solver.prototxt')
  26. vgg_net = caffe.Net(vgg_proto, vgg_weights, caffe.TRAIN)
  27. surgery.transplant(solver.net, vgg_net)
  28. del vgg_net
  29.  
  30. # surgeries
  31. interp_layers = [k for k in solver.net.params.keys() if 'up' in k]
  32. surgery.interp(solver.net, interp_layers)
  33.  
  34. # scoring
  35. test = np.loadtxt('../data/sift-flow/test.txt', dtype=str)
  36.  
  37. for _ in range(50):
  38. solver.step(2000)
  39. # N.B. metrics on the semantic labels are off b.c. of missing classes;
  40. # score manually from the histogram instead for proper evaluation
  41. score.seg_tests(solver, False, test, layer='score_sem', gt='sem')
  42. score.seg_tests(solver, False, test, layer='score_geo', gt='geo')

4、下载预训练模型

Revisions · ILSVRC-2014 model (VGG team) with 16 weight layers  https://gist.github.com/ksimonyan/211839e770f7b538e2d8/revisions

同时下载VGG_ILSVRC_16_layers.caffemodel和VGG_ILSVRC_16_layers_deploy.prototxt放在ilsvrc-nets目录下

5、训练

  1. python solve.py

训练完成后,在snapshot目录下train_iter_100000.caffemodel即为训练好的模型。

三、预测

1、模型准备

可以使用我们前面训练好的模型,如果不想自己训练,则可以直接下载训练好的模型http://dl.caffe.berkeleyvision.org/siftflow-fcn32s-heavy.caffemodel

2、deploy.prototxt

由test.prototxt修改过来的,主要修改了有三个地方,

(1)输入层

  1. layer {
  2. name: "input"
  3. type: "Input"
  4. top: "data"
  5. input_param {
  6. # These dimensions are purely for sake of example;
  7. # see infer.py for how to reshape the net to the given input size.
  8. shape { dim: 1 dim: 3 dim: 256 dim: 256 }
  9. }
  10. }

注意Input中,要与被测图片的尺寸一致。

(2)删掉了drop层

(3)删除了含有loss层相关层

3、infer.py

  1. import numpy as np
  2. from PIL import Image
  3. import matplotlib.pyplot as plt
  4. import sys
  5. import caffe
  6.  
  7. # the demo image is "2007_000129" from PASCAL VOC
  8.  
  9. # load image, switch to BGR, subtract mean, and make dims C x H x W for Caffe
  10. im = Image.open('coast_bea14.jpg')
  11. in_ = np.array(im, dtype=np.float32)
  12. in_ = in_[:,:,::-1]
  13. in_ -= np.array((104.00698793,116.66876762,122.67891434))
  14. in_ = in_.transpose((2,0,1))
  15.  
  16. # load net
  17. net = caffe.Net('deploy.prototxt', 'snapshot/train_iter_100000.caffemodel', caffe.TEST)
  18. # shape for input (data blob is N x C x H x W), set data
  19. net.blobs['data'].reshape(1, *in_.shape)
  20. net.blobs['data'].data[...] = in_
  21. # run net and take argmax for prediction
  22. net.forward()
  23. sem_out = net.blobs['score_sem'].data[0].argmax(axis=0)
  24.  
  25. # plt.imshow(out,cmap='gray');
  26. plt.imshow(sem_out)
  27. plt.axis('off')
  28. plt.savefig('coast_bea14_sem_out.png')
  29. sem_out_img = Image.fromarray(sem_out.astype('uint8')).convert('RGB')
  30. sem_out_img.save('coast_bea14_sem_img_out.png')
  31.  
  32. geo_out = net.blobs['score_geo'].data[0].argmax(axis=0)
  33. plt.imshow(geo_out)
  34. plt.axis('off')
  35. plt.savefig('coast_bea14_geo_out.png')
  36. geo_out_img = Image.fromarray(geo_out.astype('uint8')).convert('RGB')
  37. geo_out_img.save('coast_bea14_geo_img_out.png')

其中,sem_out_img保存着语义分割的结果,geo_out_img保存场景标识的结果。

4、测试

  1. python infer.py

Sift-flow中的图片都为256*256*3的彩色图片

images保存的是数据,semanticlabels保存的是语义分割标签,一共33类(而标注的数据会多一个无效类)。geolabels保存场景识别标签,共3类(而标注的数据会多一个无效类)。

所以是分别训练了两个网络,网络的前七层一样。

其中coast_bea14_sem_out.png为语义分割的结果, coast_bea14_geo_out.png为场景标识的结果,

原图                                                  语义分割                                                 场景标识

end

siftflow-fcn32s训练及预测的更多相关文章

  1. fcn训练及预测tgs数据集

    一.背景 kaggle上有这样一个题目,关于盐份预测的语义分割题目.TGS Salt Identification Challenge | Kaggle  https://www.kaggle.com ...

  2. 机器学习使用sklearn进行模型训练、预测和评价

    cross_val_score(model_name, x_samples, y_labels, cv=k) 作用:验证某个模型在某个训练集上的稳定性,输出k个预测精度. K折交叉验证(k-fold) ...

  3. 初识Sklearn-IrisData训练与预测

    笔记:机器学习入门---鸢尾花分类 Sklearn 本身就有很多数据库,可以用来练习. 以 Iris 的数据为例,这种花有四个属性,花瓣的长宽,茎的长宽,根据这些属性把花分为三类:山鸢尾花Setosa ...

  4. Spark技术在京东智能供应链预测的应用——按照业务进行划分,然后利用scikit learn进行单机训练并预测

    3.3 Spark在预测核心层的应用 我们使用Spark SQL和Spark RDD相结合的方式来编写程序,对于一般的数据处理,我们使用Spark的方式与其他无异,但是对于模型训练.预测这些需要调用算 ...

  5. ResNet网络的训练和预测

    ResNet网络的训练和预测 简介 Introduction 图像分类与CNN 图像分类 是指将图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法,是计算机视觉中其他任务,比如目标检测 ...

  6. Tensorflow训练和预测中的BN层的坑

    以前使用Caffe的时候没注意这个,现在使用预训练模型来动手做时遇到了.在slim中的自带模型中inception, resnet, mobilenet等都自带BN层,这个坑在<实战Google ...

  7. GUI:GUI的方式创建/训练/仿真/预测神经网络—Jason niu

    (1)导入数据:点击最左底部Import 按钮 (2)创建模型network_Jason_niu:点击底部的New按钮 (3)设置参数并训练:点击底部的Open按钮 (4)仿真预测: 大功告成!

  8. TensorFlow 1.4利用Keras+Estimator API进行训练和预测

    Tensorflow 1.4中,Keras作为作为核心模块可以直接通过tf.keas进行调用,但是考虑到keras对tfrecords文件进行操作比较麻烦,而将keras模型转成tensorflow中 ...

  9. 用C实现单隐层神经网络的训练和预测(手写BP算法)

    实验要求:•实现10以内的非负双精度浮点数加法,例如输入4.99和5.70,能够预测输出为10.69•使用Gprof测试代码热度 代码框架•随机初始化1000对数值在0~10之间的浮点数,保存在二维数 ...

随机推荐

  1. myeclipse 修改用户名密码

    当在一台公共的电脑上开发程序时,就需要涉及到更改svn用户名和密码,不然直接用本机用户密码提交,有点不妥. win7系统解决方案: C:\Documents and Settings\Administ ...

  2. 安装openssh

    在推进ansible用于配置管理与自动部署,其中一个很困扰的问题是创建ssh通道很慢,虽然ansible在同一个task里面是并行的控制多台受控端.但是每一个task都需要和受控端创建ssh通道,非常 ...

  3. Linux系统上安装、卸载JAVA、TOMCAT的方法

    一. 安装JAVA 安装方法1:手工上传 创建安装目录上传JAVA安装包 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Styl ...

  4. openSUSE XFCE桌面 多媒体解码器安装

    openSUSE15 leap 在终端命令行安装编解码器: 添加必要的软件源 zypper addrepo -f http://packman.inode.at/suse/openSUSE_Leap_ ...

  5. Python环境搭建遇到问题及解决方案记录

    pip版本问题 环境使用Ubuntu16.04 , 安装pip3 $sudo apt-get install python3-pip 默认安装pip8.1.1,更新后是18.1 $pip3 insta ...

  6. Java中返回类型方法名

    继承父类,子类含有两个分别为boy.Girl类名. 返回是需要返回方法 则返回变量名Person class Person { void eat() {} void speak() {} } clas ...

  7. Linux 安装aria2

    Ubuntu/Linux Mint/Debian sudo apt-get install aria2 CentOS/Fedora sudo yum install aria2 Manjaro/Arc ...

  8. vue打包上传oss

    今天把vue打包之后上传到oss,遇到了一点问题,现在解决了总结一下心得: OSS (Object Storage Service)名为对象存储,配合cdn使用达到静态文件托管加速,提升网站文件访问速 ...

  9. Linux学习第一天————了解root用户和基本的shell命令

    一.了解Linux中的root用户  1.1root用户 使用过MySQL的同学都知道MySQL中有一个变态的存在叫做超级管理员,他可以从操作任何一个数据库,那么在Linux中也有这么一个变态的存在他 ...

  10. SQL动态长度行列转置

    一,案列问题描述: 某销售系统中,注册的用户会在随后的月份中购物下单,需要按月统计注册的用户中各个月下单的金额.源数据表如下: FM::注册月份,CM: 下单月份, AMT:下单金额 期望得到如下统计 ...