介绍一种更加灵活的方法,用MemoryData层输入数据,可以直接用opencv接口读入我们的图片再添加的网络中。 

第一个问题:仍然是工程建立问题,提示卷积层或其他层没有注册,解决方法与上一篇博客一样。可查看:http://blog.csdn.net/sunshine_in_moon/article/details/50125255 

第二个问题:网络配置文件的改写,因为使用MemoryData层。

layers{
name: "data"
type: MEMORY_DATA //MemoryData层类型,还有需要注意,MEMORY_DATA别画蛇添足加上引号,否则会报错!
top: "data"
top: "label" //最好写上,虽然后面没有用到
transform_param{
mirror: false
crop_size:224
mean_value:129.1863//三个通道的均值
mean_value:104.7624
mean_value:93.5940
}
memory_data_param{//以下四个参数与ImageData稍有不同,请注意
batch_size:1
channels:3
height:224
width:224
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

第三个问题:代码,这段代码写的有点乱,请见谅!

template <typename Dtype>
caffe::Net<Dtype>* Net_Init_Load(
std::string param_file, std::string pretrained_param_file, caffe::Phase phase)
{
CheckFile(param_file);//CheckFile 是一个子函数我没有贴上,可以直接删掉这两行
CheckFile(pretrained_param_file); caffe::Net<Dtype>* net(new caffe::Net<Dtype>(param_file, phase)); net->CopyTrainedLayersFrom(pretrained_param_file);
return net;
} #define NetF float //宏定义 很多人包括我自己刚开始看到NetF也很困惑,原来就是float int main()
{
/*
boost::shared_ptr< Net<float> > feature_net;
feature_net = Init_net(); cv::Mat src1;
src1 = cv::imread("test.jpg");
//cv::imshow("img", src1);
//cv::waitKey(0);
//cv::destroyAllWindows();
//cv::Mat rszimage; //// The mean file image size is 256x256, need to resize the input image to 256x256
//cv::resize(src1, rszimage, cv::Size(244, 244));
std::vector<cv::Mat> patches;
patches.push_back(src1); // image is a cv::Mat, as I'm using #1416
std::vector<int> labels;
labels.push_back(0); boost::shared_ptr< MemoryDataLayer<float> >memory_data_layer;
memory_data_layer = boost::static_pointer_cast<MemoryDataLayer<float>>(feature_net->layer_by_name("data"));
/*
caffe::Datum data;
caffe::ReadFileToDatum("test.jpg", &data);
caffe::MemoryDataLayer<float> *m_layer_ = (caffe::MemoryDataLayer<float> *)feature_net->layers()[0].get();
*/
/*
memory_data_layer->AddMatVector(patches,labels); feature_net->ForwardPrefilled(); float data1;
data1 = Read_Feature_data(feature_net, "fc8");
cout << data1 << endl;
*/ /*从这里开始*/
cv::Mat src1;
src1 = cv::imread("test.jpg");
//cv::Mat rszimages; //cv::resize(src1, rszimages, cv::Size(224, 224));
std::vector<cv::Mat> dv = { src1 };//****输入的图片,注意格式,即使只有一张图片也要使用向量格式
std::vector<int> label = { 0 };//**输入图片的标签(可随便写),也要注意是向量,这是由AddMatVector函数决定的 //caffe::Datum data;
//caffe::ReadFileToDatum("test.jpg", &data); caffe::Net<NetF>* _net = Net_Init_Load<NetF>("FACE_deploy.prototxt",
"FACE.caffemodel", caffe::TEST);
caffe::MemoryDataLayer<NetF> *m_layer_ = (caffe::MemoryDataLayer<NetF> *)_net->layers()[0].get();//**定义个内存数据层指针
m_layer_->AddMatVector(dv, label);//***这两行很重要,是使用MemoryData层必须的,这是把图片和标签,添加到
//**MemoryData层 /*float loss = 0.0;
std::vector<caffe::Blob<float>*> results = _net->ForwardPrefilled(&loss);*/ int end_ind = _net->layers().size();
std::vector<caffe::Blob<NetF>*> input_vec; clock_t start = clock();
_net->Forward(input_vec);
clock_t end = clock();
double totaltime;
totaltime = (double)(end - start) / CLOCKS_PER_SEC;
cout << "\n此程序的运行时间为" << totaltime << "秒!" << endl; boost::shared_ptr<caffe::Blob<NetF>> fc8 = _net->blob_by_name("fc8");
const NetF* pstart = fc8->cpu_data();// ***这里是重点!重点!重点!,在这里耽误了很长时间。注意这里是个指针
//**也就是fc8->cpu_data()返回的一般是多维数据(可以看成是个数组),cout<<* pstart<<endl;这样只是打印出一个
//***数?当然是一个数了,*pstart只代表数组的第一个数,因此想获得所有的数据必须用循环!
std::cout << "It is right !!\n";
//std::cout << m_layer_->width() << std::endl;
//std::cout << pstart << endl;
//std::cout << fc8->cpu_data() << endl;
std::vector<double> V1;
for (int i = 0; i < 2622; i++)//**必须用循环打印
{
std::cout << *pstart << endl;
V1.push_back(*pstart);
pstart++;
}
//std::cout << *pstart << endl;
//std::cout << *(pstart++) << endl;
cout << "\n此程序的运行时间为" << totaltime << "秒!" << endl;
return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111

重点内容已经在注释上标明(前面加了**),希望这些对你有帮助! 

写的比较匆忙,以后如有新的体会,会及时更新!

Caffe C++API 提取任意一张图片的特征系列二----MemoryData的更多相关文章

  1. caffe:使用C++来提取任意一张图片的特征(从内存读取数据)

    0x00 关于使用C++接口来提取特征,caffe官方提供了一个extract_features.cpp的例程,但是这个文件的输入是blob数据,即使输入层使用的是ImageData,也需要在depl ...

  2. caffe:使用C++来提取任意一张图片的特征

    0x00 关于使用C++接口来提取特征,caffe官方提供了一个extract_features.cpp的例程,但是这个文件的输入是blob数据,即使输入层使用的是ImageData,也需要在depl ...

  3. arcgis api 3.x for js 入门开发系列二十二地图模态层(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  4. arcgis api 3.x for js 入门开发系列二十一气泡窗口信息动态配置模板

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  5. arcgis api 3.x for js 入门开发系列二不同地图服务展示(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  6. Caffe提取任意层特征并进行可视化

    现在Caffe的Matlab接口 (matcaffe3) 和python接口都非常强大, 可以直接提取任意层的feature map以及parameters, 所以本文仅仅作为参考, 更多最新的信息请 ...

  7. opencv java api提取图片sift特征

    opencv在2.4.4版本以后添加了对java的最新支持,可以利用java api了.下面就是我利用opencv的java api 提取图片的sift特征. import org.opencv.co ...

  8. OpenCV提取显示一张图片(或者视频)的R,G,B颜色分量

    使用OpenCV可以提分别提取显示一张图片(或者视频)的R,G,B颜色分量.效果如下. 原图: R: G: B: 示例代码如下,貌似很久以前网上找的的,逻辑很清晰,就是把R,G,B三个分量分开,然后显 ...

  9. Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群

    Redis总结(五)缓存雪崩和缓存穿透等问题   前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...

随机推荐

  1. DB2大数据量优化查询解决方案

    利用DB2表分区的功能对大数据量的表进行分区,可以优化查询. 表分区介绍: 表分区是一种数据组织方案,它根据一列或多列中的值把表数据划分为多个称为数据分区 的存储对象. (我觉得表分区就类似于Wind ...

  2. 洛谷P2391 白雪皑皑(并查集)

    题目背景 “柴门闻犬吠,风雪夜归人”,冬天,不期而至.千里冰封,万里雪飘.空中刮起了鸭毛大雪.雪花纷纷,降落人间. 美能量星球(pty 在 spore 上的一个殖民地)上的人们被这美景所震撼.但是 p ...

  3. 获取URL路径参数getUrlParams

    function getUrlParams(){ var reg = new RegExp("(^|&)" + name + "=([^&]*)(& ...

  4. SurfaceView加载长图

    1:SurfaceView加载长图,移到.可以充当背景 效果截图 2:View (淡入淡出动画没实现:记录下) package com.guoxw.surfaceviewimage; import a ...

  5. OData + jqgrid 部署在IIS 8.0上可增加但不能删除修改问题

    解决方法: <system.webServer>里添加 <modules> <remove name="WebDAVModule" /> < ...

  6. [转]SURF算法解析

    SURF算法解析 一.积分图像    积分图像的概念是由Viola和Jones提出的.积分图像中任意一点(i,j)的值为原图像左上角到任意点(i,j)相应的对焦区域的灰度值的总和,其数学公式如图1所示 ...

  7. (转载) IaaS, PaaS, Saas

    如果你是一个网站站长,想要建立一个网站.不采用云服务,你所需要的投入大概是:买服务器,安装服务器软件,编写网站程序. 现在你追随潮流,采用流行的云计算,如果你采用 IaaS 服务,那么意味着你就不用自 ...

  8. 僧多粥少?还原 OpenStack 的真实“钱景”

    原文链接:http://www.oschina.net/news/57994/openstack-income-analysis 451 Research发布了OpenStack的收入分析预测,指出O ...

  9. Jquery 研究 入口

    <script type="text/javascript"> //var jQuery = function () { // console.log(jQuery.f ...

  10. 创建dynamics CRM client-side (一) - Client-side Events

    这个系列是帮助大家了解dynamics CRM (customer engagement CE) 的client-side 开发. Client-side Events 1. Form OnLoad ...