这个本是现代模式识别课的一部分作业,使用SSD算法完成一个行人检测的任务,完成过程中遇到了一些问题。
这也不是我的研究方向,不写出来以后可能就这样被遗忘了觉得挺可惜的,分享一下。
这个也是几个月之前的做的,到现在也有许多细节记不太清楚,当时似乎应该稍微记录一下。
配置过程中也参考了一些博客:【caffe-Windows】caffe+VS2013+Windows无GPU快速配置教程_风翼冰舟的博客-CSDN博客,Windows下Caffe-SSD编译_Chen_yingpeng的博客-CSDN博客,windows 配置 SSD ——CPU模式_lxy890123的博客-CSDN博客,windows CUDA8.0 配置SSD——GPU模式_lxy890123的博客-CSDN博客
首先说下我的实验环境Windows10,VS2013,64位版Qt 5.3.1,caffe官方的Windows版Caffe。
一:Qt-VS配置
安装好qt-opensource及qt-vs-addin后,在VS新出现一个名为Qt5的菜单栏,记得在其下拉菜单中选择Qt options并做如下设置
二:Windows下Caffe配置
中间遇到了一些坑,总的来说大流程是先生成libcaffe,再生成caffe,中间VS会自动下载一些需要的包耐心等待就好。再根据需要生成别的项目。
三:遇到的一些问题
1. 新建后Qt工程后,需要添加头文件目录、库文件目录以及附加依赖项,我添加的如下:
附加依赖项:
qtmain.lib Qt5Core.lib Qt5Gui.lib Qt5Multimedia.lib Qt5MultimediaWidgets.lib Qt5Network.lib Qt5Qml.lib Qt5Quick.lib Qt5Sql.lib Qt5Test.lib Qt5WebKit.lib Qt5AxContainer.lib Qt5AxBase.lib Qt5Bluetooth.lib Qt5Concurrent.lib Qt5Help.lib Qt5OpenGL.lib opengl32.lib glu32.lib Qt5PrintSupport.lib Qt5Declarative.lib Qt5Script.lib Qt5Sensors.lib Qt5Svg.lib Qt5WebkitWidgets.lib Qt5Widgets.lib Qt5Xml.lib Qt5XmlPatterns.lib libcaffe.lib caffe.lib $(CudaDependencies) opencv_core2410.lib opencv_highgui2410.lib opencv_imgproc2410.lib gflags.lib libglog.lib libopenblas.dll.a libprotobuf.lib leveldb.lib lmdb.lib hdf5.lib hdf5_hl.lib cublas.lib cuda.lib cublas_device.lib cudnn.lib cudadevrt.lib cudart.lib cudart_static.lib cufft.lib cufftw.lib curand.lib cusolver.lib cusparse.lib nppc.lib nppi.lib npps.lib nvblas.lib nvcuvid.lib nvrtc.lib
当然其中有一些是不必要的。
2. 出现一系列错误:
error C2238:意外的标记位于";"之前。
解决:可以看到这些错误都在caffe.pb.h文件的3895行及13066行,直接将这两行注释,问题解决。
3. 最后成功生成exe运行时报错:This application failed to start because it could not find or loadthe.......,
解决:将对应的Qt dll文件复制到exe目录下。
4. 报错未生成二进制文件无法调试,
解决:调试时允许源文件位置不一致;
5. 工程中新建了一个头文件,包含了SSD需要的一些网络层,我也是报了一些错然后慢慢加上的,直接上代码:
#include <caffe/common.hpp>
#include <caffe/layer.hpp>
#include <caffe/layer_factory.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>
#include <caffe/layers/sigmoid_layer.hpp>
#include <caffe/layers/tanh_layer.hpp>
#include <caffe/layers/permute_layer.hpp>
#include <caffe/layers/flatten_layer.hpp>
#include <caffe/layers/prior_box_layer.hpp>
#include <caffe/layers/concat_layer.hpp>
#include <caffe/layers/reshape_layer.hpp>
#include <caffe/layers/detection_output_layer.hpp>
#include <caffe/layers/detection_evaluate_layer.hpp>
#include <caffe/layers/batch_norm_layer.hpp>
#include <caffe/layers/bias_layer.hpp>
#include<caffe/layers/scale_layer.hpp>
#include<caffe/layers/normalize_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);
extern INSTANTIATE_CLASS(SigmoidLayer);
REGISTER_LAYER_CLASS(Sigmoid);
extern INSTANTIATE_CLASS(TanHLayer);
REGISTER_LAYER_CLASS(TanH);
extern INSTANTIATE_CLASS(PermuteLayer);
//REGISTER_LAYER_CLASS(Permute);
extern INSTANTIATE_CLASS(FlattenLayer);
//REGISTER_LAYER_CLASS(Flatten);
extern INSTANTIATE_CLASS(PriorBoxLayer);
//REGISTER_LAYER_CLASS(PriorBox);
extern INSTANTIATE_CLASS(ConcatLayer);
//REGISTER_LAYER_CLASS(Concat);
extern INSTANTIATE_CLASS(ReshapeLayer);
//REGISTER_LAYER_CLASS(Reshape);
extern INSTANTIATE_CLASS(DetectionOutputLayer);
//REGISTER_LAYER_CLASS(DetectionOutput);
extern INSTANTIATE_CLASS(DetectionEvaluateLayer);
//REGISTER_LAYER_CLASS(DetectionEvaluate);
extern INSTANTIATE_CLASS(BatchNormLayer);
extern INSTANTIATE_CLASS(BiasLayer);
extern INSTANTIATE_CLASS(ScaleLayer);
extern INSTANTIATE_CLASS(NormalizeLayer);
}
四:最终效果
放一下最终的效果,在GPU加速情况下每秒大约16帧。最后产生exe后添加一些dll文件就可以在别的Windows电脑上运行程序了。