//需要先在运行目录下创建文件夹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. spring lookup method 注入

           lookup method注入是spring动态改变bean里方法的实现.方法执行返回的对象,使用spring内原有的这类对象替换,通过改变方法返回值来动态改变方法.内部实现为使用cgl ...

  2. 0001SpringBoot整合Mybatis

    SpringBoot整合Mybatis主要分为以下几个步骤: 1.添加Mybatis的起步依赖(pom.xml) 2.添加数据库驱动坐标(pom.xml) 3.添加数据库连接信息(applicatio ...

  3. 四、vue基础--自定义组件

    1.语法:Vue.component("组件名字",{data,template}),代码如下: a. data: 必须是一个函数,有一个返回值.和vue里面的使用方法一样 b. ...

  4. 企业级分布式 HTAP 数据库管理系统 TBase

    TBase 是腾讯数据平台团队在开源的 PostgreSQL 基础上研发的企业级分布式 HTAP 数据库管理系统: 具备高性能可扩展的分布式事务能力,支持 RC 和 RR 两种隔离级别: 通过安全.管 ...

  5. 2018HDU多校联赛第六场 6373 Pinball——水题&&物理题

    题意 给定一个斜面,从某处让一个小球作自由落体运动,求小球与斜面的碰撞次数(假设都为弹性碰撞). 分析 题图如下,x轴.y轴是虚拟的. 根据高中物理的套路,沿斜面方向分解重力加速度即可. #inclu ...

  6. webuploader+文件夹上传

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...

  7. python while for 语句

    while 语句: >>> x = >>> : ... x += ... print(x) ... for 语句: >>> words = ['a ...

  8. AtCoder Beginner Contest 128 F - Frog Jump

    题意 有一只青蛙,有\(0, 1, \cdots, N - 1\)个荷叶.每个荷叶上有权值\(s_i\). 选定\(A\), \(B\),初始分数为\(0\). 当前位置为\(x\): 对于\(y = ...

  9. Collection接口详解

    Collection 介绍 https://blog.csdn.net/jyg0723/article/details/80498840 Stream API介绍  https://www.jians ...

  10. skb head/data/tail/end/介绍

    2017年04月26日 18:21:12 abcLinux 阅读数 799   This first diagram illustrates the layoutof the SKB data are ...