[目标检测]windows下实现c++版faster-rcnn

本文主要参考: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)
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值