#ifdef CPU_ONLY
Caffe::set_mode(Caffe::CPU);
#else
Caffe::set_mode(Caffe::GPU);
#endif
net_.reset(new Net(net_prototxt, TEST));
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];
batch_size_ = input_layer->num();
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());
// reshape the output shape of the DataTransformer
vector top_shape(4);
top_shape[0] = 1;
top_shape[1] = num_channels_;
top_shape[2] = input_geometry_.height;
top_shape[3] = input_geometry_.width;
this->transformed_data_.Reshape(top_shape);
Blob* NetOperator::processImage(const string &img_path, bool is_color) {
// reshape the net for the input
input_blob_ = net_->input_blobs()[0];
input_blob_->Reshape(1, num_channels_,
input_geometry_.height, input_geometry_.width);
net_->Reshape();
readImageToBlob(img_path, 0, is_color);
net_->ForwardPrefilled();
return net_->output_blobs()[0];
Blob* NetOperator::processImages(const vector &img_paths, bool is_color) {
int img_num = img_paths.size();
// reshape the net for the input
input_blob_ = net_->input_blobs()[0];
input_blob_->Reshape(img_num, num_channels_,
input_geometry_.height, input_geometry_.width);
net_->Reshape();
for (int i=0; i<img_num; i++) {
readImageToBlob(img_paths[i], i, is_color);
net_->ForwardPrefilled();
return net_->output_blobs()[0];
void NetOperator::readImageToBlob(const string &img_path, int idx, bool is_color) {
// read the image and resize to the target size
cv::Mat img;
int cv_read_flag = (is_color ? CV_LOAD_IMAGE_COLOR :
CV_LOAD_IMAGE_GRAYSCALE);
cv::Mat cv_img_origin = cv::imread(img_path, cv_read_flag);
if (!cv_img_origin.data) {
LOG(ERROR) << "Could not open or find file " << img_path;
return ;
if (input_geometry_.height > 0 && input_geometry_.width > 0) {
cv::resize(cv_img_origin, img, input_geometry_);
} else {
img = cv_img_origin;
// transform the image to a blob using DataTransformer
// create a DataTransformer using default TransformationParameter (no transformation)
data_transformer_.reset(
new DataTransformer(transform_param_, TEST));
data_transformer_->InitRand();
// set the output of DataTransformer to the idx image of the input blob
int offset = input_blob_->offset(idx);
this->transformed_data_.set_cpu_data(input_blob_->mutable_cpu_data() + offset);
// transform the input image
data_transformer_->Transform(img, &(this->transformed_data_));
}1.首先要准备几样东西:
(1)要预测的图像, 需要32×32大小;
(2)网络配置文件, prototxt,以及每个图像的路径及其序号 。
(3)训练好的caffemodel以及均值二进制文件, 貌似可以定值, 需要通过数据训练计算得到 。
(3)预测的主程序
view code
2.结果:
view code
各个类别图示:
上面是用cpu跑的, 我还等了几秒钟, 用了下gpu处理, 瞬间, 真的很快, enter完就出

文章插图
如何调用训练好的caffemodel你想调用你的模型, 最简单的办法是看examples/cpp_classification里面的cpp文件, 那是教你如何调用caffe获取分类结果的…(你没接触过caffe的话, 建议你直接按照这个文件来操作可能会比较简单, 下面我的代码我也不知道没接触过caffe的人看起来难度会有多大)
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
