【问题标题】:Caffe - MNSIT - How do I use the network on a single image?Caffe - MNIST - 如何在单个图像上使用网络?
【发布时间】:2017-02-18 20:39:57
【问题描述】:

我正在使用 Caffe (http://caffe.berkeleyvision.org/) 进行图像分类。我在 Windows 上使用它,一切似乎都编译得很好。

为了开始学习,我遵循了 MNIST 教程 (http://caffe.berkeleyvision.org/gathered/examples/mnist.html)。我下载了数据并运行了 ..\caffe.exe train --solver=...examples\mnist\lenet_solver.prototxt。它运行了 10.000 次迭代,打印出准确度为 98.5,并生成了两个文件:lenet_iter_10000.solverstate 和 lenet_iter_10000.caffemodel。

所以,虽然尝试对自己的图像进行分类会很有趣,但应该很容易吧?

我可以找到以下资源:https://software.intel.com/en-us/articles/training-and-deploying-deep-learning-networks-with-caffe-optimized-for-intel-architecture#Examples 告诉我如何准备、训练和计时我的模型。但是每次教程/文章实际上将单个实例放入 CNN 时,他们都会跳到下一点并告诉下载一些新模型。一些资源告诉使用分类器.bin/.exe,但这个文件需要一个 imagenet_mean.binaryproto 或类似的 mnist。我不知道在哪里可以找到或生成此文件。

简而言之:当我使用 Caffe 训练 CNN 时,如何输入单个图像并使用我已有的文件获取输出?

更新:根据帮助,我让网络识别图像,但即使网络的准确率为 99.0%,识别也不正确。我使用以下 python 代码来识别图像:

NET_FILE = 'deploy.prototxt'
MODEL_FILE = 'lenet_iter_10000.caffemodel'
net = caffe.Net(NET_FILE, MODEL_FILE, caffe.TEST)

im = Image.open("img4.jpg")
in_ = np.array(im, dtype=np.float32)
net.blobs['data'].data[...] = in_
out = net.forward() # Run the network for the given input image
print out;

我不确定我是否为 MNIST 示例正确格式化了图像。图片是28x28灰度图片,基础4。我需要对图片做更多的变换吗?

网络(部署)如下所示(开始和结束):

input: "data"
input_shape {
  dim: 1 # batchsize
  dim: 1 # number of colour channels - rgb
  dim: 28 # width
  dim: 28 # height
}

....

layer {
  name: "loss"
  type: "Softmax"
  bottom: "ip2"
  top: "loss"
}

【问题讨论】:

    标签: neural-network caffe convolution pycaffe


    【解决方案1】:

    如果我正确理解了这个问题,那么您有一个经过训练的模型,并且您想使用您自己的输入图像来测试该模型。有很多方法可以做到这一点。

    我常用的一种方法是运行类似于我所拥有的here 的python 脚本。

    请记住,您必须使用 make pycaffe 在 caffe 中构建 python,并通过编辑 sys.path.append('../../../python') 行指向文件夹

    还将以下行编辑为您的模型文件名。

    NET_FILE = 'deploy.prototxt'
    MODEL_FILE = 'fcn8s-heavy-pascal.caffemodel'
    

    编辑以下行。您应该使用网络的最后一层来获取输出,而不是 score。

    out = net.blobs['score'].data
    

    【讨论】:

    • 谢谢。我启用了 python,它似乎正在工作。我明天会测试你的方法:)
    • 查看更新,您知道为什么它不起作用吗?
    【解决方案2】:

    您需要从原始 network.prototxt 文件创建一个 deploy.prototxt 文件。数据层必须如下所示:

    input: "data"
    input_shape {
      dim: 1
      dim: [channles]
      dim: [width]
      dim: [height]
    }
    

    将 [channels]、[width] 和 [height] 替换为图像的正确值。

    您还需要删除任何将“标签”作为其底部输入的层(这通常只是您的损失层)。

    然后,您可以使用此 deploy.prototxt 文件来使用 MATLAB 或 PYTHON 测试您的输入。

    【讨论】:

    • 查看更新,您知道为什么它不起作用吗?
    • 使用 caffe.io.load_image 读取图像。我相信 caffe 在加载图像时会转置图像。或者在输入网络之前尝试转置您的图像。
    猜你喜欢
    • 2015-07-31
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 2016-09-28
    相关资源
    最近更新 更多