介绍一种更加灵活的方法,用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. jQuery访问json文件

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. 前端开发app

    1.如果是 Angular 那就选 Ionic (一对好 CP) 2.如果是 Vue 那就选 Vux (基于 WeUI)3.如果是 jQuery 那就选 Framework7 (iOS 和 Andro ...

  3. VS Code中编写html(3) 标签的宽高颜色背景设置

    1 创建一个div标签: <body> <div> 这是一个div标签: </div> </body> 变成了圆圆的,是因为后面有设置了样式: back ...

  4. appium不能获取webview内容的解决办法

    在用appium对小猿搜题app进行自动化测试时,准备用page_source打印出文章的xml内容 但是发现只能打印出外部结构内容,实际的文章内容却没有显示 截图如下 查询之后,得知需要通过cont ...

  5. 我的第一个 Windows 窗口程序(1)

    一般来说,构建一个 Windows 程序可以分为如下几个步骤: 定义窗口类(WNDCLASS) 注册窗口类(RegisterClass) 创建窗口(CreateWindow) 更新显示窗口(Updat ...

  6. UNIX时间转换ASP代码.txt

    '参数:strTime:要转换的时 间:intTimeZone:该时间对应的时区 '返回值:strTime相对于1970年1月1日午夜0点经过的秒数 '示例:ToUnixTime("2008 ...

  7. 工作中常见的Git本地分支与远程分支同步场景

    Git 是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理.   一直以来本人使用 Git 处理分支都是现用现查,一是因为怕出错,二还是因为懒,作为一名四年开发经验的前端 ...

  8. TCP连接的11中状态

    1.CLOSED:初始状态,表示TCP连接时关闭状态,没有任何连接. 2.LISTEN:表示服务器端的某个SOCKET处于监听状态,可以接收客户端的连接请求. 3.SYN_RCVD:表示服务器接收到来 ...

  9. deep learning 经典网络模型之Alexnet、VGG、Googlenet、Resnet

    CNN的发展史 上一篇回顾讲的是2006年Hinton他们的Science Paper,当时提到,2006年虽然Deep Learning的概念被提出来了,但是学术界的大家还是表示不服.当时有流传的段 ...

  10. 2015 Multi-University Training Contest 10 hdu 5407 CRB and Candies

    CRB and Candies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...