本文档描述是:如果已经训练好了一个Caffe网络,如何利用这个网络进行图像的分类。
以下以mnist网络为例。
mnist是用来分类手写数字0-9的。当用户写好一个数字后,图像进入mnist网络,然后网络计算出每个数的概率,认为读到的是概率最大的数。
安装python
打开这个文件。该文件import了Caffe相关的文件,然后读入arg中的参数,如input_file、output_file、model_def、pretrained_model等等,有些参数看起来与我们要用的无关,例如channel_swap (mnist输入的是黑白图像,只有单个通道)、input_scale(默认为1)等等,但是这些参数的代码段千万不能删除,删除可能导致之后调用python时出错。如果你觉得在终端中输入这些参数太麻烦,可以加个【dafault=你希望的默认值】
修改参数
将参数中的"--model_def"的值改为网络结构的prototxt,例如我是这样改的:
parser.add_argument(
"--model_def",
default=os.path.join(pycaffe_dir,
"../../examples/mnist/lenet.prototxt"),
help="Model definition file."
)
将参数pretrained_model改为之前训练好的参数文件,例如我是这样改的:
parser.add_argument(
"--pretrained_model",
default=os.path.join(pycaffe_dir,
"../../examples/mnist/lenet_iter_10000.caffemodel"),
help="Trained model weights file."
)
由于mnist要求输入的图像是灰度图像,因此需要将RGB图转换为灰度图,并更改channel_swap:
在文件的开头加入
from skimage.color import rgb2gray
在将图片读入inputs后将RGB图转换为灰度图
inputs = [rgb2gray(input) for input in inputs]
更改channel_swap:
channel_swap = [0]
.py文件更改就是这样了,如果你的模型不一样,需要采取不一样的更改,举一反三。
准备好一张图片作为输入图片,这张图片必须是28*28大小的JPEG格式图片,内容是随意的,但是毕竟mnist用于分类数字,我们用windows的画图工具画好一个黑底白字的数字’0’,然后把这个图片传到$CAFFE_ROOT\examples\mnist下,命名为testformnist0.jpg
进入终端:
cd $CAFFE_ROOT
python examples/mnist/classifytest.pyexamples/mnist/testformnist0.jpg output
第一个参数是python,表示使用python去执行第二个参数。第三个参数是输入文件的位置input_file,第四个参数是输出文件的位置output_file
结果如下:
其中Probability(input==’0’)=0.967,网络正确的分类了这个图片。
如果想要显示中间的某个结果,则可以通过修改网络结构定义文件来实现。例如,我想要看看在softmax_loss层之前的结果是什么:
打开lenet_prototxt
文件最后是
layers {
name: "prob"
type: SOFTMAX
bottom: "ip2"
top: "prob"
}
表示有个层,输入ip2(inner_product2),输出prob(每个数的概率),层的类型是softmax,并且综合整个网络结果,这个层是最顶层,其输出将会作为整个网络的输出。
因此我们只需要删除这个层,那么以前的最顶层就被次顶层替代了,次顶层的结果就是softmax之前的运算结果。
删除之后再运行python:
完全看不懂了是不是?
确实是这样的,deep learning网络的参数和运行结果很不容易理解,某些时候确实需要网络的中间结果。