1. layer {
  2. name: "data"
  3. type: "Data"
  4. top: "data"
  5. top: "label"
  6. include {
  7. phase: TRAIN
  8. }
  9. transform_param {
  10. mirror: true
  11. crop_size: 600
  12. mean_file: "examples/images/imagenet_mean.binaryproto"
  13. }
  14. data_param {
  15. source: "examples/images/train_lmdb"
  16. batch_size: 256
  17. backend: LMDB
  18. }
  19. }
  20. layer {
  21. name: "data"
  22. type: "Data"
  23. top: "data"
  24. top: "label"
  25. include {
  26. phase: TEST
  27. }
  28. transform_param {
  29. mirror: false
  30. crop_size: 600
  31. mean_file: "examples/images/imagenet_mean.binaryproto"
  32. }
  33. data_param {
  34. source: "examples/images/val_lmdb"
  35. batch_size: 50
  36. backend: LMDB
  37. }
  38. }

从上面的 数据层的定义,看得出用了镜像和crop_size,还定义了 mean_file。

利用crop_size这种方式可以剪裁中心关注点和边角特征,mirror可以产生镜像,弥补小数据集的不足.

这里要重点讲一下crop_size在训练层与测试层的区别:

首先我们需要了解mean_file和crop_size没什么大关系。mean_file是根据训练集图片制作出来的,crop_size是对训练集图像进行裁剪,两个都是对原始的训练集图像进行处理。如果原始训练图像的尺寸大小为800*800,crop_size的图片为600*600,则mean_file与crop_size的图片均为800*800的图像集。

在caffe中,如果定义了crop_size,那么在train时会对大于crop_size的图片进行随机裁剪,而在test时只是截取中间部分(详见/caffe/src/caffe/data_transformer.cpp):

  1. //We only do random crop when we do training.
  2. if (phase_ == TRAIN) {
  3. h_off = Rand(datum_height - crop_size + 1);
  4. w_off = Rand(datum_width - crop_size + 1);
  5. } else {
  6. h_off = (datum_height - crop_size) / 2;
  7. w_off = (datum_width - crop_size) / 2;
  8. }
  9. }

  • 从上述的代码可以看出,如果我们输入的图片尺寸大于crop_size,那么图片会被裁剪。当 phase 模式为 TRAIN 时,裁剪是随机进行裁剪,而当为TEST 模式时,其裁剪方式则只是裁剪图像的中间区域。

下面是我在网上找到的自己进行图像裁剪的程序:

可对照给出的网址进行详细阅读:http://blog.csdn.NET/u011762313/article/details/48343799

我们可以手动将图片裁剪并导入pycaffe中,这样能够提高识别率(pycaffe利用caffemodel进行分类中:进行分类这一步改为如下):

 
  1. #记录分类概率分布
  2. pridects = np.zeros((1, CLASS_NUM))
  3. # 图片维度(高、宽)
  4. img_shape = np.array(img.shape)
  5. # 裁剪的大小(高、宽)
  6. crop_dims = (32, 96)
  7. crop_dims = np.array(crop_dims)
  8. # 这里使用的图片高度全部固定为32,长度可变,最小为96
  9. # 裁剪起点为0,终点为w_range
  10. w_range = img_shape[1] - crop_dims[1]
  11. # 从左往右剪一遍,再从右往左剪一遍,步长为96/4=24
  12. for k in range(0, w_range + 1, crop_dims[1] / 4) + range(w_range, 1, -crop_dims[1] / 4):
  13. # 裁剪图片
  14. crop_img = img[:, k:k + crop_dims[1], :]
  15. # 数据输入、预处理
  16. net.blobs['data'].data[...] = transformer.preprocess('data', crop_img)
  17. # 前向迭代,即分类
  18. out = net.forward()
  19. # 每一次分类,概率分布叠加
  20. pridects += out['prob']
  21. # 取最大的概率分布为最终结果
  22. pridect = pridects.argmax()
 
 

  • caffe中提供了过采样的方法(oversample),详见/caffe/python/caffe/io.py,裁剪的是图片中央、4个角以及镜像共10张图片。
 
注:如果图片过大,需要适当缩小batch_size的值,否则使用GPU时可能超出其缓存大小而报错
 

caffe中使用crop_size剪裁训练图片的更多相关文章

  1. (原)torch和caffe中的BatchNorm层

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6015990.html BatchNorm具体网上搜索. caffe中batchNorm层是通过Batc ...

  2. caffe学习--使用caffe中的imagenet对自己的图片进行分类训练(超级详细版) -----linux

    http://blog.csdn.net/u011244794/article/details/51565786 标签: caffeimagenet 2016-06-02 12:57 9385人阅读  ...

  3. Caffe学习系列(12):训练和测试自己的图片

    学习caffe的目的,不是简单的做几个练习,最终还是要用到自己的实际项目或科研中.因此,本文介绍一下,从自己的原始图片到lmdb数据,再到训练和测试模型的整个流程. 一.准备数据 有条件的同学,可以去 ...

  4. 转 Caffe学习系列(12):训练和测试自己的图片

    学习caffe的目的,不是简单的做几个练习,最终还是要用到自己的实际项目或科研中.因此,本文介绍一下,从自己的原始图片到lmdb数据,再到训练和测试模型的整个流程. 一.准备数据 有条件的同学,可以去 ...

  5. Caffe学习系列(12):训练和测试自己的图片--linux平台

    Caffe学习系列(12):训练和测试自己的图片   学习caffe的目的,不是简单的做几个练习,最终还是要用到自己的实际项目或科研中.因此,本文介绍一下,从自己的原始图片到lmdb数据,再到训练和测 ...

  6. CAFFE中训练与使用阶段网络设计的不同

    神经网络中,我们通过最小化神经网络来训练网络,所以在训练时最后一层是损失函数层(LOSS), 在测试时我们通过准确率来评价该网络的优劣,因此最后一层是准确率层(ACCURACY). 但是当我们真正要使 ...

  7. caffe 中如何打乱训练数据

    第一: 可以选择在将数据转换成lmdb格式时进行打乱: 设置参数--shuffle=1:(表示打乱训练数据) 默认为0,表示忽略,不打乱. 打乱的目的有两个:防止出现过分有规律的数据,导致过拟合或者不 ...

  8. 浅谈caffe中train_val.prototxt和deploy.prototxt文件的区别

    本文以CaffeNet为例: 1. train_val.prototxt  首先,train_val.prototxt文件是网络配置文件.该文件是在训练的时候用的. 2.deploy.prototxt ...

  9. 在caffe中使用hdf5的数据

    caffe默认使用的数据格式为lmdb文件格式,它提供了把图片转为lmdb文件格式的小程序,但是呢,我的数据为一维的数据,我也要分类啊,那我怎么办?肯定有办法可以转为lmdb文件格式的,我也看了一些源 ...

随机推荐

  1. artDialog使用说明(弹窗API)

    Js代码 2. 传入HTMLElement    备注:1.元素不是复制而是完整移动到对话框中,所以原有的事件与属性都将会保留 2.如果隐藏元素被传入到对话框,会设置display:block属性显示 ...

  2. Python列表操作大全(非常全)

    Python列表操作大全(非常全!!!) 对于python列表的理解可以和C语言里面的数组进行比较性的记忆与对照,它们比较相似,对于python里面列表的定义可以直接用方括号里加所包含对象的方法,并且 ...

  3. Navicat和DBeaver的查询快捷键

    1.Navicat for MySQL(连接MySQL数据库的工具) ctrl + r 执行查询页中所有的sql语句 ctrl + shift + r 只运行选中的sql语句 2.DBeaver(支持 ...

  4. python切片详解

    先从原理上分析切片运算: list的切片,内部是调用__getitem__,__setitem__,__delitem__和slice函数.而slice函数又是和range()函数相关的. 给切片传递 ...

  5. 生成以指定字符为开头的md5值(6位数字)

    以下脚本的功能是生成以指定字符为开头的md5值 #-*- coding:utf-8 -*- #脚本功能:生成以指定字符为开头的md5值(6位数字) import hashlib import rand ...

  6. Node js路由

    /* 要为程序提供请求的 URL 和其他需要的 GET 及 POST 参数,随后程序需要根据这些数据来执行相应的代码. 因此,需要查看 HTTP 请求,从中提取出请求的 URL 以及 GET/POST ...

  7. 浅述Try {} Catch{} 作用

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test ...

  8. 使用js 复制 文字到剪贴板

    有一个好插件 https://clipboardjs.com/ 兼容性  IE9+ 一般基本够用,但如果非要兼容IE8 可使用IE 特有的 方法 window.clipboardData.setDat ...

  9. deep learning3

    9.3.Restricted Boltzmann Machine (RBM)受限玻尔兹曼基 假设有一个二部图,每一层的节点之间没有链接,一层是可视层,即输入数据层(v),一层是隐藏层(h),如果假设所 ...

  10. javaBean默认接受request发送过来的数据,根据键自动设置属性

    javaBean默认接受request发送过来的数据,根据键自动设置属性