Caffe环境AlexNet模型训练

准备数据

首先到ImageNet官网下载ILSVRC2012的训练数据集和验证数据集。除数据集外,ImageNet还提供了一个开发工具包ILSVRC2012_devkit_t12.tar.gz,是对ILSVRC2012数据集的详细讲解,提交比赛结果的要求,和对结果评价的代码。可以下载下来看一下里面的内容。ImageNet官网地址:http://www.image-net.org/signup.php?next=download-images。注意下载前需用邮箱注册,而且邮箱不能是地址以.com结尾的邮箱。
训练数据集和验证数据集分别是两个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

下载其他文件

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

图片预处理

(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可以生成该文件。

训练图片

对于每一个子集都有一个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

模型训练

AlexNet模型定义于文件:models/bvlc_alexnet/train_val.prototxt,注意需将文件中的训练数据集和测试数据集的地址更改为服务器中实际存放的地址。
训练参数定义于文件:models/bvlc_alexnet/solver.prototxt
在caffe目录下执行命令:

./build/tools/caffe train --solver=models/bvlc_alexnet/solver.prototxt

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

nohup ./build/tools/caffe train--solver=models/bvlc_alexnet/solver.prototxt &

该命令的输出会重定向到nohup.out文件中,可以查看该文件查看模型的训练情况。

模型验证

利用已经训练好的模型对验证数据集的数据生成一个结果,该结果为一个文本文件,文件中的每一行对应一张图片,以图片名称的升序排列,如从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 

生成结果文件alexnetpred.txt

alexneteval.py 测试代码如下

import 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(0, 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('data', (2,0,1))
transformer.set_mean('data', np.load(caffe_root +'python/caffe/imagenet/ilsvrc_2012_mean.npy').mean(1).mean(1))
transformer.set_raw_scale('data', 255)  # the reference model operates on images in [0,255]range instead of [0,1]
transformer.set_channel_swap('data', (2,1,0))  # the reference model has channels in BGRorder instead of RGB  
net.blobs['data'].reshape(50,3,227,227)
fh = open('alexnetpred.txt','w')
batchsize = net.blobs['data'].shape[0]
for dirpath,dirnames,filenames inos.walk(val_dir):
   sortedfiles = sorted(filenames)
n=len(sortedfiles)
nbatch = (n+ batchsize - 1) // batchsize
for i inrange(nbatch):
   idx = np.arange(i*batchsize,min(n,(i+1)*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=out['prob'][j].argsort()[-1:-6:-1]
         outlist=output_pred.tolist()
         templist=[str(i) for i in outlist]
         fh.write(' '.join(templist))
         fh.write('\n')
fh.close()
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值