1 概述
由于需求最经需要做火焰检测,一开始是想着用传统的机器学习算法去做,后来发现目前的火焰检测都是基于颜色来做的,在实际场景中经常会因为路灯和太阳等外部的影响导致很严重的误报,后来定了用深度学习进行火焰检测都图像进行分类图片是否发生火灾,训练数据集是张**在网上爬虫爬了几千张数据,主要是基于caffe框架训练的模型,要是想着在工程中应用,就必须想着用vs2013直接调用caffe的c++接口进行分类。
在网上查了一下是可以直接用vs2013调用caffe接口进行分类,先关的资源链接如下:
http://blog.csdn.net/sinat_30071459/article/details/50974695
http://blog.csdn.net/qq_14845119/article/details/52541622
之前王**已经在Windows下成功的用vs2013工程调用caffe的接口,主要是用了caffe工程编译时自动下载的NugetPackages这个依赖的第三库和caffe自己编译生成的libcaffe.lib和依赖的include头文件。下面可以详细的介绍如何建立工程和配置工程的。
自己建一个vs2013的控制台工程选择release的x64,因为依赖的第三库的头文件和lib文件以及dll都在NugetPackages这个文件里如图1所示,所以可以直接将这个文件夹拷贝到你新建工程中,接着将caffe编译时生成的libcaffe.lib文件和相应的include也拷贝出来放在新建的一个文件夹caffelib中如图2所示。
图1
图2
其中include文件夹是直接从caffe-master中拷过来的,lib文件夹中保存的是从….\caffe-master\Build\x64\Release中拷过来的libcaffe.lib
注:要在自己建的工程在release下进行一下设置(由于caffe.sln重新生成是在release下生成的,libcaffe.lib必须在相同的模式下使用)
注:在之前的工程中一直用release的caffe静态库在调试程序的时候真是太难受了,后面发现Windows下caffe也可以编译debug版本。其实debug下的配置和release下面的几乎差不多,就是加载库文件的几个路径不一样和链接输入中的opencv的库文件不一样,其他的是一样的。
2 Release下面:
1在包含目录里添加:
D:\[Project]\classificationT\classificationT\caffelib\include
D:\[Project]\classificationT\classificationT\caffelib\include\caffe
D:\[Project]\classificationT\classificationT\caffelib\include\caffe\proto
D:\[Project]\classificationT\classificationT\NugetPackages\boost.1.59.0.0\lib\native\include
D:\[Project]\classificationT\classificationT\NugetPackages\gflags.2.1.2.1\build\native\include
D:\[Project]\classificationT\classificationT\NugetPackages\glog.0.3.3.0\build\native\include
D:\[Project]\classificationT\classificationT\NugetPackages\protobuf-v120.2.6.1\build\native\include
D:\[Project]\classificationT\classificationT\NugetPackages\OpenBLAS.0.2.14.1\lib\native\include
D:\[Project]\classificationT\classificationT\NugetPackages\OpenCV.2.4.10\build\native\include
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\include
2在库目录里添加:
D:\[Project]\classificationT\classificationT\caffelib\lib
D:\[Project]\classificationT\classificationT\NugetPackages\boost_date_time-vc120.1.59.0.0\lib\native\address-model-64\lib
D:\[Project]\classificationT\classificationT\NugetPackages\boost_filesystem-vc120.1.59.0.0\lib\native\address-model-64\lib
D:\[Project]\classificationT\classificationT\NugetPackages\boost_system-vc120.1.59.0.0\lib\native\address-model-64\lib
D:\[Project]\classificationT\classificationT\NugetPackages\boost_thread-vc120.1.59.0.0\lib\native\address-model-64\lib
D:\[Project]\classificationT\classificationT\NugetPackages\boost_chrono-vc120.1.59.0.0\lib\native\address-model-64\lib
D:\[Project]\classificationT\classificationT\NugetPackages\glog.0.3.3.0\build\native\lib\x64\v120\Release\dynamic
D:\[Project]\classificationT\classificationT\NugetPackages\protobuf-v120.2.6.1\build\native\lib\x64\v120\Release
D:\[Project]\classificationT\classificationT\NugetPackages\OpenBLAS.0.2.14.1\lib\native\lib\x64
D:\[Project]\classificationT\classificationT\NugetPackages\hdf5-v120-complete.1.8.15.2\lib\native\lib\x64
D:\[Project]\classificationT\classificationT\NugetPackages\OpenCV.2.4.10\build\native\lib\x64\v120\Release
D:[Project]\classificationT\classificationT\NugetPackages\gflags.2.1.2.1\build\native\x64\v120\dynamic\Lib
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\lib\x64
3 在附加依赖项里添加:
libcaffe.lib
libopenblas.dll.a
libprotobuf.lib
opencv_highgui2410.lib
opencv_core2410.lib
opencv_imgproc2410.lib
libglog.lib
gflags.lib
hdf5.lib
hdf5_hl.lib
cublas.lib
cuda.lib
curand.lib
cudart.lib
3 Debug下面:
1 在包含目录里添加:
D:\[Project]\classificationT\classificationT\caffelib\include
D:\[Project]\classificationT\classificationT\caffelib\include\caffe
D:\[Project]\classificationT\classificationT\caffelib\include\caffe\proto
D:\[Project]\classificationT\classificationT\NugetPackages\boost.1.59.0.0\lib\native\include
D:\[Project]\classificationT\classificationT\NugetPackages\gflags.2.1.2.1\build\native\include
D:\[Project]\classificationT\classificationT\NugetPackages\OpenBLAS.0.2.14.1\lib\native\include
D:\[Project]\classificationT\classificationT\NugetPackages\OpenCV.2.4.10\build\native\include
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\include
2 在库目录里添加:
D:\[Project]\classificationT\classificationT\caffelib\lib
D:\[Project]\classificationT\classificationT\NugetPackages\boost_date_time-vc120.1.59.0.0\lib\native\address-model-64\lib
D:\[Project]\classificationT\classificationT\NugetPackages\boost_filesystem-vc120.1.59.0.0\lib\native\address-model-64\lib
D:\[Project]\classificationT\classificationT\NugetPackages\boost_system-vc120.1.59.0.0\lib\native\address-model-64\lib
D:\[Project]\classificationT\classificationT\NugetPackages\boost_thread-vc120.1.59.0.0\lib\native\address-model-64\lib
D:\[Project]\classificationT\classificationT\NugetPackages\boost_chrono-vc120.1.59.0.0\lib\native\address-model-64\lib
D:\[Project]\classificationT\classificationT\NugetPackages\glog.0.3.3.0\build\native\lib\x64\v120\ Debug\dynamic
D:\[Project]\classificationT\classificationT\NugetPackages\protobuf-v120.2.6.1\build\native\lib\x64\v120\Debug
D:\[Project]\classificationT\classificationT\NugetPackages\OpenBLAS.0.2.14.1\lib\native\lib\x64
D:\[Project]\classificationT\classificationT\NugetPackages\hdf5-v120-complete.1.8.15.2\lib\native\lib\x64
D:\[Project]\classificationT\classificationT\NugetPackages\OpenCV.2.4.10\build\native\lib\x64\v120\ Debug
D:\[Project]\classificationT\classificationT\NugetPackages\gflags.2.1.2.1\build\native\x64\v120\dynamic\Lib
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\lib\x64
3 在附加依赖项里添加:
libcaffe.lib
libopenblas.dll.a
libprotobuf.lib
opencv_highgui2410d.lib
opencv_core2410d.lib
opencv_imgproc2410d.lib
libglog.lib
gflags.lib
hdf5.lib
hdf5_hl.lib
cublas.lib
cuda.lib
curand.lib
cudart.lib
4 在预编译器里添加:
C/C++->预处理器->预处理器定义,在这里添加:
_CRT_SECURE_NO_WARNINGS
5 classification.cpp作为demo
新建工程里的代码可以参考caffe的官方文件里面,就有classification.cpp作为demo。这里我将Classifier类定义放在了单独的文件里。我的代码会存放在文件夹里。
Classifier类构造函数中几个参数所对应实参的关系如下:
- string model_file——deploy.prototxt(网络结构文件名)
- string trained_file——network.caffemodel(训练权值文件名)
- string mean_file——mean.binaryprot(均值文件名)
- stringlabel_file——labels.txt(分类文件名)
6 head.h头文件
在自己的工程中还有自己定义一个head.h内容如下,然后再主函数所在的那个.cpp文件中include该头文件,如果不包含head.h头文件,就会出现“Check failed: registry.count(t ype) == 1 (0 vs. 1) Unknown layer type”,跳至net.cpp的 CHECK(Caffe::root_solver() || root_net_)<< “root_net_ needs to be set for all non-root solvers”
head.h的内容为:
#include "caffe/common.hpp"
#include "caffe/layers/input_layer.hpp"
#include "caffe/layers/inner_product_layer.hpp"
#include "caffe/layers/dropout_layer.hpp"
#include "caffe/layers/conv_layer.hpp"
#include "caffe/layers/relu_layer.hpp"
#include "caffe/layers/pooling_layer.hpp"
#include "caffe/layers/lrn_layer.hpp"
#include "caffe/layers/softmax_layer.hpp"
namespace caffe
{
extern INSTANTIATE_CLASS(InputLayer);
extern INSTANTIATE_CLASS(InnerProductLayer);
extern INSTANTIATE_CLASS(DropoutLayer);
extern INSTANTIATE_CLASS(ConvolutionLayer);
REGISTER_LAYER_CLASS(Convolution);
extern INSTANTIATE_CLASS(ReLULayer);
REGISTER_LAYER_CLASS(ReLU);
extern INSTANTIATE_CLASS(PoolingLayer);
REGISTER_LAYER_CLASS(Pooling);
extern INSTANTIATE_CLASS(LRNLayer);
REGISTER_LAYER_CLASS(LRN);
extern INSTANTIATE_CLASS(SoftmaxLayer);
REGISTER_LAYER_CLASS(Softmax);
}
注:根据自己具体的路径做相应调整
修改classification.cpp
自己新建的工程按照上面的步骤操作,应该是可以运行程序了。后来我将工程移植到之前异常行为分析的工程时出现了一些不兼容的变量和引用,出现错误主要是caffe底层定义的一些变量和boost库的引用和MFC以及c++的boost库有些冲突,修改如下:
7 dll
所需要的dll都在caffe编译成功后的caffe-master\Build\x64\Release或者Debug文件下。