//需要先在运行目录下创建文件夹opencv_layers
#include <iostream>
#include <unistd.h>
#include <opencv4/opencv2/opencv.hpp>
#include <opencv4/opencv2/dnn.hpp>
#include <opencv4/opencv2/dnn/dnn.hpp> using namespace std; /*
equal list opencv_conv*relu = pycaffe_conv* */ int main(int argc, char *argv[])
{
//// SHOULD BE 4.*.*
cerr<<"WORKING IN OPENCV_VERSION "<<CV_VERSION<<'\n';
cv::Mat src = cv::imread("src.jpg"); string cfg ="deploy.prototxt";
string weights ="net_iter_25000.caffemodel";
cv::dnn::Net net = cv::dnn::readNetFromCaffe(cfg,weights); if(net.empty()){
cerr<<"loaded net failed.\n";
return -;
} cv::Mat inputBlob = cv::dnn::blobFromImage(src, /.F, cv::Size(, ), cv::Scalar(), false, false);
net.setInput(inputBlob,"data"); vector<cv::String> outputname=net.getLayerNames();
outputname.insert(outputname.begin(),"data");
cv::dnn::MatShape netInputSize = {,,,};
vector<cv::dnn::MatShape> netlastSize;
vector<vector<cv::dnn::MatShape> >layerSizes;
for(size_t i=;i<outputname.size();++i){
vector<cv::dnn::MatShape>inputLayerSize;
vector<cv::dnn::MatShape>outputLayerSize;
net.getLayerShapes(netInputSize,i,inputLayerSize,outputLayerSize);
cerr<<"layer <<"<<outputname[i]<<">> size [\n";
for(size_t j=;j<inputLayerSize.size();++j){
cerr<<"\t["<<inputLayerSize[j][];for(size_t k=;k<inputLayerSize[j].size();++k)cerr<<" x "<<inputLayerSize[j][k];cerr<<"]\n";
}
cerr<<"\tto\n";
for(size_t j=;j<outputLayerSize.size();++j){
cerr<<"\t["<<outputLayerSize[j][];for(size_t k=;k<outputLayerSize[j].size();++k)cerr<<" x "<<outputLayerSize[j][k];cerr<<"]\n";
}
cerr<<"]\n";
layerSizes.push_back(outputLayerSize);
netlastSize=inputLayerSize;
} vector<vector<cv::Mat> > outputBlob;
try{
cerr<<"\nNet forward ";
net.forward(outputBlob, outputname);
cerr<<"done\n\n";
}catch(exception e){
cerr << e.what() << '\n';
} string selectLayer="conv4"; for(size_t i=;i<outputname.size();++i){ for(size_t j=;j<outputBlob[i].size();++j){
try{ cv::Mat blob;
cv::normalize(outputBlob[i][j], blob, , , cv::NORM_MINMAX); cerr<<"blob dim = "<<blob.size.dims()<<" with type "<<blob.type()<<'\n';
//b * c * w * h
//b * w * h
//b * w
cerr<<"blob shape ["<<blob.size.p[];for(size_t k=;k<blob.size.dims();++k)cerr<<" x "<<blob.size.p[k];cerr<<"]\n";
cerr<<"real shape ["<<layerSizes[i][j][];for(size_t k=;k<layerSizes[i][j].size();++k)cerr<<" x "<<layerSizes[i][j][k];cerr<<"]\n"; cv::Mat saveimg;
float* data=(float*)blob.data;
string savepath;
int s[]={}; switch(blob.size.dims()){
case :
saveimg.create(layerSizes[i][j][],,CV_8UC1);
for(size_t pi=; pi<layerSizes[i][j][]; ++pi){
saveimg.data[pi]=data[pi];
}
savepath = "opencv_layers/layer_"+strip(outputname[i],"/")+".jpg";
cv::imwrite(savepath,saveimg);
saveimg.release();
break;
case :
s[]=layerSizes[i][j][];
s[]=layerSizes[i][j][];
saveimg.create(layerSizes[i][j][],layerSizes[i][j][],CV_8UC1);
for(size_t pi=; pi<s[]*s[]; ++pi){
saveimg.data[pi]=(uchar)data[pi];
}
savepath = "opencv_layers/layer_"+strip(outputname[i],"/")+".jpg";
cv::imwrite(savepath,saveimg);
saveimg.release();
break;
case :
s[]=layerSizes[i][j][];
s[]=layerSizes[i][j][];
s[]=s[]*s[];
s[]=ceil(sqrt(layerSizes[i][j][]));
s[]=;
saveimg=cv::Mat::zeros((s[]+)*s[],(s[]+)*s[],CV_8UC1);
fprintf(stderr,"saveimg <%d,%d> for %d\n",saveimg.rows,saveimg.cols,layerSizes[i][j][]);
for(size_t wy=; wy<s[]; ++wy){
for(size_t wx=; wx<s[]; ++wx){
if(s[]>=layerSizes[i][j][])break;
s[]=;
for(size_t py=; py<s[]; ++py){
for(size_t px=; px<s[]; ++px){
saveimg.data[(wy*(s[]+)+py)*s[]*(s[]+)+wx*(s[]+)+px]=(uchar)data[s[]*s[]+s[]];
++s[];
}
}
++s[];
}
} savepath = "opencv_layers/layer_"+strip(outputname[i],"/")+".jpg";
cv::imwrite(savepath,saveimg);
saveimg.release();
break;
default:
cerr<<" exordinary dim\n";
break;
}
cerr<<"save to "<<savepath<<'\n'; blob.release();
}catch(exception e){
cerr<<" escape beacuse "<<e.what()<<'\n';
}
}
} fprintf(stderr, "float %d, double %d\n",sizeof(float),sizeof(double));
//blob <CV_32FC1,5> float
fprintf(stderr, "type list : <CV_8UC1,%d> <CV_8UC3,%d> <CV_16FC1,%d> <CV_16FC3,%d> <CV_16SC1,%d> <CV_16SC3,%d> <CV_32FC1,%d> <CV_32SC1,%d> ",
CV_8UC1,CV_8UC3,CV_16FC1,CV_16FC3,CV_16SC1,CV_16SC3,CV_32FC1,CV_32SC1);
return ;
}

C++中使用OPENCV对深度学习的特征图进行可视化的更多相关文章

  1. Opencv调用深度学习模型

    https://blog.csdn.net/lovelyaiq/article/details/79929393 https://blog.csdn.net/qq_29462849/article/d ...

  2. 语义分割:基于openCV和深度学习(二)

    语义分割:基于openCV和深度学习(二) Semantic segmentation in images with OpenCV 开始吧-打开segment.py归档并插入以下代码: Semanti ...

  3. 语义分割:基于openCV和深度学习(一)

    语义分割:基于openCV和深度学习(一) Semantic segmentation with OpenCV and deep learning 介绍如何使用OpenCV.深度学习和ENet架构执行 ...

  4. 蛋白质组DIA深度学习之谱图预测

    目录 1. 简介 2. 近几年发表的主要工具 1.DeepRT 2.Prosit 3. DIANN 4.DeepDIA 1. 简介 基于串联质谱的蛋白质组学大部分是依赖于数据库(database se ...

  5. Android中AdapterView/Adapter的深度学习

    BaseAdapter的深度学习 博主工作了几年,也用了几年的ListView等AdapterView控件,但关于Adapter的一些问题并没有深入下去,终于有时间学习总结下关于BaseAdapter ...

  6. 使用VS+OpenCV调用深度学习模型

    最近项目有个任务,要在windows环境下用VS+OpenCV实现caffe模型的调用,于是在网上找了几个相关的博客跑了几个demo练练手.这些博客写得都很详细,但是有些细节由于版本更新的问题,配置的 ...

  7. 人工智能之基于Opencv与深度学习的计算机视觉实战课程

    https://www.bilibili.com/video/av66375362 imagewatch:https://blog.csdn.net/iracer/article/details/83 ...

  8. 深度学习原理与框架-Tensorboard可视化展示(代码) 1.tf.reuse_default_graph(进行结构图的重置) 2.tf.summary.FileWriter(writer实例化) 3. write.add_graph(graph的写入) 4. tf.summary.merge_all(将summary进行合并) 5.write.add_summary(将所有summary)

    1. tf.reuse_default_graph() # 对graph结构图进行清除和重置操作 2.tf.summary.FileWriter(path)构造writer实例化,以便进行后续的gra ...

  9. 华为云ModelArts图深度学习,学习知识还能考取微认证

    作为人工智能最前沿的技术之一,图深度学习被公认是人工智能认识世界实现因果推理的关键,也是深度学习未来发展的方向.但深度学习对图数据模型的支持性差一直是众多研究者难以攻克的难点,因此图深度学习在实际生产 ...

随机推荐

  1. 算法设计与分析 - 李春葆 - 第二版 - html v2

    1 .1 第 1 章─概论   1.1.1 练习题   1 . 下列关于算法的说法中正确的有( ).   Ⅰ Ⅱ Ⅲ Ⅳ .求解某一类问题的算法是唯一的   .算法必须在有限步操作之后停止   .算法 ...

  2. mysql 5.5 编码设置为utf8 转载自:http://outofcontrol.ca/thoughts/comments/change-mysql-5.5-default-character-set-to-utf8

    Change MySQL 5.5 default character-set to UTF8 连接里是linux下的 在window下my.ini Add under [client]  the fo ...

  3. 转 oracle数据库更新时间字段数据时的sql语句

    https://www.cnblogs.com/sun-rain/p/4921512.html ---Oracle数据库-时间函数 ---格式化时间插入update t_user u set u.mo ...

  4. scrapy3 中间件的使用

    前情提要: 补充知识点: ua请求头库的使用 安装: pip install fake-useragent 使用: from fake_useragent import UserAgent ua = ...

  5. luogu2034

    /* * 正难则反 * f[i] 表示前 i 个数中被删除的数的最小和 * f[i] = min(f[j]) + num, i - k + 1 <= j < i; * 单调队列维护 */ ...

  6. [Luogu] 树状数组

    https://www.luogu.org/problemnew/show/P3374 单点修改,区间查询 #include <iostream> #include <cstdio& ...

  7. min_25筛学习笔记【待填坑】

    看见ntf和pb两位大佬都来学了,然后就不自觉的来学了. 我们考虑这样一个问题. $$ans=\sum_{i=1}^nf(i)$$其中$1\leq n\leq 10^{10}$ 其中$f(i)$是一个 ...

  8. 2019.7.9 校内测试 T1挖地雷

    这一次是交流测试?边交流边测试(滑稽 挖地雷 这个题是一个递推问题. 首先我们看第一个格子,因为它只影响了它的上面和右上面这两个地方是否有雷. 我们可以分3种情况讨论: 1. 第一个格子的数字是2: ...

  9. P2119 魔法阵

    原题链接  https://www.luogu.org/problemnew/show/P2119 YY同学今天上午给我们讲了这个题目,我觉得她的思路很好,特此写这篇博客整理一下. 50分:暴力枚举 ...

  10. ubuntu14.04重启网卡的三种方法

    Linux重启网卡的三种方法: 一.network 利用root帐户 # service network restart 或者/etc/init.d/networking restart 二.ifdo ...