資源簡介
基于c++實現的LeNet,可以基于自己鼠標手寫的字符進行識別,效果很好,原驗證集99%的識別率
代碼片段和文件信息
#define?USE_OPENCV?1
#define?CPU_ONLY?1
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?“head.h“
#include?
#include?
#include?
#include?
#include?
using?namespace?caffe;
using?namespace?cv;
Point?previousPoint(-1?-1)?nowPoint(-1?-1);
Mat?srcimage=Mat::zeros(280280CV_8UC1);
Mat?srcimageori?=?Mat::zeros(280?280?CV_8UC1);
class?Classifier?{
public:
Classifier(const?string&?model_file
const?string&?trained_file);
int?Classify(const?cv::Mat&?img);
private:
std::vector?Predict(const?cv::Mat&?img);
void?WrapInputlayer(std::vector*?input_channels);
void?Preprocess(const?cv::Mat&?img
std::vector*?input_channels);
private:
shared_ptr?>?net_;
cv::Size?input_geometry_;
int?num_channels_;
};
Classifier::Classifier(const?string&?model_file
const?string&?trained_file)?
{
#ifdef?CPU_ONLY
Caffe::set_mode(Caffe::CPU);
#else
Caffe::set_mode(Caffe::GPU);
#endif
/*?Load?the?network.?*/
net_.reset(new?Net(model_file?TEST));
net_->CopyTrainedlayersFrom(trained_file);
CHECK_EQ(net_->num_inputs()?1)?<“Network?should?have?exactly?one?input.“;
CHECK_EQ(net_->num_outputs()?1)?<“Network?should?have?exactly?one?output.“;
Blob*?input_layer?=?net_->input_blobs()[0];
num_channels_?=?input_layer->channels();
CHECK(num_channels_?==?3?||?num_channels_?==?1)
<“Input?layer?should?have?1?or?3?channels.“;
input_geometry_?=?cv::Size(input_layer->width()?input_layer->height());
}
/*?Return?the?top?N?predictions.?*/
int?Classifier::Classify(const?cv::Mat&?img)?{
std::vector?output?=?Predict(img);
std::vector::iterator?iter=find(output.begin()?output.end()?1);
int?prediction?=?distance(output.begin()?iter);
return?prediction<10???prediction:0;
}
std::vector?Classifier::Predict(const?cv::Mat&?img)?{
Blob*?input_layer?=?net_->input_blobs()[0];
input_layer->Reshape(1?num_channels_
input_geometry_.height?input_geometry_.width);
/*?Forward?dimension?change?to?all?layers.?*/
net_->Reshape();
std::vector?input_channels;
WrapInputlayer(&input_channels);
Preprocess(img?&input_channels);
net_->Forward();
/*?Copy?the?output?layer?to?a?std::vector?*/
Blob*?output_layer?=?net_->output_blobs()[0];
const?float*?begin?=?output_layer->cpu_data();
const?float*?end?=?begin?+?output_layer->channels();
return?std::vector(begin?end);
}
void?Classifier::WrapInputlayer(std::vector*?input_channels)?{
Blob*?input_layer?=?net_->input_blobs()[0];
int?width?=?input_layer->width();
int?height?=?input_layer->height();
float*?input_data?=?input_layer->mutable_cpu_data();
for?(int?i?=?0;?i?yer->chann
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2017-02-07?15:34??lenet_test\
?????目錄???????????0??2017-02-07?15:34??lenet_test\lenet_test\
?????文件????68747264??2017-02-07?15:34??lenet_test\lenet_test.sdf
?????文件????????1330??2017-02-07?08:59??lenet_test\lenet_test.sln
?????文件???????35328??2017-02-07?15:34??lenet_test\lenet_test.v12.suo
?????文件??????126464??2016-09-02?14:06??lenet_test\lenet_test\gflags.dll
?????文件???????26608??2016-09-02?14:06??lenet_test\lenet_test\gflags.lib
?????文件??????514048??2016-09-02?14:06??lenet_test\lenet_test\gflagsd.dll
?????文件???????26684??2016-09-02?14:06??lenet_test\lenet_test\gflagsd.lib
?????文件??????126464??2016-09-02?14:06??lenet_test\lenet_test\gflags_nothreads.dll
?????文件???????27440??2016-09-02?14:06??lenet_test\lenet_test\gflags_nothreads.lib
?????文件??????514048??2016-09-02?14:06??lenet_test\lenet_test\gflags_nothreadsd.dll
?????文件???????27516??2016-09-02?14:06??lenet_test\lenet_test\gflags_nothreadsd.lib
?????文件?????????856??2017-02-07?11:12??lenet_test\lenet_test\head.h
?????文件????????1738??2016-08-24?14:09??lenet_test\lenet_test\lenet.prototxt
?????文件?????1725006??2016-10-25?00:00??lenet_test\lenet_test\lenet_iter_10000.caffemodel
?????文件????????6104??2017-02-07?15:09??lenet_test\lenet_test\lenet_test.cpp
?????文件???????12233??2017-02-07?08:59??lenet_test\lenet_test\lenet_test.vcxproj
?????文件????????1068??2017-02-07?08:59??lenet_test\lenet_test\lenet_test.vcxproj.filters
?????文件?????4963840??2016-09-02?14:18??lenet_test\lenet_test\opencv_core2410d.dll
?????文件?????4660224??2016-09-02?14:18??lenet_test\lenet_test\opencv_highgui2410d.dll
?????文件?????4467712??2016-09-02?14:18??lenet_test\lenet_test\opencv_imgproc2410d.dll
?????目錄???????????0??2017-02-07?15:11??lenet_test\x64\
?????目錄???????????0??2017-02-07?15:11??lenet_test\x64\Debug\
?????文件?????6367744??2017-02-07?15:11??lenet_test\x64\Debug\lenet_test.exe
?????文件????21927880??2017-02-07?15:11??lenet_test\x64\Debug\lenet_test.ilk
?????文件????36999168??2017-02-07?15:11??lenet_test\x64\Debug\lenet_test.pdb
- 上一篇:C++Builder案例開發集錦(第二版)
- 下一篇:MFC掃雷程序
評論
共有 條評論