本文主要参考:http://blog.csdn.net/oYangZi12/article/details/53290426?locationNum=5&fps=1
1.下载微软提供的caffe(https://github.com/Microsoft/caffe)并编译,Pre-Build Steps
Copy .\windows\CommonSettings.props.example to .\windows\CommonSettings.props 选择cpu或者gpu模式。
2.在caffe-master中libcaffe的相应位置加入roi-pooling层对应的cpp,hpp,cu文件重新编译caffe)。因roi-pooling层已经在微软版本的caffe中存在,只需要找到并添加到libcaffe模块下。caffe-master\include\caffe\layers\roi_pooling_layer.hpp,caffe-master\include\caffe\layers\smooth_l1_loss_layer.hpp添加至caffe-master\include\caffe\layers路径下,将caffe-master\src\caffe\layers\roi_pooling_layer.cpp,caffe-master\src\caffe\layers\smooth_l1_loss_layer添加至caffe-master\src\caffe\layers路径下。
3.重新build(生成各模块),并对整个caffe工程进行build.build成功则roi_pooling_layer层添加成功。
4.caffe-master工程下添加Faster_rcnn模块,这里直接将Classification模块中classification.cpp替换掉,Classification重命名成Detect,添加Faster_rcnn.h,Faster_rcnn.cpp和Detect.cpp,添加路径为..\caffe-master\examples\cpp_classification\
5.Faster_rcnn.h代码如下:
#pragma once
#include <gflags\gflags.h>
#include <glog\logging.h>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include "boost\algorithm\string.hpp"
#include "caffe\caffe.hpp"
#include "caffe\util\signal_handler.h"
#include <opencv2\opencv.hpp>
using namespace cv;
using caffe::Blob;
using caffe::Caffe;
using caffe::Net;
using caffe::Layer;
using caffe::Solver;
using caffe::shared_ptr;
using caffe::string;
using caffe::Timer;
using caffe::vector;
using std::ostringstream;
struct config{
int maxsize;
int target_size;
int feat_stride;
int anchor[9][4];
int test_min_box_size;
int per_nms_topN;
int after_nms_topN;
float overlap;
config(){
maxsize = 1000;
target_size = 600;
feat_stride = 16;
int tmp[9][4] = {
{-83,-39,100,56},
{-175,-87,192,104},
{-359,-183,376,200},
{-55,-55,72,72},
{-119,-119,136,136},
{-247,-247,264,264},
{-35,-79,52,96},
{-79,-167,96,184},
{-167,-343,184,360}
};
memcpy(anchor, tmp, 9 * 4 * sizeof(int));
test_min_box_size = 16;
per_nms_topN = 6000;
after_nms_topN = 300;
overlap = 0.7;
}
};
struct abox
{
float x1;
float y1;
float x2;
float y2;
float score;
};
class Faster_rcnn
{
public:
Faster_rcnn(Mat);
~Faster_rcnn();
bool init();
Mat gettarget(Mat);
public:
config conf;
private:
Mat im, m_src;
Size input_geometry_;
shared_ptr<Net<float> > rpn_net, faster_rcnn_net;
double im_scale;
Size feature_map_size;
private:
bool loadnet();
bool imgtoblob();
vector<abox> forward();
bool rpn_converttoboxs();
void prep_im_size();
Mat proposal_local_anchor();
Mat bbox_tranform_inv(Mat, Mat, string);
Mat get_rpn_score(Blob<float>*, int w, int h);
void m_sort(Mat&, Mat&);
void boxes_filter(vector<abox>&, int, vector<abox>, vector<int>);
void filter_boxs(Mat&, Mat&, vector<abox>&);
void nms(vector<abox>, double overlap, vector<int>& vPick, int &nPick);
void testdetection(vector<abox>&);
};
Faster_rcnn.cpp代码如下:
#include "Faster_rcnn.h"
#include <opencv2\opencv.hpp>
#include <algorithm>
#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\reshape_layer.hpp"
#include "caffe\layers\pooling_layer.hpp"
#include "caffe\layers\lrn_layer.hpp"
#include "caffe\layers\softmax_layer.hpp"
#include "caffe\layers\roi_pooling_layer.hpp"
//
//namespace caffe
//{
// extern INSTANTIATE_CLASS(InputLayer);
// extern INSTANTIATE_CLASS(InnerProductLayer);
// extern INSTANTIATE_CLASS(DropoutLayer);
// extern INSTANTIATE_CLASS(ConvolutionLayer);
// extern INSTANTIATE_CLASS(ROIPoolingLayer);
// 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(ReshapeLayer);
//
//}
cv::Scalar colortable[20] = { cv::Scalar(0, 0, 0), cv::Scalar(0, 0, 125),
cv::Scalar(0, 125, 125), cv::Scalar(125, 125, 125), cv::Scalar(125, 0, 0), cv::Scalar(125, 125, 0), cv::Scalar(0, 125, 0), cv::Scalar(125, 0, 125),
cv::Scalar(0, 0, 255), cv::Scalar(0, 255, 255), cv::Scalar(255, 255, 255), cv::Scalar(255, 0, 0), cv::Scalar(255, 255, 0), cv::Scalar(0, 255, 0),
cv::Scalar(255, 0, 255), cv::Scalar(0, 255, 100)