介绍一种更加灵活的方法,用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. BZOJ 2002 LCT板子题

    思路: LCT啊... (分块也行) 不过YOUSIKI出了一道“弹飞大爷” 就不能用分块水过去了 //By SiriusRen #include <cstdio> #include &l ...

  2. Npgsql使用入门(二)【实用助手类】

    数据库映射的实体类: public class Test { public long TestID { get; set; } public string Name { get; set; } pub ...

  3. jquey中的事件绑定

    三种方法: $(selector).live(events, data, handler);                // jQuery 1.3+ $(document).delegate(se ...

  4. 使用PCL::GPU::遇到问题

    一:使用GPU进行点云分割,理论上可以极大地加快分割速度: 于是对PCL1.7.1进行了编译,回到32位系统,重设QT,编译成功(时间好漫长,一定要配置仔细,否则编译一次又一次浪费更多时间): 使用时 ...

  5. Python数据分析5-----数据规约

    1.数据规约概念和目的 数据规约是产生更小且保留数据完整性的新数据集. 意义:降低无效错误数据的影响.更有效率.降低存储成本. 2.属性规约 (1)属性合并(降维):比如PCA (2)删除不相关属性 ...

  6. [USACO17JAN] Promotion Counting晋升者计数 (树状数组+dfs)

    题目大意:给你一棵树,求以某节点为根的子树中,权值大于该节点权值的节点数 本题考查dfs的性质 离散+树状数组求逆序对 先离散 我们发现,求逆序对时,某节点的兄弟节点会干扰答案 所以,我们在递推时统计 ...

  7. 把SQLAlchemy查询对象转换成字典/json使用(汇总)

    1.使用SQLAlchemy from sqlalchemy import create_engine,Column,String,Integerfrom sqlalchemy.ext.declara ...

  8. Problem 8

    Problem 8 # Problem_8.py """ The four adjacent digits in the 1000-digit number that h ...

  9. 交互式编程之Golang基本配置(Jupyter-notebooks Golang)

    JupyterNoteBook-GO 启动错误 Install Go Install gophernotes 参考资料 如有错误,欢迎指出 错误 error: Cannot assign reques ...

  10. python开发项目:学生选课系统

    程序要求:1.创建北京.上海两所学校(分析:通过学校类实例化两个学校实例) 2.创建Linux.python.go三个课程,Linux\go在北京开,Linux在上海开(创建Linux.python. ...