在之前的博客中已经介绍了ESPCN的原理了(
学习笔记之——基于深度学习的图像超分辨率重构
)本博文是对ESPCN进行实现。代码的框架仍然采用xintao前辈的代码,本博文会给出关键的实现部分
python train.py -opt options/train/train_sr.json
python test.py -opt options/test/test_sr.json
ESPCN的网络结构
network.py
# Generator
def define_G(opt):
gpu_ids = opt['gpu_ids']
opt_net = opt['network_G']
which_model = opt_net['which_model_G']#hear decide which model, and thia para is in .json. if you add a new model, this part must be modified
if which_model == 'sr_resnet': # SRResNet
netG = arch.SRResNet(in_nc=opt_net['in_nc'], out_nc=opt_net['out_nc'], nf=opt_net['nf'], \
nb=opt_net['nb'], upscale=opt_net['scale'], norm_type=opt_net['norm_type'], \
act_type='relu', mode=opt_net['mode'], upsample_mode='pixelshuffle')
#############################################################################################################
elif which_model=='fsrcnn':#FSRCNN
netG=arch.FSRCNN(in_nc=opt_net['in_nc'], out_nc=opt_net['out_nc'], nf=opt_net['nf'], \
nb=opt_net['nb'], upscale=opt_net['scale'], norm_type=opt_net['norm_type'], \
act_type='relu', mode=opt_net['mode'], upsample_mode='pixelshuffle')
#############################################################################################################
#############################################################################################################
elif which_model=='espcn':#ESPCN
netG=arch.ESPCN(in_nc=opt_net['in_nc'], out_nc=opt_net['out_nc'], nf=opt_net['nf'], \
nb=opt_net['nb'], upscale=opt_net['scale'], norm_type=opt_net['norm_type'], \
act_type='relu', mode=opt_net['mode'], upsample_mode='pixelshuffle')
#############################################################################################################
#############################################################################################################
elif which_model=='srresnet':#SRResNet, the Original version
netG=arch.OSRRESNET(in_nc=opt_net['in_nc'], out_nc=opt_net['out_nc'], nf=opt_net['nf'], \
nb=opt_net['nb'], upscale=opt_net['scale'], norm_type=opt_net['norm_type'], \
act_type='relu', mode=opt_net['mode'], upsample_mode='pixelshuffle')
#############################################################################################################
elif which_model == 'sft_arch': # SFT-GAN
netG = sft_arch.SFT_Net()
elif which_model == 'RRDB_net': # RRDB,this is ESRGAN
netG = arch.RRDBNet(in_nc=opt_net['in_nc'], out_nc=opt_net['out_nc'], nf=opt_net['nf'],
nb=opt_net['nb'], gc=opt_net['gc'], upscale=opt_net['scale'], norm_type=opt_net['norm_type'],
act_type='leakyrelu', mode=opt_net['mode'], upsample_mode='upconv')
else:
raise NotImplementedError('Generator model [{:s}] not recognized'.format(which_model))
if opt['is_train']:
init_weights(netG, init_type='kaiming', scale=0.1)###the weight initing. you can change this to change the method of init_weight
if gpu_ids:
assert torch.cuda.is_available()
netG = nn.DataParallel(netG)
return netG
architecture.py
#######################################################################################################3
#EPSCN
class ESPCN(nn.Module):
def __init__(self, in_nc, out_nc, nf, nb, upscale=2, norm_type='batch', act_type='relu', \
mode='NAC', res_scale=1, upsample_mode='upconv'):##play attention the upscales
super(ESPCN,self).__init__()
self.conv1=nn.Conv2d(in_channels=in_nc,out_channels=64,kernel_size=5,stride=1,padding=2)
self.conv2=nn.Conv2d(in_channels=64,out_channels=32,kernel_size=3,stride=1,padding=1)
self.conv3=nn.Conv2d(in_channels=32,out_channels=in_nc*(upscale ** 2),kernel_size=3,stride=1,padding=1)
self.pixel_shuffle=nn.PixelShuffle(upscale)
def forward(self, x):
out=F.tanh(self.conv1(x))
out=F.tanh(self.conv2(out))
out=F.sigmoid(self.pixel_shuffle(self.conv3(out)))
return out
setting
"name": "espcn_x4"//"001_RRDB_PSNR_x4_DIV2K" // please remove "debug_" during training or tensorboard wounld not work
, "use_tb_logger": true
, "model":"sr"
, "scale": 4
, "gpu_ids": [4]
, "datasets": {
"train": {
"name": "DIV2K800"
, "mode": "LRHR"
, "dataroot_HR": "/home/guanwp/BasicSR_datasets/DIV2K800_sub"
, "dataroot_LR": "/home/guanwp/BasicSR_datasets/DIV2K800_sub_bicLRx4"
, "subset_file": null
, "use_shuffle": true
, "n_workers": 8
, "batch_size": 16//how many samples in each iters
, "HR_size": 192 // 128 | 192
, "use_flip": true
, "use_rot": true
, "val": {
"name": "val_set5"
, "mode": "LRHR"
, "dataroot_HR": "/home/guanwp/BasicSR_datasets/val_set5/Set5"
, "dataroot_LR": "/home/guanwp/BasicSR_datasets/val_set5/Set5_sub_bicLRx4"
, "path": {
"root": "/home/guanwp/BasicSR-master",
"pretrain_model_G": null
,"experiments_root": "/home/guanwp/BasicSR-master/experiments/",
"models": "/home/guanwp/BasicSR-master/experiments/espcn_x4/models",
"log": "/home/guanwp/BasicSR-master/experiments/espcn_x4",
"val_images": "/home/guanwp/BasicSR-master/experiments/espcn_x4/val_images"
, "network_G": {
"which_model_G": "espcn"//"srresnet"//"sr_resnet"//"fsrcnn"//"sr_resnet" // RRDB_net | sr_resnet
, "norm_type": null
, "mode": "CNA"
, "nf": 64//56//64
, "nb": 23
, "in_nc": 3
, "out_nc": 3
, "gc": 32
, "group": 1
, "train": {
"lr_G": 1e-3//1e-3//2e-4
, "lr_scheme": "MultiStepLR"
, "lr_steps": [200000,400000,600000,800000,1000000,1500000]
, "lr_gamma": 0.5
, "pixel_criterion": "l1"//"l1"//'l2'//huber//Cross
, "pixel_weight": 1.0
, "val_freq": 5e3
, "manual_seed": 0
, "niter": 2e6//2e6//1e6
, "logger": {
"print_freq": 200
, "save_checkpoint_freq": 5e3
target
result
结果比原文的结果差一点点,感觉是由于学习率一开始太小带来的~
在之前的博客中已经介绍了ESPCN的原理了(学习笔记之——基于深度学习的图像超分辨率重构)本博文是对ESPCN进行实现。代码的框架仍然采用xintao前辈的代码,本博文会给出关键的实现部分python train.py -opt options/train/train_sr.jsonpython test.py -opt options/test/test_sr.jsonESPCN的网...
(1) 图的定义:图是由点集V=viV={v_i}V=vi以及V中元素无序对的集合E=ekE={e_k}E=ek所构成的二元组,记为G=(V,E)G=(V,E)G=(V,E),V中的元素viv_ivi称为节点,E中的元素eke_kek称为边。通俗理解:图是节点和边构成及集合。
(2) 简单图:不含环和多重边的图称为简单图;多重图:含有多重边的图
(3) 完全图:每一对节点之间都有边相连的简单图称为完全图;有向完全图: 每一对节点间有且仅有一条有向边的简单图
(4) 二部图:图G(V,E)G(V,E)
cuda 9.2
python 3.6
github: [https://github.com/leftthomas/ESPCN](https://github.com/leftthomas/ESPCN)
上面github应该是官方代码,但是用的pytorch0.4以前的版本应该是,cuda是8.0,python是2.7
模型输入:原始低分辨率图片
核心:亚像素卷积。在网络的最末端实现LR到HR的分辨率
背景:之前的SRCNN,通过双三次插值得到的高分辨率的图像,直接从低分辨率LR得到了高分辨率的图片。(输入是双三次插值的高分辨率图像(类似于粗糙的高分辨率图像)),那么在网络卷积中就会造成,粗糙的高分辨率图和标签进行计算。这样计算时间复杂度较大。
ESPCN网络模型
# 网络模型代码
import math
import torch
├── 视频
│ ├── 1CRM客户关系管理系统_项目的配置以及启动.url
│ ├── 2CRM客户关系管理系统_工作桌面_信息中心_邮箱功能_客户管理_订单管理.url
│ └── 3CRM客户关系管理系统_财务管理_产品管理_部门管理_岗位管理_数据回收站_权限管.url
└── 论文
├── 基于Java的现代数字化CRM客户关系管理系统答辩ppt.pptx
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript
代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。
Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用
代码,极大地促进了Node.js生态系统的发展和扩张。
Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。
在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
好的,针对您的问题,安装 PyTorch GPU 版本的步骤如下:
1. 确认您的电脑已经安装了支持 CUDA 的 NVIDIA 显卡,并且已经安装了 CUDA 工具包和 cuDNN 库。
2. 打开 PyTorch 官网(https://pytorch.org/),选择相应的 PyTorch 版本和 CUDA 版本,复制对应的安装命令。
3. 打开 Anaconda Prompt 或者终端,输入命令并执行安装。
例如,如果您要安装 PyTorch 1.9.0 版本,CUDA 11.1 版本,Python 3.8 版本的 GPU 版本,可以使用以下命令:
conda install pytorch torchvision torchaudio cudatoolkit=11.1 -c pytorch -c nvidia
执行完毕后,您就可以在 Python 中使用 PyTorch GPU 版本进行深度学习任务了。