利用训练好的Caffe网络得到输入图像的分类

本文档描述是:如果已经训练好了一个Caffe网络,如何利用这个网络进行图像的分类。

以下以mnist网络为例。

mnist是用来分类手写数字0-9的。当用户写好一个数字后,图像进入mnist网络,然后网络计算出每个数的概率,认为读到的是概率最大的数。

        安装python

        使用网络需要用到python,因此请安装好python,并将路径设置好,详见http://caffe.berkeleyvision.org/installation.htmlPython and/or Matlab wrapper(optional)章节
        
         找到$CAFFE_ROOT\python\classify.py,将其复制到另外一个地方,例如$CAFFE_ROOT\examples\mnist,命名为classifytest.py

 

         打开这个文件。该文件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网络的参数和运行结果很不容易理解,某些时候确实需要网络的中间结果。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章