机器学习 - 使用训练好的Caffemodel 网络进行分类

在之前的博客里我已经写过 CaffeModel的文件了,这个就是我们训练的网络结果。

现在既然已经有了训练好的模型,就要开始通过这个网络进行自己的分类了。

准备内容

  1. 首先找到训练好的 .caffemodel文件。
  2. 然后准备网络模型的 deploy.prototxt
  3. 准备训练时候使用的均值文件imagenet_mean.binaryproto
  4. 新建一个label.txt文件里面写上你的各个类的名字(注意顺序)
  5. 要分类的文件:1.jpg

解释一下 deploy.prototxt文件并不是你训练的时候使用的 train_val.prototxt文件,因为是分类所以deploy.prototxt把训练的内容部分全部给删除了。所以如果没有deploy.prototxt的话,请自己写一份,仿照其他网络的样例。

其次binaryproto文件是训练时候使用的均值文件,不是分类生成的。

然后就是label.txt就是标签文件,里面每行是一个内容,我的标签文件里面是:

down
sitdown
standup
handup
1
2
3
.
.
.
996

我这里面一共有4类,但是有1000行,是因为我训练的时候忘了修改train_val.prototxt里面的输出向量的大小了。所以用数字替补了。如果你训练的时候修改过train_val.prototxtinner_product_paramnum_output的值,那么对应的你这个标签文件里也写多少行就可以了。然后deploy.prototxt也要一样。

分类

Caffe可以通过 C++方法也可以通过 Python方法或者直接命令行方法来分类,我自己只测试了使用 C++的方法

C++方法分类

在 caffe下面有写好的 C++文件:

caffe/build/examples/cpp_classification/classification.bin

这个是编译好的 classification.bin的可执行文件,其源代码在:

caffe/examples/cpp_classification/classification.cpp

如果要修改,在这里修改之后编译。

然后在caffe根目录下新建一个classification_test.sh文件,里面的内容如下:

#!/bin/bash
./build/examples/cpp_classification/classification.bin \
    examples/imgsnet/bvlc_alexnet/deploy.prototxt \
    examples/imgsnet/bvlc_alexnet/caffe_alexnet_train_iter_1000.caffemodel \
    examples/imgs/data/imagenet_mean.binaryproto \
    examples/imgs/data/label.txt \
    examples/imgs/data/val/down/1.jpg

这里的文件位置,请自行指定,我这个文件里面的位置都是我网络的。

然后会输出类似的内容:

---------- Prediction for examples/imgs/data/val/down/20170309_163509_down.jpg ----------
0.9756 - "down"
0.0229 - "sitdown"
0.0016 - "standup"
0.0000 - "handup"
0.0000 - "59"

前面是概率,后面是对应的 label,输出的 top 5的预测。

错误解决

问题1:

F0329 12:55:18.108248  8610 classification.cpp:82] Check failed: labels_.size() == output_layer->channels() (4 vs. 1000) Number of labels is different from the output layer dimension.

说明你label.txt的内容长度和 deploy.prototxt的长度不一致,说lebel.txt的长度是4而deploy.prototxt里的 output_num的内容长度是1000. 这里的解决办法是,其中一个改成一样的长度就行了。


问题2:

F0329 15:48:14.703812  9905 net.cpp:757] Cannot copy param 0 weights from layer 'fc8'; shape mismatch.  Source param shape is 1000 4096 (4096000); target param shape is 4 4096 (16384). To learn this layer's parameters from scratch rather than copying from a saved net, rename the layer.

这个问题说的是你网络训练的文件train_val.prototxt里的output_numdeploy.prototxtoutput_num长度不一致。

所以我最后的解决办法就是,把所有长度以train_val.prototxt的写的输出向量长度为准。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值