用 C++ 接口和训练好的 caffemodel 对图像分类

需要以下文件

  • 训练好的 model 文件。文件已存在,假设所在路径为 ~/caffe/model/iter120.caffemodel
  • 训练 model 时用到的均值文件。文件已存在,假设所在路径为 ~/caffe/examples/myfile/mean.binaryproto
  • 新编写一份清单文件 words.txt
  • 一个由 train_val.prototxt 修改而来的 deploy.prototxt 模型文件
  • 待分类图像,假设路径为 ~/caffe/image/unknow.jpg

编写清单文件

在 ~/caffe/examples/myflie 下新建 words.txt。文档第一行为训练模型标号 0 号的分类名,第二行为模型标号 1 号的分类名,等等。

例如,训练模型贴标签时,将大象标记为 3 号,将标记为 4 号,将标记为 5 号,将 标记为 6 号,将恐龙标记为 7 号,那么在编写清单文件 words.txt 时,第一行填 0,第二行填 1,第三行填 2,第四行填大象,第五行填,第六行,第七行,第八行恐龙,第九行填8,...。最后总行数为模型文件 train_val.prototxt 中 fc8 层 num_output 数。

用 C++ 接口和训练好的 caffemodel 对图像分类_第1张图片
train_val.prototxt的fc8层num_output: 15
用 C++ 接口和训练好的 caffemodel 对图像分类_第2张图片
分15类(其实是分5类,其他用数字凑数)

修改模型文件

若训练模型时用的 caffe 自带模型 ~/caffe/models/bvlc_reference_caffenet 下的 solver.prototxt 和 train_val.prototxt ,那么直接使用该文件夹下的 deploy.prototxt 即可。

注意,deploy.prototxt 中 fc8 层的num_output值应与 train_val.prototxt 的相同,其为所分类数。

用 C++ 接口和训练好的 caffemodel 对图像分类_第3张图片
deploy的fc8层num_output也为15

进行分类

在~/caffe目录输入以下命令:

./build/examples/cpp_classification/classification.bin \
examples/myfile/deploy.prototxt \
models/re/_iter_120.caffemodel \
examples/myfile/mean.binaryproto \
examples/myfile/words.txt \
examples/images/unknow.jpg

五个参数:

第一个参数:deploy 配置文件
第二个参数:caffemodel 文件
第三个参数:均值文件
第四个参数:标签清单文件
第五个参数:待分类的图片

分类结果如下。


用 C++ 接口和训练好的 caffemodel 对图像分类_第4张图片
分类结果
用 C++ 接口和训练好的 caffemodel 对图像分类_第5张图片
unknow.jpg

参考资料

http://www.cnblogs.com/denny402/p/5111018.html
http://www.datakit.cn/blog/2015/08/03/caffe_introduction.html

你可能感兴趣的:(用 C++ 接口和训练好的 caffemodel 对图像分类)