自己动手建立第一个caffe分类C++工程笔记

自己动手建立第一个caffe分类C++工程笔记
![深度学习是当前最热门的方向之一,它给各个行业带来了新的研究点。为了能够跟上潮流,开拓新的研究方向,我开始着手学习caffe。我使用的是caffe-windows版,为什么使用caffe,因为我还有点c++基础,为什么使用windows?因为我的专业相关程序都是在windows下编的,结合起来方便。
下面记录一下一个两眼一抹黑的人怎么一点点建立起一个简单的分类测试程序的。
第一步,了解理论。我读的书是《图解深度学习》,这本书写的易懂,无需花太多时间就能读完。
读完这本书后,对深度学习将会有一个基本的概念。
第二步,下载编译caffe库。这里我参考的博文是:https://www.cnblogs.com/jerrybaby/p/8385227.html。
只要按照这篇博文一步步做就能编译成功,得到lib文件目录下的静态库,待用。
自己动手建立第一个caffe分类C++工程笔记
我这里使用了cup_only的设置,因为我的机器没有GPU。
第三步,建立一个自己的caffe工程。最开始,我不知道怎么用生成的caffe库,大大的尴尬,小白飘过。查看了众多博文,终于找到了灵感。主要参考博文https://blog.csdn.net/qq_14845119/article/details/52541622#reply%E3%80%82,但不是按照它一步步来做的。具体实施过程如下:
3.1 在vs2013中建立一个空的工程caffe_NetTest; 自己动手建立第一个caffe分类C++工程笔记
什么也没有的工程。

3.2 把caffe-windows\examples\cpp_classification目录下的classification.cpp拷到上面的工程中。

自己动手建立第一个caffe分类C++工程笔记

3.3 添加依赖包。
直接编译,当然不能通过。然后查网上的资料,caffe需要多个依赖包。原本我想一个个下载编译,忙活半天后,细细思量,既然之前caffe工程能顺利编译成功,证明电脑里肯定已经下载过了依赖包。于是打开caffe的工程,对照caffe工程设置,完成依赖包的添加:

自己动手建立第一个caffe分类C++工程笔记
自己动手建立第一个caffe分类C++工程笔记
自己动手建立第一个caffe分类C++工程笔记

添加静态库:

自己动手建立第一个caffe分类C++工程笔记
自己动手建立第一个caffe分类C++工程笔记

将上述设置完成后,编译程序可以通过。

3.5 将caffe-wd\examples\cpp_classification\Debug目录下的.dll文件拷到debug下,release模式拷贝相对应的release目录下的.dll文件。

3.6 准备
deploy.prototxt
bvlc_reference_caffenet.caffemodel
imagenet_mean.binaryproto
synset_words.txt
cat.jpg

来自 <https://blog.csdn.net/qq_14845119/article/details/52541622#reply%E3%80%82> 

作为一个菜鸟,一切都是菜的。我找了半天这几个文件才找全。
bvlc_reference_caffenet.caffemodel下载地址:
http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel

来自 <https://blog.csdn.net/qq_28424679/article/details/78331541> 
然后是
imagenet_mean.binaryproto
synset_words.txt
下载地址:
http://dl.caffe.berkeleyvision.org/caffe_ilsvrc12.tar.gz
解压找到需要的文件。
deploy.prototxt在哪找呢?
在源文件夹的caffe-windows\models\bvlc_reference_caffenet中。
最后是猫的照片cat.jpg:
在源文件夹的caffe-windows\examples\images中。
将上述文件装在一个文件夹中,路径:
C:\working\programfile\caffeNetTest\input

自己动手建立第一个caffe分类C++工程笔记

3.7 修改主程序如下:

int main(int argc, char** argv) {
	
	argc = 6;
	if (argc != 6) {
		std::cerr << "Usage: " << argv[0]
			<< " deploy.prototxt network.caffemodel"
			<< " mean.binaryproto labels.txt img.jpg" << std::endl;
		return 1;
	}

	::google::InitGoogleLogging(argv[0]);

	/*string model_file = argv[1];
	string trained_file = argv[2];
	string mean_file = argv[3];
	string label_file = argv[4];*/
	
	string model_file = "C:\\working\\programfile\\caffeNetTest\\input\\deploy.prototxt";
	string trained_file = "C:\\working\\programfile\\caffeNetTest\\input\\bvlc_reference_caffenet.caffemodel";
	string mean_file = "C:\\working\\programfile\\caffeNetTest\\input\\imagenet_mean.binaryproto";
	string label_file = "C:\\working\\programfile\\caffeNetTest\\input\\synset_words.txt";

	Classifier classifier(model_file, trained_file, mean_file, label_file);

	//string file = argv[5];
	string file = "C:\\working\\programfile\\caffeNetTest\\input\\cat.jpg";
	std::cout << "---------- Prediction for "
		<< file << " ----------" << std::endl;

	cv::Mat img = cv::imread(file, -1);
	CHECK(!img.empty()) << "Unable to decode image " << file;
	std::vector<Prediction> predictions = classifier.Classify(img);

	/* Print the top N predictions. */
	for (size_t i = 0; i < predictions.size(); ++i) {
		Prediction p = predictions[i];
		std::cout << std::fixed << std::setprecision(4) << p.second << " - \""
			<< p.first << "\"" << std::endl;
	}
}
#else
int main(int argc, char** argv) {
	LOG(FATAL) << "This example requires OpenCV; compile with USE_OPENCV.";
}
#endif  // USE_OPENCV

3.8 运行然后分类完成!

以上就是我跌跌爬爬的经验,分享出来。
建立第一个工程后,结合一些任务,训练自己的网络,深入理解DL的细节。
参考学习文籍:《深度学习——21天实战Caffe》