网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
04月25日漏签0天
easyx吧 关注:10,957贴子:47,074
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 8回复贴,共1页
<<返回easyx吧
>0< 加载中...

用easyx实现深度学习的超分辨率重建的开山之作SRCNN

  • 只看楼主
  • 收藏

  • 回复
  • 白芦花
  • 四年级
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
先来看一下SRCNN的卷积神经网络的结构:
大体框架:

细节:


  • 白芦花
  • 四年级
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
既然是卷积神经网络,首先要有卷积
先定义卷积矩阵:
class 卷积矩阵
{
public:
intwidth; //宽
int height; //高
//数据
vector<float>data;
//构造函数
卷积矩阵(int iwidth,int iheight);
~卷积矩阵();
};
//构成一个卷积过程中的矩阵
卷积矩阵::卷积矩阵(int iwidth,int iheight): width(iwidth),
height(iheight)
{
int size=width*height;
data.resize(size) ;
}
卷积矩阵::~卷积矩阵()
{
data.swap(vector<float>());
}
为了知道是否吞楼,最后一行记一个数字
(一)


2026-04-25 05:24:46
广告
不感兴趣
开通SVIP免广告
  • 白芦花
  • 四年级
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
然后载入图片,再转换到卷积矩阵,由于重建比较费时,一般不是把R、G、B都拿去重建,
而是先转换为Y、U、V,只拿Y去重建。而后转回RGB,保存结果jpg。
IMAGE jpg;//一个全局的图像
//载入图片
loadjpg(jpgname);
卷积矩阵 Y(wid,hei);//只用该矩阵
卷积矩阵 U(wid,hei),V(wid,hei);
//RGB转换为YUV
RGB2YUV(&Y,&U,&V);//jpg
卷积矩阵 res(wid,hei);//保存结果
然后SRCNN超分辨重建
//YUV转回RGB
YUV2RGB(&res,&U,& V);//jpg
//保存结果
saveimage("SRCNN 重建.jpg",&jpg);
大框架就是这样了
(二)


  • 白芦花
  • 四年级
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
感谢吧主加精!!
接下来,来看看图像经过卷积后会发生什么变化?
核心函数:卷积
void 卷积(卷积矩阵*filter,卷积矩阵*in, 卷积矩阵*out)
{
int filterW=filter->width;
int filterH=filter->height;
int inW=in->width;
int inH=in->height;
float temp;
int outW=filterW+inW-1;//输出宽
int outH=filterH+inH-1;//输出高
卷积矩阵 tmp(outW,outH);
//扩展边界,暂缺
//'full'全卷积
for (int i=0; i<outH; i++) //输入
{
for (int j=0; j<outW; j++)
{
temp = 0;
for (int m=0; m<filterH; m++) //核
{
for (int n=0; n<filterW; n++)
{
if ((i-m)>=0 && (i-m)<inH && (j-n)>=0 && (j-n)<inW)
{
temp += filter->data[m*filterW+n]*in->data[(i-m)*inW+(j-n)]; //积 和
}
}
}
tmp.data[i*outW+j] = temp;
}
}
//'same'切去一部分,让输出与输入图像的大小相同
for(int i=0; i<inH; i++)
{
for(int j=0; j<inW; j++)
{
out->data[i*inW+j]=tmp.data[(i+(filterH-1)/2)*outW+(j+(filterW-1)/2)];
}
}
}
演示卷积函数
void 生成随机核(卷积矩阵 &f)
{
int w=f.width;
int h=f.height;
float t;
for (int i = 0; i < h*w; i++)
{
t=rand()/32767.0-rand()/32767.0;
f.data[i] = t;
}
}
void 卷积演示(卷积矩阵 & im)
{
卷积矩阵 卷积核(3,3);
卷积矩阵 temp(im.width,im.height);
for(int i=0 ;i<20;i++)
{
生成随机核(卷积核);
卷积(&卷积核,&im, &temp);
//显示
IMAGE tt=卷积矩阵2im(&temp);
putimage(rand()%100,rand()%100, &tt);
}
}
最后把
卷积演示(im_b);
放到 SRCNN里面的
//显示Y通道
的上面或下面
(四)


  • 白芦花
  • 四年级
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
前面的卷积的是用一些随机数核,实际上SRCNN是用训练好的数据核来卷积的
先定义一个数据存放池:
struct SRCNN模型
{
//偏移
int 偏移_conv1_长度; //
float *偏移_conv1_数据;
int 偏移_conv2_长度; //
float *偏移_conv2_数据;
int 偏移_conv3_长度; //
float *偏移_conv3_数据;
//权重
int 权重_conv1_长度;
int 权重_conv1_宽度;
float *权重_conv1_数据;
int 权重_conv2_长度;
int 权重_conv2_通道;
float *权重_conv2_数据;
int 权重_conv3_长度;
int 权重_conv3_宽度;
float *权重_conv3_数据;
//构造函数
SRCNN模型();
};
//分配内存
SRCNN模型::SRCNN模型()
{
int size;
偏移_conv1_长度 = 64; //
size = sizeof(float)*偏移_conv1_长度;
偏移_conv1_数据 = (float*)malloc(size);
偏移_conv2_长度 = 32; //
size = sizeof(float)*偏移_conv2_长度;
偏移_conv2_数据 = (float*)malloc(size);
偏移_conv3_长度 = 1; //
size = sizeof(float)*偏移_conv3_长度;
偏移_conv3_数据 = (float*)malloc(size);
//权重
权重_conv1_长度 = 81;
权重_conv1_宽度 = 64;
size = sizeof(float) * 权重_conv1_长度 * 权重_conv1_宽度;
权重_conv1_数据 = (float*)malloc(size);
权重_conv2_长度 = 64;
权重_conv2_通道 = 32;
size = sizeof(float) * 权重_conv2_长度 * 权重_conv2_通道;
权重_conv2_数据 = (float*)malloc(size);
权重_conv3_长度 = 32;
权重_conv3_宽度 = 25;
size = sizeof(float) * 权重_conv3_长度 * 权重_conv3_宽度;
权重_conv3_数据 = (float*)malloc(size);
}
然后载入数据。
数据文件可以到《纯C++超分辨率重建SRCNN --改编--(八)完结篇》下载
地址在该文的结尾 (网盘)
实际上我只是抄写了该文,感兴趣的自己看看吧
(五)


  • 👍👍👎👍👎
  • 六年级
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
很不建议这么写,很生硬。深度学习程序主要围绕数据流图,张量计算,自动微分三个部分。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 8回复贴,共1页
<<返回easyx吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示