Caffe(20):用训练好的caffemodel来进行分类
2017-06-02 16:10
471 查看
caffe程序自带有一张小猫图片,存放路径为caffe根目录下的 examples/images/cat.jpg, 如果我们想用一个训练好的caffemodel来对这张图片进行分类,那该怎么办呢? 如果不用这张小猫图片,换一张别的图片,又该怎么办呢?如果学会了小猫图片的分类,那么换成其它图片,程序实际上是一样的。 开发caffe的贾大牛团队,利用imagenet图片和caffenet模型训练好了一个caffemodel, 供大家下载。要进行图片的分类,这个caffemodel是最好不过的了。所以,不管是用c++来进行分类,还是用python接口来分类,我们都应该准备这样三个文件: 1 caffemodel文件 以直接在浏览器里输入地址下载,也可以运行脚本文件下载。下载地址为:http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel 文件名称为:bvlc_reference_caffenet.caffemodel,文件大小为230M左右,为了代码的统一,将这个caffemodel文件下载到caffe根目录下的 models/bvlc_reference_caffenet/ 文件夹下面。也可以运行脚本文件进行下载:
# sudo ./scripts/download_model_binary.py models/bvlc_reference_caffenet
2 均值文件 有了caffemodel文件,就需要对应的均值文件,在测试阶段,需要把测试数据减去均值。这个文件我们用脚本来下载,在caffe根目录下执行:
# sudo sh ./data/ilsvrc12/get_ilsvrc_aux.sh
执行并下载后,均值文件放在 data/ilsvrc12/ 文件夹里。 3 sysnet_words.txt文件 在调用脚本文件下载均值的时候,这个文件也一并下载好来,里面方的是1000个类的名称。 数据准备好,就可以进行分类,我们有C++和python两种分类方法
一 、C++方法
在caffe根目录下的examples/cpp-aclssification/文件夹下面,有一个classification.cpp文件,就是用来分类的。当编译后,放在build/examples/cpp_aclssification/下面
我们直接运行命令:
# sudo ./build/examples/cpp_classification/classification.bin \ models/bvlc_reference_caffenet/deploy.prototxt \ models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel \ data/ilsvrc12/imagenet_mean.binaryproto \ data/ilsvrc12/synset_words.txt \ examples/images/cat.jpg
命令很长,用了很多的\符号来换行。可以看出,从第二行开始就是参数,每行一个,共需要4个参数 运行成功后,输出top-5结果:
------- Prediction for examples/images/cat.jpg ------ 0.3134 - "n02123045 tabby, tabby cat" 0.2380 - "n02123159 tiger cat" 0.1235 - "n02124075 Egyptian cat" 0.1003 - "n02119022 red fox, Vulpes vulpes" 0.0715 - "n02127052 lynx, catamount"
即有0.3134的概率为tabby cat, 有0.2380的概率为tiger cat ......
二、python方法
python接口可以使用jupyter notebook来进行可视化操作。这里我们编写一个py文件,命名为py-classify.py
python接口可以使用jupyter notebook来进行可视化操作,因此推荐使用这种方法。
在这里我就不用可视化了,编写一个py文件,命名为py-classify.py
#coding=utf-8 #加载必要的库 import numpy as np import sys,os #设置当前目录 caffe_root = '/home/xxx/caffe/' sys.path.insert(0, caffe_root + 'python') import caffe os.chdir(caffe_root) net_file=caffe_root + 'models/bvlc_reference_caffenet/deploy.prototxt' caffe_model=caffe_root + 'models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel' mean_file=caffe_root + 'python/caffe/imagenet/ilsvrc_2012_mean.npy' net = caffe.Net(net_file,caffe_model,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(mean_file).mean(1).mean(1)) transformer.set_raw_scale('data', 255) transformer.set_channel_swap('data', (2,1,0)) im=caffe.io.load_image(caffe_root+'examples/images/cat.jpg') net.blobs['data'].data[...] = transformer.preprocess('data',im) out = net.forward() imagenet_labels_filename = caffe_root + 'data/ilsvrc12/synset_words.txt' labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\t') 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]]
执行这个文件,输出:
281 n02123045 tabby, tabby cat 282 n02123159 tiger cat 285 n02124075 Egyptian cat 277 n02119022 red fox, Vulpes vulpes 287 n02127052 lynx, catamount
caffe开发团队实际上也编写了一个python版本的分类文件,路径为python/classify.py 运行这个文件需要两个参数,一个输入图片文件,一个结果输出文件。而且运行必须在python目录下面;
cd python sudo python calssify.py ../examples/images/cat.jpg result.npy
分类结果保存为当前目录下的result.npy文件里面,是看不见的,而且这个文件有错误,运行时会提示 Mean shape incompatible with input shape 的错误。因此,要使用这个文件,还需要进行修改: 1、修改均值计算 定位到
mean =np.load(args.mean_file)
在这一行下面加上:
mean =mean.mean(1).mean(1)
则可以解决报错问题 2、修改文件,使得结果显示在命令行下: 定位到;
#classify start = time.time() predictions = classifier.predict(inputs, not args.center_only) print("Done in %.2f s." % (time.time() - start))
在这个地方,后面加上几行;
# Classify. start = time.time() predictions = classifier.predict(inputs, not args.center_only) print("Done in %.2f s." % (time.time() - start)) imagenet_labels_filename = '../data/ilsvrc12/synset_words.txt' labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\t') top_k = predictions.flatten().argsort()[-1:-6:-1] for i in np.arange(top_k.size): print top_k[i], labels[top_k[i]]
相关文章推荐
- Caffe学习系列(20):用训练好的caffemodel来进行分类
- Caffe学习系列:用训练好的caffemodel来进行分类
- Caffe学习系列:用训练好的caffemodel来进行分类
- Caffe学习系列(20):用训练好的caffemodel来进行分类
- Caffe_Windows学习笔记(五)用训练好的caffemodel来进行分类
- Caffe学习系列(20):用训练好的caffemodel来进行分类
- Caffe学习系列:用训练好的caffemodel来进行分类
- Caffe学习系列(20):用训练好的caffemodel来进行分类
- Caffe学习系列(20):用训练好的caffemodel来进行分类
- 用训练好的caffemodel来进行分类
- 用训练好的caffemodel来进行分类
- 用训练好的caffemodel来进行分类
- 用训练好的caffemodel来进行分类
- Windows下caffe用fine-tuning训练好的caffemodel来进行图像分类
- 用训练好的caffemodel对单个/批量图片进行分类
- 用训练好的caffemodel来进行分类
- 用训练好的caffemodel来进行分类
- 【神经网络与深度学习】用训练好的caffemodel来进行分类
- 机器学习 - 使用训练好的Caffemodel 网络进行分类
- 使用训练好的googlenet caffemodel进行图片分类