caffe笔记2

深度学习文章2:使用MNIST数据集验证Caffe是否安装成功

使用MNIST数据集验证Caffe是否安装成功

本文延续上篇博文《Caffe安装教程:Ubuntu16.04(CPU) 》,对搭建好的caffe使用MNIST数据集进行测试,可以更好的验证Caffe。

1.下载数据

cd ~/caffe/
./data/mnist/get_mnist.sh
./examples/mnist/create_mnist.sh
  • 1
  • 2
  • 3

可以查看下载的数据:
这里写图片描述

2.修改配置

因为是CPU运行,所以修改在examples文件下的Mnist下的lenet_solver.prototxt中的solver_mode:CPU

cd ~/caffe/
sudo gedit ./examples/mnist/lenet_solver.prototxt
  • 1
  • 2

修改为下图:

这里写图片描述

solver_mode: CPU
  • 1

3.训练模型

cd ~/caffe/
./examples/mnist/train_lenet.sh
  • 1
  • 2

4.结果展示

这里写图片描述

5.可能遇到的问题

这里写图片描述

可能会遇到./create_mnist.sh: 17: ./create_mnist.sh: build/examples/mnist/convert_mnist_data.bin: not found这样的错误,这是因为新版caffe都需要从根目录上执行,这里我们是从mnist目录下来执行的,所以我们需要先执行:

cd ~/caffe/

进入根目录,然后执行命令:

./examples/mnist/train_lenet.sh

将自己的图像数据转换成caffe需要的db(leveldb/lmdb)文件

在搭建好caffe环境之后,我们往往需要对自己的图像数据进行训练/测试,我们的图像数据往往时图片文件,如jpg,jpeg,png等,然而在caffe中我们需要使用的数据类型是lmdb或leveldb,例如:在之前测试MNIST数据集《 深度学习文章2:使用MNIST数据集验证Caffe是否安装成功 》时,我们运行脚本create_mnist.sh就是生成对应的db文件,运行后在~/caffe/examples/mnist/mnist_train_lmdb目录下,可以看到生成的db文件: 这里写图片描述 因此我们在对自己的图像数据进行训练/测试之前,需要转换成caffe框架可以直接使用的db文件,本篇博文主要就如何转换进行详细阐释。

1.创建图片清单文件

首先我们需要创建一个我们自己图片数据集的清单txt文件,这里我们先以caffe自带的两张图片为例,在caffe目录/examples/images下,有两张cat.jpg和fish-bike.jps,我们将这两张图片分别作为类别1和类别2。然后我们需要创建一个sh脚本文件来生成图片清单:

cd ~/caffe/
sudo gedit examples/images/create_filelist.sh
  • 1
  • 2

将以下内容编辑在文件中:

DATA=examples/images
echo "Create train.txt..."
rm -rf $DATA/train.txt
find $DATA -name *cat.jpg | cut -d '/' -f3 | sed "s/$/ 1/">>$DATA/train.txt
find $DATA -name *bike.jpg | cut -d '/' -f3 | sed "s/$/ 2/">>$DATA/tmp.txt
cat $DATA/tmp.txt>>$DATA/train.txt
rm -rf $DATA/tmp.txt
echo "Done.."
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

熟悉Linux命令的同学应该能看懂这个脚本文件的意思,不太明白的同学可以参照以下命令来理解:

  • rm:删除文件
    rm -rf $DATA/train.txt意思就是删除文件夹下有的train.txt文件
  • find:寻找文件
  • cut:截取路径
  • sed:在每行的最后加上标注,例如这里在cat.jpg后面加上标注类别1,在bike.jpg文件加入标注类别2。
    find $DATA -name *cat.jpg | cut -d '/' -f3 | sed "s/$/ 1/">>$DATA/train.txt 意思就是找寻cat.jpg文件,并截取文件名,在文件名后加上标注1,并将其存入train.txt文件中,下一行命令同理。
  • cat:将文件内容合并到一个文件里。
    cat $DATA/tmp.txt>>$DATA/train.txt 意思就是将tmp.txt中类别2的命令合到train.txt文件中。

编辑完成后保存,然后执行命令生成对应的train.txt,命令如下:

cd ~/caffe/
sudo sh examples/images/create_filelist.sh
  • 1
  • 2

执行过程如下图:

这里写图片描述

执行结束后,在之前脚本文件配置的路径下/examples/images/可以看到生成的train.txt文件,内容如下图:

这里写图片描述

可以看到图片对应类别。如果图片数量很少时,可以采用手动编写的方式,如果图片特别多的情况下,就需要用脚本来生成了,这里生成了train.txt文件,val.txt和test.txt可用相同的原理生成。

2.利用清单文件生成对应的db文件

在caffe中,根目录下的tools文件夹下,有提供文件convert_imageset.cpp,编译之后,生成的可执行文件在build/tools/目录下,这个文件可用于将禽蛋敢问见转换成caffe框架能直接使用的db文件。该文件的命令行使用如下:

convert_imageset [FLAGS] ROOTFOLDER/ LISTFILE DB_NAME
  • 1

其中四个参数含义如下:

  • FLAGS: 图片参数组
    • gray: 是否以灰度图的方式打开图片。程序调用opencv库中的imread()函数来打开图片,默认为false。
    • shuffle: 是否随机打乱图片顺序。默认为false。
    • backend:需要转换成的db文件格式,可选为leveldb或lmdb,默认为lmd。
    • resize_width/resize_height: 改变图片的大小。在运行中,要求所有图片的尺寸一致,因此需要改变图片大小。 程序调用opencv库的resize()函数来对图片放大缩小,默认为0,不改变。
    • check_size: 检查所有的数据是否有相同的尺寸。默认为false,不检查。
    • encoded: 是否将原图片编码放入最终的数据中,默认为false。
    • encode_type: 与前一个参数对应,将图片编码为哪一个格式:‘png’,’jpg’等。
  • ROOTFOLDER/: 图片存放的绝对路径,从linux系统根目录开始(不是caffe根目录,需要图片存放的绝对路径)
  • LISTFILE: 图片文件列表清单,一般为一个txt文件,一行一张图片
  • DB_NAME: 最终生成的db文件存放目录

接下来我们创建脚本来实现转换:

cd ~/caffe/
sudo gedit examples/images/create_lmdb.sh
  • 1
  • 2

然后编辑生成的sh文件,内容如下:

DATA=examples/images
rm -rf $DATA/img_train_lmdb
build/tools/convert_imageset --shuffle --resize_height=256 --resize_width=256 /home/moqi/caffe/examples/images/ $DATA/train.txt  $DATA/img_train_lmdb
  • 1
  • 2
  • 3

其中,设置参数-shuffle,打乱图片顺序。设置参数-resize_height和-resize_width将所有图片尺寸都变为256*256。/home/moqi/caffe/examples/images/为图片保存的绝对路径,这里需要根据自己电脑的路径进行替换,例如你的caffe目录在/home/xx/caffe,则需要将其替换为home/xx/caffe/examples/images/,当然也可以指定在计算机的任何位置,注意替换为绝对路径即可。

最后,运行刚刚编辑保存好的脚本文件:

cd ~/caffe/
sudo sh examples/images/create_lmdb.sh 
  • 1
  • 2

运行过程如下图:

这里写图片描述

在examples/images/目录下生成了img_train_lmdb文件夹,里面就是caffe运行需要的数据集。

在打开img_train_lmdb文件夹的时候,可能会遇到权限不够的提示,只需要改变文件夹的权限即可:

sudo chmod 777 img_train_lmdb/
  • 1

不了解的同学可自行百度Linux权限修改命令。

3.例子:完整的将自己的训练/测试图片转化成caffe数据集

3.1数据集展示

这里我们将五类图片,每个类别100张,其中80张作为训练,20张作为测试,图片类别标注分别为3,4,5,6,7,图片名称对应未301,302等等。我们将图片存放在caffe目录下的data文件夹下,文件夹名称为moqi,文件夹下面包含两个文件夹:test和train,test文件夹存放100张测试图片,train文件夹存放400张训练图片。如下图所示:

测试图片

训练图片

网上数据集较多,大家可自行百度下载,按照格式存储好即可。

3.2生成训练和测试清单文件

在caffe根目录下的examples目录下,创建一个myfile的文件夹,来用存放配置文件和脚本文件。然后编写一个脚本create_filelist.sh,用来生成train.txt和test.txt清单文件。

cd ~/caffe/
sudo mkdir examples/myfile
sudo gedit examples/myfile/create_filelist.sh
  • 1
  • 2
  • 3

编辑文件,内容如下:

DATA=data/moqi/
MY=examples/myfile

echo "Create train.txt..."
rm -rf $MY/train.txt
for i in 3 4 5 6 7 
do
find $DATA/train -name $i*.jpg | cut -d '/' -f4-5 | sed "s/$/ $i/">>$MY/train.txt
done

echo "Create test.txt..."
rm -rf $MY/test.txt
for i in 3 4 5 6 7
do
find $DATA/test -name $i*.jpg | cut -d '/' -f4-5 | sed "s/$/ $i/">>$MY/test.txt
done
echo "All done"

 注: 这个脚本文件中,用到了rm,find,cut,sed,cat等linux命令

    rm:删除文件

    find:寻找文件

    cut :截取路径

   sed:在每行的最后面加上标注。本例中将找到的“i*.jpg”文件加入标注为i,比如“3*.jpg”标注为3

   cat:将两个类别合并在一个文件里。


编辑完成后保存退出,然后退回到caffe根目录下运行此脚本:

cd ~/caffe/
sudo sh examples/myfile/create_filelist.sh
  • 1
  • 2

执行过程如下图:

这里写图片描述

执行结束后,在caffe根目录下的examples/myfile/ 文件夹下生成train.txt和test.txt两个文本文件,里面就是图片的列表清单。如下图:

这里写图片描述

train.txt文件内容如下:

这里写图片描述

test.txt文件内容如下:

这里写图片描述

3.3转换成caffe需要的db文件

新建脚本文件来实现转换:

cd ~/caffe/
sudo gedit examples/myfile/create_lmdb.sh
  • 1
  • 2

编辑文件,内容如下:

MY=examples/myfile

echo "Create train lmdb.."
rm -rf $MY/img_train_lmdb
build/tools/convert_imageset --shuffle --resize_height=256 --resize_width=256 /home/moqi/caffe/data/moqi/ $MY/train.txt $MY/img_train_lmdb

echo "Create test lmdb.."
rm -rf $MY/img_test_lmdb
build/tools/convert_imageset --shuffle --resize_width=256 --resize_height=256 /home/moqi/caffe/data/moqi/ $MY/test.txt $MY/img_test_lmdb

echo "All Done.."
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

这里需要注意路径,绝对路径记得是你自己的绝对路径,修改即可。

编辑完成后保存退出,执行脚本文件:

cd ~/caffe/
sudo sh examples/myfile/create_lmdb.sh
  • 1
  • 2

执行过程如下图:

这里写图片描述

执行结束后,在caffe根目录下的examples/myfile下面生成两个文件夹img_train_lmdb和img_test_lmdb,分别用于保存图片转换后的lmdb文件。

这里写图片描述

至此,所有转换过程完成,读者可根据自己的数据集,稍微修改脚本文件即可完成自己的图片数聚集的转换,很方便。

计算图像数据集的均值

在前一篇文章中我们已经知道了如何将自己的图像数据转换为caffe需要的db文件深度学习文章3:将自己的图像数据转换成caffe需要的db(leveldb/lmdb)文件 ,在进行模型的训练之前,我们还需要进行一步,就是计算图像数据集的均值。

1.为什么计算图像数据的均值?

通常来讲,在各类深度学习模型中都具有计算图像均值的操作,这是因为图像减去均值后,再进行训练/测试,会大大提高速度和精度,这是我们在进行大量计算时希望可以达到的效果。

在caffe中,我们如何得到这个均值,实际上就是计算所有训练样本的平均值,计算出来后,保存为一个均值文件,在以后的测试中,就可以直接使用这个均值,而不需要重新对带测试的图像进行计算了。

在实际使用中,计算均值需要产生.binaryproto的均值文件,通常我们可以使用caffe提供的脚本直接计算,此外,如果在之后进行测试时也想使用均值,例如调用python接口,就需要生成python接口.npy文件,这个文件可以由之前.binaryproto文件转换得来。下面我们将就这两个文件的产生进行详述。

2.二进制格式的均值文件

在caffe根目录下的build/tools/文件夹下,caffe为我们提供了计算均值的文件compute_mean.cpp,编译后在caffe根目录下的tools文件夹下,我们可以直接调用,需要注意的是,这里计算需要图像的db文件,我们这里以上篇博文深度学习文章3:将自己的图像数据转换成caffe需要的db(leveldb/lmdb)文件 产生的训练数据db文件为样例,我们之前的db文件存储在caffe根目录下的examples/myfile/img_train_lmdb文件夹下,以此为例,生成二进制格式均值文件:

cd ~/caffe/
sudo build/tools/compute_image_mean examples/myfile/img_train_lmdb examples/myfile/mean.binaryproto
  • 1
  • 2

我们来简单分析下这条指令:

  • 参数一:examples/myfile/img_train_lmdb,这是我们需要计算均值的训练图像数据集的db文件。
  • 参数二:examples/myfile/mean.binaryproto,这是我们计算出来的均值文件的保存位置。

执行结合后可以看到身材高很多个二进制格式均值文件:

这里写图片描述

这个文件请保存好,在之后的模型训练中我们将使用到。

3.python格式所需要的的均值文件

在训练好模型之后,我们往往需要测试自己的单张图片的类别,通常会使用python接口或c++接口编程方式来实现,在python接口的使用中,我们需要使用python格式的均值文件,这里我们先讲解下生成的方法,便于之后直接使用。

计算python格式的均值文件需要两步:

  • 第一步:按照上面生成二进制格式的均值文件的说明生成二进制格式的文件。
  • 第二步:编写python脚本将二进制格式的均值文件转换。

新建一个名为convert_mean.py的文件,

cd ~/caffe/examples/myfile/
sudo gedit convert_mean.py
  • 1
  • 2

具体的python脚本内容如下:

import numpy as np
import sys,caffe

if len(sys.argv)!=3:
    print "Usage: python convert_mean.py mean.binaryproto mean.npy"
    sys.exit()

blob = caffe.proto.caffe_pb2.BlobProto()
bin_mean = open( sys.argv[1] , 'rb' ).read()
blob.ParseFromString(bin_mean)
arr = np.array( caffe.io.blobproto_to_array(blob) )
npy_mean = arr[0]
np.save( sys.argv[2] , npy_mean )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

编辑好之后保存退出,然后调用脚本:

python convert_mean.py mean.binaryproto mean.npy
  • 1

两个参数:

  • 第一个参数:mean.binaryproto,二进制的均值文件名。
  • 第二个参数:mean.npy,生成的python格式均值文件。

我们可以看到生成后的文件:

这里写图片描述

请保存好这个文件,在之后的单张图像的分类测试中,我们将使用到。

使用caffe对自己的图像数据进行训练并测试

之前实践的一些步骤诸如数据集的准备、数据集的转换等过程都是为了训练我们所需要的模型进行铺垫,我们学习caffe的核心目的是使用caffe对我们自己的数据集进行训练,得到较好的模型,并通过模型对新的数据进行分析,这样才能较好的使用caffe分析实际项目并应用到实际领域。

1.将自己的数据集转换为caffe需要的db文件

请参照博主之前的博文深度学习文章3:将自己的图像数据转换成caffe需要的db(leveldb/lmdb)文件 ,将自己的图像数据集转换未caffe需要的db文件,这里我们生成的是文件在caffe根目录下的examples/myfile文件夹例,两个文件夹为img_train_lmdb和img_test_lmdb,分别用于保存图片转换后的lmdb文件。如图:

这里写图片描述

2.将自己的数据集转换为caffe需要的db文件

计算数据集的均值文件,请参照博主之前的博文深度学习文章4:计算图像数据集的均值 ,通过均值,我们将会提高训练的速度和精度,通常建议保留这个操作。我们生成了两个均值文件,均在caffe的根目录下的examples/myfile文件夹里:

  • mean.binaryproto,这是二进制格式的均值文件,是训练时需要的均值文件。
  • mean.npy,这是python接口需要的均值文件,是在对新的图片进行分类时需要的均值文件。

这里写图片描述

3.编写配置文件并训练模型

训练模型的配置文件包括两方面:

  • 参数的配置文件,通常名称为solver.prototxt,这里面主要包含模型的一些参数值,通常以键值对的形式存在,例如:test_iter:100,表示测试迭代次数100次。之后配置文件我们将详细介绍每个参数的含义。
  • 训练网络的配置文件,有时候为一个文件命名为train_val.prototxt,有时候为了细化分为两个文件,分别为train.prototxt和val.prototxt。主要是针对我们所使用的网络层的具体配置。

因为好多同学初学,自己并不了解如何配置参数,也不了解在如何配置更好的网络层次模型,这里为了更好的方便上手,我们将使用caffe自带的caffenet的模型,针对这个模型进行适当修改,先让同学们了解整个训练过程,上手之后再针对细节的地方进行钻研改进。

caffe自带的caffenet模型的相关文件在caffe根目录下的models/bvlc_reference_caffenet/文件夹下,我们将我们需要的两个配置文件,复制到我们自己的myfile文件夹下:

cd ~/caffe/
sudo cp models/bvlc_reference_caffenet/solver.prototxt examples/myfile/
sudo cp models/bvlc_reference_caffenet/train_val.prototxt examples/myfile/
  • 1
  • 2
  • 3

然后,修改第一个配置文件solver.prototxt,

cd ~/caffe/
sudo gedit examples/myfile/solver.prototxt
  • 1
  • 2

将文件内容进行修改如下:

net: "examples/myfile/train_val.prototxt"
test_iter: 2
test_interval: 50
base_lr: 0.001
lr_policy: "step"
gamma: 0.1
stepsize: 100
display: 20
max_iter: 500
momentum: 0.9
weight_decay: 0.005
snapshot: 50
snapshot_prefix: "examples/myfile/myfile_train"
solver_mode: CPU
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

参数列表的意思分别如下:

注:有些参数的理解需要之前对神经网络、卷积神经网络以及深度学习相关模型及算法有一定的了解,如果不了解, 可以直接参照博主的文件配置即可。这里不再详细解释。

  • net:训练的网络模型所在的位置,这里我们是将train(训练)和val(验证)作为一个文件,所以时net,如果分为两个文件,则键值对为tarin_net:训练配置文件的位置,test_net:测试配置文件的位置。
  • test_iter:测试迭代次数,我们每完成一次全部数据的训练,需要进行一次验证,例如这里我们测试迭代次数设为2,是因为我们有100个测试数据,batch_size为50,则test_iter设为100/50=2,就能全cover了。
  • test_interval:测试间隔
  • base_lr:基础学习率
  • lr_policy:学习率的变化规律
  • gamma:学习率的变化指数
  • stepsize:学习率变化频率,结合上面三个可以理解,我们的学习率初始为0.001,每迭代100次,学习率乘以变化指数0.1。
  • display:屏幕日志显示间隔,这是指多久打印依次日志,我们设为每20此迭代打印一次。
  • max_iter:最大迭代次数
  • momentum:动量
  • weight_decay:权值衰减
  • snapshot:保存训练模型的间隔,这里设为每迭代50次保存一个模型文件。
  • snapshot_prefix:保存的模型文件的前缀,例如这里为/examples/myfile/文件夹下面,前缀名为myfile_train,则该模型迭代50次后生成一个myfile_train_iter_50.caffemodel文件,其他同理,这个模型文件保存了我们训练的模型得到的各种参数信息,例如w,b。
  • solver_mode:计算方式,这里博主设置为CPU,如果你们的计算机支持GPU并且已经配置好caffe相关,则可设置为GPU,GPU的计算速度比CPU快好多。

当然,还有一种更为通用的使用python代码生成solver文件的方式,但通常来说,修改即可,这里我们也把python代码放在这里,有需要的可以自行使用:

#coding=utf-8

path='/home/moqi/'
solver_file=path+'solver.prototxt' #solver文件保存位置

kv={}
kv['net']='"examples/myfile/train_val.prototxt"'
kv['test_iter']='2'
kv['test_interval']='50'
kv['base_lr']='0.001'
kv['lr_policy']='"step"'
kv['gamma']='0.1'
kv['stepsize']='100'
kv['display']='20'
kv['max_iter']='500'
kv['momentum']='0.9'
kv['weight_decay']='0.005'
kv['snapshot']='50'
kv['snapshot_prefix']='"examples/myfile/myfile_train"'
kv['solver_mode']='CPU'

def write_solver():
    #写入文件
    with open(solver_file, 'w') as file:
        for key, value in sorted(kv.items()):
            if not(type(value) is str):
                raise TypeError('所有参数必须为字符串')
            file.write('%s: %s\n' % (key, value))
if __name__ == '__main__':
    write_solver()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

有了solver.prototxt文件后,我们还需要修改另一个配置文件,即训练模型net的各层配置,这里我们只需要修改caffenet的data层即可,后面的可以不用修改,因为后面的卷积层、池化层等需要根据不同的项目边训练边调整,我们也可以参照caffe官网提供的一些不同领域的模型,目前还没有一种较为系统的层数设置和选择的方法,需要自行训练修改。两个data层修改如下:

name: "CaffeNet"
layer {
  name: "data"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mirror: true
    crop_size: 227
    mean_file: "examples/myfile/mean.binaryproto"
  }
  data_param {
    source: "examples/myfile/img_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: 227
    mean_file: "examples/myfile/mean.binaryproto"
  }
  data_param {
    source: "examples/myfile/img_test_lmdb"
    batch_size: 50
    backend: LMDB
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

后面的conv卷积层等就不用修改了,之后实际应用中可参照目前主流的配置修改自己的,毕竟修改需要建立在具有卷积神经网络的基础概念和网络模型的了解的基础上,这里就不赘述了。

接下来,就是训练模型:

cd ~/caffe/
sudo build/tools/caffe train -solver examples/myfile/solver.prototxt
  • 1
  • 2

运行的时间和准确率会根据不同的电脑配置即参数设置不同,博主这里训练了两次,均采用CPU计算,第一次准确率96%:

这里写图片描述

第二次准确率94%:

这里写图片描述

运行实践大概在5小时左右,因为博主搭建环境的机器配置较低,并且是CPU模式,如果可以有较好的机器配置,外加GPU+CUDNN,大概时间可缩短到半个小时左右,准确率徘徊在95%左右。

运行后会根据之前solver设置的保存模型的位置生成对应的文件,可以选择准确率较高的模型文件在之后测试新的图像分类时使用:

这里写图片描述

3.使用模型对新的图像进行分类

在对一个新的图片进行分类之前,我们还需要一个deploy.prototxt文件,这个文件和之前模型层次文件类似,只不过首尾不太一样,没有第一层数据输入层,也没有最后的Accuracy层,但最后需要添加一个Softmax层,用于计算分类概率。

这里我们将caffenet的solver.prototxt复制过来使用即可,如果之后自己的设计model的train_val时,记得要将solver.prototxt与其保持一致。

cd ~/caffe/
sudo cp models/bvlc_reference_caffenet/deploy.prototxt examples/myfile/
  • 1
  • 2

接着,还需要一个类别映射文件,我们可以将类别数字代码转换成对应的类别名称,例如之前3-汽车,4-恐龙,5-大象,6-花,7-马。主要注意的是这个文件往往是根据索引来的,最好的时类别数字代码从0开始,即可对应,但如果没有从0开始,像博主一样,就需要添加一个来凑齐索引对应,我的映射文件命名为labels.txt,内容如下:

这里写图片描述

如果你的类名数字从0开始,和索引一致,就不需要加一些来凑齐了。

接下来,我们拿一张新的测试图片,命名为my.jpg,实际类别为大象,这个文件也在myfile/文件夹下:

这里写图片描述

然后我们需要编写代码来对图片应用模型进行分类,这里博主使用python来进行,python的IDE时Eclipse+PyDev插件,代码如下:

Eclipse+PyDev,需要的同学可以根据博主的另一篇博文Eclipse中Python开发环境搭建(Ubuntu16.04) 搭建。

#coding=utf-8
import sys
caffe_root = '/home/moqi/caffe/'
sys.path.insert(0, caffe_root + 'python')

import caffe

import numpy as np

root='/home/moqi/caffe/'   #根目录
deploy=root + 'examples/myfile/deploy.prototxt'    #deploy文件
caffe_model=root + 'examples/myfile/myfile_train_iter_100.caffemodel'   #训练好的 caffemodel
img=root+'examples/myfile/my.jpg'    #随机找的一张待测图片
labels_filename = root + 'examples/myfile/labels.txt'  #类别名称文件,将数字标签转换回类别名称
mean_file=root + 'examples/myfile/mean.npy' #均值文件


net = caffe.Net(deploy,caffe_model,caffe.TEST)   #加载model和network

#图片预处理设置
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape}) #设定图片的shape格式(1,3,28,28)
transformer.set_transpose('data', (2,0,1))    #改变维度的顺序,由原始图片(28,28,3)变为(3,28,28)
transformer.set_mean('data', np.load(mean_file).mean(1).mean(1))    #减去均值
transformer.set_raw_scale('data', 255)    # 缩放到【0,255】之间
transformer.set_channel_swap('data', (2,1,0))   #交换通道,将图片由RGB变为BGR


im=caffe.io.load_image(img) #加载图片
net.blobs['data'].data[...] = transformer.preprocess('data',im)      #执行上面设置的图片预处理操作,并将图片载入到blob中

#执行测试
out = net.forward()
labels = np.loadtxt(labels_filename, str, delimiter='\t')   #读取类别名称文件

prob= net.blobs['prob'].data[0].flatten()#取出最后一层(Softmax)属于某个类别的概率值
top_k = net.blobs['prob'].data[0].flatten().argsort()[-1:-6:-1] 
for i in np.arange(top_k.size): 
    print top_k[i], labels[top_k[i]],prob[top_k[i]]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

需要注意的是一些文件的路径问题,例如deploy文件、训练好的 caffemodel文件(这里用的是迭代100次的)、待测图片、类别名称文件(将数字标签转换回类别名称)、均值文件(之前生成的python接口所需的均值文件,可查看前篇博文)。

运行结束后,可以看到结果:

这里写图片描述

可以看到属于大象的概率0.99,恐龙0.003,汽车0.0015,花0.0004,马0.0003,所以,这个待测图片属于大象类别,与实际相符。

4.题后语

至此,我们已经实际的将一个模型搭建起来,并可以进行应用,但具体实际的模型层次设计,需要根据不同的应用领域不同编写,这就需要很好的理论学习,这里我们更多说的时实际操作,博主之后会就神经网络以及深度学习的相关理论知识写出博文,敬请期待,希望大家对博文不合适的地方提出来,交流改正。


阅读更多
个人分类: caffe
上一篇caffe笔记
下一篇caffe笔记3(matlab程序)
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭