如何调用 caffe 训练好的模型对输入图片进行测试
该部分包括两篇文章
- win10 下 caffe 的第一个测试程序(附带详细讲解) 主要讲解如何利用 caffe 来训练模型。
- 如何调用 caffe 训练好的模型对输入图片进行测试 主要介绍利用已经训练好的模型进行预测。
对 caffe 来说常用的有两种接口,一种是通过 C++ 接口, 另一种是通过 python 接口。这里以 caffe 中自带的 mnist 手写数据集为例。
训练好模型之后,应该如何调用训练好的模型了。其实训练的过程就是对网络进行前向传播,计算最后的输出结果,也即模型的预测结果,所以输入的网络模型应该是去除了反向传播过程的,比如求loss。通过下面的对比可以非常清晰的看到区别。第一张为训练模型时的网络,第二张图为预测时的网络。
被测试的图片可以自己准备测试的图片,也可以从 mnist 数据集中提取。如果是从数据集中提取可以参考 mnist数据集转换为图片+测试手写字的demo。这里直接用画板手写一个数字的图片来进行测试。需要注意的是这张图片应该是 28 * 28 pix, 然后为256的二值图像。下图是我用的测试图像(放大了12倍的效果)。
1. C++ 接口
在 examples/cpp_classification 文件夹下有 classification.cpp 文件,其中定义了 Classifier 类, 用来进行测试,需要注意的是这个 class 是基于 opencv 的,所以对于不想折腾 opencv 的朋友, 可以选择 python 接口。
但是对于 C++ 接口,比较麻烦的是 vs 的环境配置,需要弄好所以的依赖性,是一件很麻烦的事情。具体可以参考 CAFFE安装笔记[windows和ubuntu]。coding 部分比较简单,直接把 classification.cpp 的main() 函数部分修改一下就可以了,这里不再赘述。
2. python 接口
相比 C++ 接口,python接口使用起来更为方便,当然实际应用中很多都是部署到 C++ 应用中。为了方便,这里利用 jupyter 来进行测试。当然首先要保证你已经配置好了 caffe 的 python 接口。 代码如下。
# set up Python environment: numpy for numerical routines, and matplotlib for plotting
import numpy as np
import matplotlib.pyplot as plt
# display plots in this notebook
%matplotlib inline
# set display defaults
plt.rcParams['figure.figsize'] = (10, 10) # large images
plt.rcParams['image.interpolation'] = 'nearest' # don't interpolate: show square pixels
plt.rcParams['image.cmap'] = 'gray' # use grayscale output rather than a (potentially misleading) color heatmap
# The caffe module needs to be on the Python path;
# we'll add it here explicitly.
import sys
caffe_root = 'C:/Projects/caffe/' # this file should be run from {caffe_root}/examples (otherwise change this line)
sys.path.insert(0, caffe_root + 'python')
import caffe
# If you get "No module named _caffe", either you have not built pycaffe or you have the wrong path.
import os
if os.path.isfile(caffe_root + 'examples/mnist/lenet_iter_10000.caffemodel'):
print('CaffeNet found.')
else:
print('Downloading pre-trained CaffeNet model...')
caffe.set_mode_cpu()
model_def = caffe_root + 'examples/mnist/lenet.prototxt'
model_weights = caffe_root + 'examples/mnist/lenet_iter_10000.caffemodel'
IMAGE_FILE ='F:\\VS_Project\\opencv_test\\opencv_test\\gray_9.jpg'
input_image=caffe.io.load_image(IMAGE_FILE,color=False)
net =caffe.Classifier(model_def,model_weights)
prediction=net.predict([input_image],oversample=False)
caffe.set_mode_cpu()
print('predicted class:', prediction[0].argmax())
除此之外也可以参考官方的资料 Classification: Instant Recognition with Caffe。在官方的资料中的是用的另外一种方法,较上面的功能更为强大,可以观察更多的输出,比如中间层的输出,感兴趣的朋友也可以仔细研究下。