基于Caffe训练AlexNet模型
数据集
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模型的更多相关文章
- Caffe训练AlexNet网络,精度不高或者为0的问题结果
当我们使用Caffe训练AlexNet网络时,会遇到精度一值在低精度(30%左右)升不上去,或者精度总是为0,如下图所示: 出现这种情况,可以尝试使用以下几个方法解决: 1.数据样本量是否太少,最起码 ...
- Caffe训练AlexNet网络模型——问题一
训练AlexNet网络时,出现Check failed:datum_height >= crop_size (size vs. 227)错误,具体如下图所示: 根据提示,问题是crop_size ...
- Caffe训练AlexNet网络模型——问题三
caffe 进行自己的imageNet训练分类:loss一直是87.3365,accuracy一直是0 解决方法: http://blog.csdn.net/jkfdqjjy/article/deta ...
- Caffe训练AlexNet网络模型——问题二
训练时,出现Check failed:error == cudaSuccess (2 vs. 0) out of memory,并且accruary = 0,如下图所示: 解决方法:将train_va ...
- 使用Caffe训练适合自己样本集的AlexNet网络模型,并对其进行分类
1.在开始之前,先简单回顾一下几个概念. Caffe(Convolution Architecture For Feature Extraction-卷积神经网络框架):是一个清晰,可读性高,快速的深 ...
- 人脸检测数据源制作与基于caffe构架的ALEXNET神经网络训练
本篇文章主要记录的是人脸检测数据源制作与ALEXNET网络训练实现检测到人脸(基于caffe). 1.数据获取 数据获取: ① benchmark是一个行业的基准(数据库.论文.源码.结果),例如WI ...
- Caffe系列4——基于Caffe的MNIST数据集训练与测试(手把手教你使用Lenet识别手写字体)
基于Caffe的MNIST数据集训练与测试 原创:转载请注明https://www.cnblogs.com/xiaoboge/p/10688926.html 摘要 在前面的博文中,我详细介绍了Caf ...
- (原)ubuntu16在torch中使用caffe训练好的模型
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5783006.html 之前使用的是torch,由于其他人在caffe上面预训练了inception模型 ...
- PyTorch ImageNet 基于预训练六大常用图片分类模型的实战
微调 Torchvision 模型 在本教程中,我们将深入探讨如何对 torchvision 模型进行微调和特征提取,所有这些模型都已经预先在1000类的Imagenet数据集上训练完成.本教程将深入 ...
随机推荐
- Vue页面刷新方法(子组件改变数据后兄弟组件刷新,不闪烁)
todo https://blog.csdn.net/qq_40571631/article/details/91533248
- spring-boot 中实现标准 redis 分布式锁
一,前言 redis 现在已经成为系统缓存的必备组件,针对缓存读取更新操作,通常我们希望当缓存过期之后能够只有一个请求去更新缓存,其它请求依然使用旧的数据.这就需要用到锁,因为应用服务多数以集群方式部 ...
- 分布式-信息方式-ActiveMQ示例
实战 代码如下: 信息生产者 package test.mq.helloword; import javax.jms.Connection; import javax.jms.ConnectionFa ...
- css3 水纹效果(仿写阿里云)
效果图 什么也不说了,上代码. <!DOCTYPE html> <html> <head> <title>css3 水纹效果</title> ...
- ionic1使用imagepicker在安卓手机上闪退问题
在上一篇文章中,提到了如何在ionic1中使用imagepicker插件,并且实现该插件显示中文(汉化)问题有兴趣可以看看:ionic1使用ImagePicker插件并且显示中文(汉化) 1.这次要解 ...
- 2019秋Java学期课程总结
眨眼间,Java这门课程就快要到了尾声,这门课程主要学习到 搭建了Java的编译环境,安装eclipse软件,会用Java写一些简单的程序. 主要学习到的知识点有以下几点 1:通过写pta上的作业知道 ...
- 第十四周课程总结&记事本功能的简单实现。
(1)课程总结: 这周简单学习了下JDBC的内容: JDBC API 允许用户访问任何形式的表格数据,尤其是存储在关系数据库中的数据. 执行流程: (1)连接数据源,如:数据库. (2)为数据库传递查 ...
- C++二维数组名的再探索
#include <iostream> int main() { ][] = { , , , , , , , , , , , }; //输出 0,1,2,3,4,5,6,7,8,9,10, ...
- MySQL 建表时 date 类型的默认值设置
在执行下面 SQL 语句时发现报错 CREATE TABLE `jc_site_access_pages` ( `access_date` date NOT NULL DEFAULT '0000-00 ...
- SVN 清理失败解决方案
SVN有时因各种不明原因导致清理失败,可以采取如下解决办法进行处理: 方法一: 删除根目录下隐藏文件夹“.svn” 然后在根目录文件夹 外面的空白处 检出.比如你项目文件夹名为“D:/source” ...