数据集

1.准备数据集

1)下载训练和验证图片

ImageNet官网地址:http://www.image-net.org/signup.php?next=download-images (需用邮箱注册,而且邮箱不能是地址以.com结尾的邮箱)

ImageNet官网下载ILSVRC2012的训练数据集和验证数据集。除数据集外,ImageNet还提供了一个开发工具包ILSVRC2012_devkit_t12.tar.gz,是对ILSVRC2012数据集的详细讲解,提交比赛结果的要求,和对结果评价的代码。

http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_test.tar
http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_val.tar
http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_train.tar
http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_devkit_t12.tar
http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_bbox_train_v2.tar

2)训练数据集和验证数据集分别是两个tar文件ILSVRC2012_img_train.tar和ILSVRC2012_img_val.tar

将这两个文件拷贝至服务器合适的地址中(如/dataset/imagenet),分别解压两个文件到当前目录下:

tar –xvf  ILSVRC2012_img_train.tar./train
tar –xvf ILSVRC2012_img_val.tar ./val 

ILSVRC2012_img_train.tar解压后是1000个tar文件,每个tar文件表示1000个分类中的一个类。需要对这1000个tar文件再次解压。在train目录下执行unzip.sh文件,最后得到1000个文件夹。每个文件夹中是该类的图片。ILSVRC2012_img_val.tar解压后的文件夹包含了所有的验证集图片。

unzip.sh
dir=./
for x in `ls *.tar`
do
filename=`basename $x .tar`
mkdir $filename
tar -xvf $x -C ./$filename
done

3)下载其他需要的文件

在caffe目录下执行命令 ./data/ilsvrc12/get_ilsvrc_aux.sh,下载一些训练需要的附加文件。其中train.txt是训练数据集的ground truth文件,val.txt是验证数据集的ground truth文件,需要这两个文件在生成lmdb数据库时提供label信息。

4)图片预处理

(1)大小归一化:所有的图片都归一化为256*256的大小,对于一个长方形图片,首先将短边变成256的长度,然后剪裁图片中心的256*256部分

将examples/imagenet/create_imagenet.sh文件中,将为RESIZE=false更改为RESIZE=true,将所有图片归一化为256*256的大小。注意需将文件中的训练数据集和测试数据集的地址更改为服务器中实际存放的地址,即文件中设置:

TRAIN_DATA_ROOT=/dataset/ imagenet/train/
VAL_DATA_ROOT=/dataset/imagenet/val/

执行该文件后生成训练数据和验证数据的lmdb数据库:ilsvrc12_train_lmdb 、ilsvrc12_val_lmdb。

(2)减去像素平均值:所有图片的每个像素都减去所有训练集图片的平均值

训练集图片的平均值存储于data/ilsvrc12/imagenet_mean.binaryproto。如果没有该文件,执行 ./examples/imagenet/make_imagenet_mean.sh可以生成该文件。

ImageNet Large-Scale Visual Recognition Challenge(ILSVRC)    ILSVRC是Pascal Visual Object Challenge的子部分。ImageNet是一个数据库,有超过22000个种类,超过1500万张图片。
    ILSVRC使用1000个类,每个类中有1000个图片。这1000个类一一对应于WorldNet的1000个同义子集。这1000个同义子集互相不重叠,对于同义子集,不是的祖先。这样的子集称为低层子集。这1000个子集是ImageNet层次结构的一部分。可以认为这个子集包含了1000个低层子集和他们所有的祖先。共有860个这样的祖先,被称为高层子集。在层次结构中,所有的低层特征称为叶节点,高层子集称为中间节点。尽管在ImageNet中低层子集会有子类,但ILSVRC2012并不考虑这些子类,ILSVRC2012的层次结构可以看作是对完整ImageNet结构的剪裁。ILSVRC竞赛中,所有的标记都是针对低层子集,参赛者必须预测这1000个低层子集标记之一,不考虑预测高层子集的结果,而且也没有高层子集的训练图片。
    在ILSVRC中,子集信息可参见ILSVRC2012_devkit_t12中的data/meta.mat文件中的矩阵。
    矩阵中的每一个行对应于一个子集,每一项中包含如下域值:
    ILSVRC2012_ID是为每一子集分配的一个整数ID值,所有低层子集的ID值都在1到1000之间,所有高层子集的ID值都大于1000。所有的子集都是一句其ID值进行排序。提交预测结果时,ILSVRC2012_ID也作为相应子集的标记。
    WNID是子集在WordNet中的ID。用于在ImageNet或WorldNet中唯一标记一个子集。包含训练图片的tar文件就是用WNID命名的。同样每一个训练图片也是用WNID命名的。
    num_children是子集在剪裁后的结构中子孙的数目。对于低层子集其值为0,对于高层子集的值不为0。
    children是子孙子集的ILSVRC2012_ID的向量。
    wordnet_height是完整的ImageNet/WorldNet层次结构中到叶节点的最长路径的值。(完整的ImageNet/WorldNet层次结构中叶节点的  wordnet_height值为0)

    注意caffe使用的label和ILSVRC2012_devkit是不一致的。ILSVRC2012_ID是ILSVRC2012_devkit的提供的编号。而caffe中图片的label是以图片所属子集的名字的ASC II的顺序排列,并依次从0到999编号。本文提供的所有程序都是依据caffe的编号编写的。在caffe目录下的data/ilsvrc12/synset_words.txt文件查看子集/编号的对应。

训练图片
    对于每一个子集都有一个tar文件,用其WNID命名。图片文件,命名为x_y.JPEG。其中x是子集的WNID,y是整数(不是固定长度,而且不一定连续),所有的图片都是JPEG格式。
    共有1281167张训练图片。其中每个子集的训练图片数目在732 至1300之间。

验证图片
    共有50000张验证图片,分别被命名为:
      ILSVRC2012_val_00000001.JPEG
      ILSVRC2012_val_00000002.JPEG
      ...
      ILSVRC2012_val_00049999.JPEG
      ILSVRC2012_val_00050000.JPEG
    对于每一个子集分别有50张验证图片。
    验证图片的groundtruth在data/ILSVRC2012_validation_ground_truth.txt,文件中每一行包含一个图片对应的ILSVRC2012_ID,并以图片名称的升序排列。

测试图片
    共有100000张测试图片,测试图片的命名如下:
      ILSVRC2012_test_00000001.JPEG
      ILSVRC2012_test_00000002.JPEG
      ...
      ILSVRC2012_test_00099999.JPEG
      ILSVRC2012_test_00100000.JPEG
    对于每一个子集分别有100张测试图片。

2.训练模型

AlexNet模型网络结构定义于文件:models/bvlc_alexnet/train_val.prototxt,注意需将文件中的训练数据集和测试数据集的地址更改为服务器中实际存放的地址。

AlexNet模型训练参数定义于文件:models/bvlc_alexnet/solver.prototxt。

在caffe目录下执行命令:

./build/tools/caffe train --solver=models/bvlc_alexnet/solver.prototxt
模型训练参数
batch:默认大小为256(若服务器GPU内存不够,可调整到128)
迭代450000次,约90个epoch
learning rate初始化为0.,采用step的算法,每100000次(约20个epoch)迭代衰减一次
momentum值为0.,weight decay为0.
每10000个迭代输出一个snapshot

由于训练时间过长,可以令训练过程不挂断在后台运行,执行命令:

nohup ./build/tools/caffe train--solver=models/bvlc_alexnet/solver.prototxt & #该命令的输出会重定向到nohup.out文件中,可以查看该文件查看模型的训练情况

查看GPU是否被占用以及被占用的内存大小命令:

nvidia-smi 

训练过程可以暂停,并从之前训练生成的一个snapshort中开始恢复训练。如从第10000轮迭代结果开始继续训练:

./build/tools/caffe train --solver=models/bvlc_alexnet/solver.prototxt–
snapshot=models/bvlc_alexnet/caffenet_train_iter_10000.solverstate

如果最多迭代450000次,最后训练的模型为caffenet_train_iter_450000.caffemodel。

3.验证模型

利用已经训练好的模型对验证数据集的数据生成一个结果,该结果为一个文本文件,文件中的每一行对应一张图片,以图片名称的升序排列,如从ILSVRC2012_val_00000001.JPEG 到 ILSVRC2012_val_00050000.JPEG。每一行包含对图片预测的结果标记,即预测图片所属类别的值(0至999的整数),并以confidence值的降序排列。每一行的标记数目可以变化,但不能超过5。验证数据预测结果的示例文件可见ILSVRC2012_devkit中的/evaluation/demo.val.pred.txt。

在caffe/examples目录下执行alexneteval.py文件。执行命令:

python alexneteval.py #需要将modelname改为自己训练的模型名字
alexneteval.pyimport numpy as np
caffe_root = '../' # this file is expected to be in {caffe_root}/examples
val_dir = '/dataset/imagenet/val'
model_name ='caffenet_train_iter_450000.caffemodel'
import sys
sys.path.insert(, caffe_root + 'python')
import caffe
import os
caffe.set_mode_cpu()
net = caffe.Net(caffe_root +'models/bvlc_reference_caffenet/deploy.prototxt',
               caffe_root + 'models/bvlc_reference_caffenet/'+model_name,
               caffe.TEST)
transformer = caffe.io.Transformer({'data':net.blobs['data'].data.shape})
transformer.set_transpose(,,))
transformer.set_mean().mean())
transformer.set_raw_scale()  # the reference model operates on images ,]range instead of [,]
transformer.set_channel_swap(,,))  # the reference model has channels in BGRorder instead of RGB
net.blobs[,,,)
fh = open('alexnetpred.txt','w')
batchsize = net.blobs[]
for dirpath,dirnames,filenames inos.walk(val_dir):
   sortedfiles = sorted(filenames)
n=len(sortedfiles)
nbatch = (n+ batchsize - ) // batchsize
for i inrange(nbatch):
   idx = np.arange(i*batchsize,min(n,(i+)*batchsize))
   for tdx in idx:
              filename = sortedfiles[tdx]
                  indexofdata= tdx%batchsize
                  net.blobs['data'].data[indexofdata]= transformer.preprocess('data', caffe.io.load_image(os.path.join(dirpath,filename)))
       out =net.forward()
   for j in range(batchsize)
         output_pred=:-:-]
         outlist=output_pred.tolist()
         templist=[str(i) for i in outlist]
         fh.write(' '.join(templist))
         fh.write('\n')
fh.close()

生成结果文件alexnetpred.txt。

用训练出来的model测试test数据,可以修改solver文件中test数据达到测试其他数据集的效果:

./build/tools/caffe test --model=examples/mnist/lenet_train_test.prototxt --weights=examples/mnist/lenet_iter_10000.caffemodel --iterations=

4.结果评价

基于matlab的评价程序参见ILSVRC2012_devkit_t12中demo_eval.m和eval_flat.m,其中demo_eval调用了eval_flat函数,这个函数需要输入3个参数:

(1)predict_file:预测结果文件,每一行是对一张图片的预测labels,必须为正整数,以空格分隔,以confidence的降序排列,每一行的labels可以改变,但是不能超过max_num_pred_per_image。我们的预测结果文件就是alexnetpred.txt。

(2)gtruth_file:与predict_file的格式一致,每一行是相应图片的ground truth labels。在ILSVRC2012中,gtruth_file每行只有一个值。可以将caffe/data/ilsvrc12目录下的val.txt文件作为gtruth_file。但需要将文件的第一列删除。

(3)max_num_pred_per_image:在计算top-1和top-5错误率的值分别为1和5。

在demo_eval.m中设置:

pred_file='alexnetpred.txt'
ground_truth_file='val.txt'

在matlab中运行demo_eval输出top-1和top-5的错误率。注意需要demo_eval.m和eval_flat.m文件放置到matlab的当前工作路径中。

参考资料

[1]     KrizhevskyA, Sutskever I, Hinton G E. Imagenet classification with deep convolutionalneural networks[C]//Advances in neural information processing systems. 2012:1097-1105.

[2]     http://caffe.berkeleyvision.org/gathered/examples/imagenet.html

[3]     http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/00-classification.ipynb

[4]     ~/caffee/models/bvlc_alexnet/readme.md

[5]     ~/caffee/models /examples/imagenet/readme.md

[6]     ILSVRC2012_devkit_t12

[7]     http://blog.csdn.net/drdeep/article/details/50835974

基于Caffe训练AlexNet模型的更多相关文章

  1. Caffe训练AlexNet网络,精度不高或者为0的问题结果

    当我们使用Caffe训练AlexNet网络时,会遇到精度一值在低精度(30%左右)升不上去,或者精度总是为0,如下图所示: 出现这种情况,可以尝试使用以下几个方法解决: 1.数据样本量是否太少,最起码 ...

  2. Caffe训练AlexNet网络模型——问题一

    训练AlexNet网络时,出现Check failed:datum_height >= crop_size (size vs. 227)错误,具体如下图所示: 根据提示,问题是crop_size ...

  3. Caffe训练AlexNet网络模型——问题三

    caffe 进行自己的imageNet训练分类:loss一直是87.3365,accuracy一直是0 解决方法: http://blog.csdn.net/jkfdqjjy/article/deta ...

  4. Caffe训练AlexNet网络模型——问题二

    训练时,出现Check failed:error == cudaSuccess (2 vs. 0) out of memory,并且accruary = 0,如下图所示: 解决方法:将train_va ...

  5. 使用Caffe训练适合自己样本集的AlexNet网络模型,并对其进行分类

    1.在开始之前,先简单回顾一下几个概念. Caffe(Convolution Architecture For Feature Extraction-卷积神经网络框架):是一个清晰,可读性高,快速的深 ...

  6. 人脸检测数据源制作与基于caffe构架的ALEXNET神经网络训练

    本篇文章主要记录的是人脸检测数据源制作与ALEXNET网络训练实现检测到人脸(基于caffe). 1.数据获取 数据获取: ① benchmark是一个行业的基准(数据库.论文.源码.结果),例如WI ...

  7. Caffe系列4——基于Caffe的MNIST数据集训练与测试(手把手教你使用Lenet识别手写字体)

    基于Caffe的MNIST数据集训练与测试 原创:转载请注明https://www.cnblogs.com/xiaoboge/p/10688926.html  摘要 在前面的博文中,我详细介绍了Caf ...

  8. (原)ubuntu16在torch中使用caffe训练好的模型

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5783006.html 之前使用的是torch,由于其他人在caffe上面预训练了inception模型 ...

  9. PyTorch ImageNet 基于预训练六大常用图片分类模型的实战

    微调 Torchvision 模型 在本教程中,我们将深入探讨如何对 torchvision 模型进行微调和特征提取,所有这些模型都已经预先在1000类的Imagenet数据集上训练完成.本教程将深入 ...

随机推荐

  1. Postman(一)、断言

    postman常见断言方法介绍: 1.Clear a global variable (清除一个全局变量)  postman.clearGlobalVariable("variable_ke ...

  2. Spring Boot教程(二十八)通过JdbcTemplate编写数据访问

    数据源配置 在我们访问数据库的时候,需要先配置一个数据源,下面分别介绍一下几种不同的数据库配置方式. 首先,为了连接数据库需要引入jdbc支持,在pom.xml中引入如下配置: <depende ...

  3. CentOS6.5卸载自带的Mysql软件

    现想要在这家的服务器上安装Mysql集群,发现之前安装操作系统的时候顺便把MySql默认安装,所以需要将它先卸载掉. 1,查找已安装的mysql版本 [root@leader ~]# rpm -qa| ...

  4. @vue/cli 3.x 版本配置productionGzip提高性能

    第一步:安装插件 npm i -D compression-webpack-plugin 第二步:引入.在文件vue.config.js里导入compression-webpack-plugin,并添 ...

  5. Kotlin的高阶函数和常用高阶函数

    Kotlin的高阶函数和常用高阶函数 文章来源:企鹅号 - Android先生 高阶函数的定义 将函数当做参数或者是返回值的函数 什么是高阶函数 可以看看我们常用的 函数: 首先我们可以知道, 是 的 ...

  6. _parameter:解决There is no getter for property named in class java.lang.String

    我们知道在mybatis的映射中传参数,只能传入一个.通过#{参数名} 即可获取传入的值. Mapper接口文件: public int delete(int id) throws Exception ...

  7. Spring Data概览

    总结:JpaRepository继承PagingAndSortingRepository,PagingAndSortingRepository继承CrudRespository,CrudResposi ...

  8. vue初级 总结

    mvvm m:代表 data v 代表 view vm 代表 Vue 的实例 v-cloak 指令 解决闪烁的问题 需要在 style 标签中加入 [v-cloak];{ display:none } ...

  9. redis扫描特定keys脚本,可避免阻塞,不影响线上业务

    #!/bin/sh ## 该脚本用来查询redis集群中,各个实例当中特定前缀的key,对应只需要修改redis的其中一个实例的 host和port## 脚本会自动识别出该集群的所有实例,并查出对应实 ...

  10. Link标签

    Link标签的属性:rel定义当前文档与目标文档之间的关系. rev定义目标文档与当前文档之间的关系. Link和@import的区别:   1.隶属上的差别      link是一个html的一个标 ...