- layer {
- name: “data”
- type: “Data”
- top: “data”
- top: “label”
- include {
- phase: TRAIN
- }
- transform_param {
- mirror: true
- crop_size: 600
- mean_file: “examples/images/imagenet_mean.binaryproto”
- }
- data_param {
- source: “examples/images/train_lmdb”
- batch_size: 256
- backend: LMDB
- }
- }
- layer {
- name: “data”
- type: “Data”
- top: “data”
- top: “label”
- include {
- phase: TEST
- }
- transform_param {
- mirror: false
- crop_size: 600
- mean_file: “examples/images/imagenet_mean.binaryproto”
- }
- data_param {
- source: “examples/images/val_lmdb”
- batch_size: 50
- backend: LMDB
- }
- }
从上面的 数据层的定义,看得出用了镜像和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):
- //We only do random crop when we do training.
- if (phase_ == TRAIN) {
- h_off = Rand(datum_height - crop_size + 1);
- w_off = Rand(datum_width - crop_size + 1);
- } else {
- h_off = (datum_height - crop_size) / 2;
- w_off = (datum_width - crop_size) / 2;
- }
- }
从上述的代码可以看出,如果我们输入的图片尺寸大于crop_size,那么图片会被裁剪。当 phase 模式为 TRAIN 时,裁剪是随机进行裁剪,而当为TEST 模式时,其裁剪方式则只是裁剪图像的中间区域。
下面是我在网上找到的自己进行图像裁剪的程序:
可对照给出的网址进行详细阅读:http://blog.csdn.net/u011762313/article/details/48343799
我们可以手动将图片裁剪并导入pycaffe中,这样能够提高识别率(pycaffe利用caffemodel进行分类中:进行分类这一步改为如下):
- #记录分类概率分布
- pridects = np.zeros((1, CLASS_NUM))
-
- # 图片维度(高、宽)
- img_shape = np.array(img.shape)
- # 裁剪的大小(高、宽)
- crop_dims = (32, 96)
- crop_dims = np.array(crop_dims)
- # 这里使用的图片高度全部固定为32,长度可变,最小为96
- # 裁剪起点为0,终点为w_range
- w_range = img_shape[1] - crop_dims[1]
- # 从左往右剪一遍,再从右往左剪一遍,步长为96/4=24
- for k in range(0, w_range + 1, crop_dims[1] / 4) + range(w_range, 1, -crop_dims[1] / 4):
- # 裁剪图片
- crop_img = img[:, k:k + crop_dims[1], :]
- # 数据输入、预处理
- net.blobs[‘data’].data[…] = transformer.preprocess(‘data’, crop_img)
- # 前向迭代,即分类
- out = net.forward()
- # 每一次分类,概率分布叠加
- pridects += out[‘prob’]
-
- # 取最大的概率分布为最终结果
- pridect = pridects.argmax()
在ubuntu下编译了原版Caffe,后来又下载便宜了另一个基于Caffe的项目(MyNet)。所以Caffe和MyNet两个文件夹都处于/home/philochan/目录下,按照下面代码利用caffe的python借口对模型进行训练,会出现...TransformationParameter(LayerParameter) has no filed nam...
目录 1 实验目的 2 实验需求 3 实验内容 4 实验过程 4.1 准备数据 4.2 创建目录 4.3 预处理(生成标签) 4.4 转换lmdb数据格式 4.5 生成均值文件 4.6 创建训练模型 4.7 开始训练 5 实验问题及解决方法 1 实验目的 (1) 结合Caffe平台,进一步...
1. train.bat ..\caffe-windows-master\bin\caffe.exe //安装配置时生成的caffe.exe路径 train &nbs...
文章目录 为何要采取random crop? 对图片进行随机裁减和缩放 有些图片有4个颜色通道 图像转换成torch.Tensor对象 Reference 为何要采取random crop? 在训练学习器时对图片进行随机裁减,背后的一个直觉就是可以进行数据增广(data augmentation),防止学习器陷入过拟合。假设类别 C C C的主要特征为 F F F,采集得到的图片包含背景噪声 B ...
首先,贴参考:caffe_root\caffe-master\examples\imagenet, (这是windows下的脚本运行,用于训练建模) caffe_root\caffe-master\examples\cpp_classification\classification.cpp(用于分类) 所使用的顺序是1.create_imagenet.sh(将图片转成lmdb格式,并统一大小) 。...
摸着前人的脚步也难免会磕磕绊绊,一直按denny大神文章学习,但有的地方还是无法实现,在训练自己的数据时老是报这种错误, I0413 22:04:00.106135 7369 net.cpp:380] data -> data I0413 22:04:00.106178 7369 net.cpp:380] data -> label I0413 22:04:00.106189 7369...
使用caffe训练时Loss变为nan的原因 From [原创|使用caffe训练时Loss变为nan的原因] From [ Deep Learning 之 训练过程中出现NaN问题] 1. 梯度爆炸 原因: 梯度变得非常大,使得学习过程难以继续 现象: 观察log,注意每一轮迭代后的loss。loss随着每轮迭代越来越大,最终超过了浮点型表示的范围,就变成了NaN。 措施: 减小so...
继上篇http://blog.csdn.net/qq_15947787/article/details/78428478训练完成后,需要对单张图片进行测试。 1.将D:\caffe\scripts\build\examples\cpp_classification\Release下生成的文件classification.exe复制到D:\caffe-train\tools下。 Usage: cla...
Crop_layer是在Fully Convolutional Networks for Semantic Segmentation这篇论文中接触到的。我发现网络配置文件中使用到了Crop层。 而Crop_layer层到底有什么作用呢?其实它主要是针对全卷积时,在原始图像上加了pad,致使图像比原始图像要大一些,最后我们利用这个crop层将pad裁剪掉。 crop层主要作用是为了裁剪,那么它又是怎...
上拉加载 小程序有内置函数可以实现上拉加载...