【论文复现】SRGAN

news2024/11/29 6:26:31

1. 项目结构

如何生成文件夹的文件目录呢?

按住shift键,右击你要生成目录的文件夹,选择“在此处打开Powershell窗口”

在命令窗口里输入命令“tree”,按回车。就会显示出目录结构。

├─.idea
│  └─inspectionProfiles
├─benchmark_results
├─data
│  ├─test
│  │  ├─Manga109
│  │  ├─Set14
│  │  ├─Set5
│  │  └─Urban100
│  ├─train_DIV2K_HR
│  └─valid_DIV2K_HR
├─epochs
├─pytorch_ssim
│  └─__pycache__
├─statistics
├─training_results
│  └─SRF_4
└─__pycache__

为了更好地记录这个代码文件夹的结构,我再把.py文件添上去

├─.idea
│  └─inspectionProfiles
├─benchmark_results
├─data
│  ├─test
│  │  ├─Manga109
│  │  ├─Set14
│  │  ├─Set5
│  │  └─Urban100
│  ├─train_DIV2K_HR
│  └─valid_DIV2K_HR
├─epochs
├─pytorch_ssim
│  └─__pycache__
├─statistics
├─training_results
│  └─SRF_4
├─data_utils.py
├─loss.py
├─model.py
├─README.md
├─test_benchmark.py
├─test_image.py
└─train.py

 才拿到代码包的时候,每一个空文件夹下都有一个“.gitkeep文件”。

那么什么是“.gitkeep文件”呢?

因为Git 是一个文件追踪系统,所以Git 不会追踪一个空目录。当我们需要保留空目录的时候,“.gitkeep文件”可以使 Git 保留一个空文件夹。


2. 实验细节

 算法名称 SRGAN
图像域 RGB
下采样方法 双三次核函数下采样4⨉
目标函数 内容损失+对抗损失
生成器 SRResNet
判别器 VGG:判别HR与SR
训练集 DIV2K,800张
验证集 DIV2K,100张
测试集 Set5、Set14、BSD100、Urban100、Manga109

参数配置(在train.py中)

parser = argparse.ArgumentParser(description='Train Super Resolution Models')
parser.add_argument('--crop_size', default=88, type=int, help='training images crop size')
parser.add_argument('--upscale_factor', default=4, type=int, choices=[2, 4, 8],
                    help='super resolution upscale factor')
parser.add_argument('--num_epochs', default=100, type=int, help='train epoch number')

GPU 

为了方便,然后训练集本来也不大,就在本地的NVIDIA GeForce RTX 3050上跑的

持续运行

因为经常把电脑背来背去的,会放进包里,所以要求电脑合上的时候程序也能继续运行。具体实现方法是:

1、点击开始图标,点击控制面板。

2、查看方式选择为“类别”,找到“硬件和声音”功能并点击。

3、在硬件和声音页面,找到更改电源按钮的功能选项并点击。

4、将“关闭盖子时”后方都设置为“不采取任何操作”,最后保存修改即可。

3. 项目解析 

benchmark_results

训练完成后,训练结果会保存到benchmark_results 文件夹中

data

存放训练集、验证集、测试集的地方。

epochs

用于存放每个epoch训练得到的生成器和判别器的模型参数。

pytorch_ssim

计算结构相似性指数SSIM

statistics

存放记录每个epoch训练结果的表格,每跑10个epochs记录一次

training_results

存放验证集结果

里面有一个名为“SRF_4”的文件夹,意思是4⨉的双三次核函数下采样、放大因子为4。

“SRF_4”的文件夹存放着每一个epoch在验证集上的可视化结果,于展示图像超分辨率模型在训练过程中的性能表现。

每组图片包含三列:原始低分辨率图像(val_hr_restore)、对应的高分辨率图像(val_hr)以及模型生成的超分辨率图像(sr)。

data_utils.py

数据集加载

train.py有一行导包代码

from data_utils import TrainDatasetFromFolder, ValDatasetFromFolder, display_transform

所以data_utils.py有一些有关数据集加载的函数以供train.py使用。

都是从库里导的包

from os import listdir
from os.path import join
from PIL import Image
from torch.utils.data.dataset import Dataset
from torchvision.transforms import Compose, RandomCrop, ToTensor, ToPILImage, CenterCrop, Resize

对图像的一些处理 

# 判断文件名是否为常见图像文件格式(不区分大小写)
def is_image_file(filename):
    return any(filename.endswith(extension) for extension in ['.png', '.jpg', '.jpeg', '.PNG', '.JPG', '.JPEG'])

# 根据裁剪尺寸和放大因子计算有效的裁剪尺寸,确保能被放大因子整除
def calculate_valid_crop_size(crop_size, upscale_factor):
    return crop_size - (crop_size % upscale_factor)

# 定义高分辨率训练图像的变换操作:随机裁剪后转换为张量
def train_hr_transform(crop_size):
    return Compose([
        RandomCrop(crop_size),# 随机裁剪图像,裁剪尺寸为传入的crop_size
        ToTensor(),# 将裁剪后的图像转换为张量格式
    ])

# 定义低分辨率训练图像的变换操作:先转换为PIL图像,缩放后再转换为张量
def train_lr_transform(crop_size, upscale_factor):
    return Compose([
        ToPILImage(),# 将高分辨率图像张量转换为PIL图像对象
        Resize(crop_size // upscale_factor, interpolation=Image.BICUBIC),# 将图像缩小为原始尺寸除以放大因子,使用双三次插值
        ToTensor()# 将缩放后的低分辨率图像转换为张量格式
    ])

# 定义用于显示图像的变换操作:调整大小、中心裁剪后转换为张量
def display_transform():
    return Compose([
        ToPILImage(),  # 将图像转换为PIL图像对象
        Resize(400),  # 将图像大小调整为400(可能是为了统一显示尺寸)
        CenterCrop(400),  # 进行中心裁剪,确保关键部分完整
        ToTensor()  # 将处理后的图像转换为张量格式
    ])

从文件夹中加载和预处理训练图像数据

class TrainDatasetFromFolder(Dataset):
    def __init__(self, dataset_dir, crop_size, upscale_factor):
        super(TrainDatasetFromFolder, self).__init__()
        self.image_filenames = [join(dataset_dir, x) for x in listdir(dataset_dir) if is_image_file(x)]
        crop_size = calculate_valid_crop_size(crop_size, upscale_factor)
        self.hr_transform = train_hr_transform(crop_size)
        self.lr_transform = train_lr_transform(crop_size, upscale_factor)

    def __getitem__(self, index):
        hr_image = self.hr_transform(Image.open(self.image_filenames[index]))
        lr_image = self.lr_transform(hr_image)
        return lr_image, hr_image

    def __len__(self):
        return len(self.image_filenames)

从文件夹中加载和预处理验证图像数据 

class ValDatasetFromFolder(Dataset):
    def __init__(self, dataset_dir, upscale_factor):
        super(ValDatasetFromFolder, self).__init__()
        self.upscale_factor = upscale_factor
        self.image_filenames = [join(dataset_dir, x) for x in listdir(dataset_dir) if is_image_file(x)]

    def __getitem__(self, index):
        hr_image = Image.open(self.image_filenames[index])
        w, h = hr_image.size
        crop_size = calculate_valid_crop_size(min(w, h), self.upscale_factor)
        lr_scale = Resize(crop_size // self.upscale_factor, interpolation=Image.BICUBIC)
        hr_scale = Resize(crop_size, interpolation=Image.BICUBIC)
        hr_image = CenterCrop(crop_size)(hr_image)
        lr_image = lr_scale(hr_image)
        hr_restore_img = hr_scale(lr_image)
        return ToTensor()(lr_image), ToTensor()(hr_restore_img), ToTensor()(hr_image)

    def __len__(self):
        return len(self.image_filenames)

 从文件夹中加载和预处理测试图像数据 

class TestDatasetFromFolder(Dataset):
    def __init__(self, dataset_dir, upscale_factor):
        super(TestDatasetFromFolder, self).__init__()
        self.lr_path = dataset_dir + '/SRF_' + str(upscale_factor) + '/data/'
        self.hr_path = dataset_dir + '/SRF_' + str(upscale_factor) + '/target/'
        self.upscale_factor = upscale_factor
        self.lr_filenames = [join(self.lr_path, x) for x in listdir(self.lr_path) if is_image_file(x)]
        self.hr_filenames = [join(self.hr_path, x) for x in listdir(self.hr_path) if is_image_file(x)]

    def __getitem__(self, index):
        image_name = self.lr_filenames[index].split('/')[-1]
        lr_image = Image.open(self.lr_filenames[index])
        w, h 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2249565.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kubernetes 之 Ingress 和 Service 的异同点

1. 概念与作用 1.1 Ingress Ingress 是什么? Ingress主要负责七层负载,将外部 HTTP/HTTPS 请求路由到集群内部的服务。它可以基于域名和路径定义规则,从而将外部请求分配到不同的服务。 ingress作用 提供 基于 HTTP/HTTPS 的路由。 支持 …

结构体详解+代码展示

系列文章目录 🎈 🎈 我的CSDN主页:OTWOL的主页,欢迎!!!👋🏼👋🏼 🎉🎉我的C语言初阶合集:C语言初阶合集,希望能…

Springboot项目搭建(7)

1.概要 2.Layout主页布局 文件地址&#xff1a;src\views\Layout.vue 2.1 script行为模块 从elementUI中选取图标图案。 <script setup> import {Management,Promotion,UserFilled,User,Crop,EditPen,SwitchButton,CaretBottom } from "element-plus/icons-vue…

cocos creator 3.8 俄罗斯方块Demo 10

这里的表格是横行数列&#xff0c;也就是x是行&#xff0c;y是列&#xff0c;不要当x/y轴看。 1-1012-1012-1-1[-1,0]0[0,-1][0,0][0,1][0,2]0[0,0]11[1,0]22[2,0] -1012-1012-1-1[-1,0]0[0,-1][0,0][0,1][0,2]0[0,0]11[1,0]22[2,0] 2-1012-1012-1[-1,-1][-1,0]-1[-1,-1][-1…

Java安全—原生反序列化重写方法链条分析触发类

前言 在Java安全中反序列化是一个非常重要点&#xff0c;有原生态的反序列化&#xff0c;还有一些特定漏洞情况下的。今天主要讲一下原生态的反序列化&#xff0c;这部分内容对于没Java基础的来说可能有点难&#xff0c;包括我。 序列化与反序列化 序列化&#xff1a;将内存…

【Java 学习】面向程序的三大特性:封装、继承、多态

引言 1. 封装1.1 什么是封装呢&#xff1f;1.2 访问限定符1.3 使用封装 2. 继承2.1 为什么要有继承&#xff1f;2.2 继承的概念2.3 继承的语法2.4 访问父类成员2.4.1 子类中访问父类成员的变量2.4.2 访问父类的成员方法 2.5 super关键字2.6 子类的构造方法 3. 多态3.1 多态的概…

LeetCode—74. 搜索二维矩阵(中等)

仅供个人学习使用 题目描述&#xff1a; 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。 每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true…

uniapp关闭sourceMap的生成,提高编译、生产打包速度

警告信息&#xff1a;[警告⚠] packageF\components\mpvue-echarts\echarts.min.js 文件体积超过 500KB&#xff0c;已跳过压缩以及 ES6 转 ES5 的处理&#xff0c;手机端使用过大的js库影响性能。 遇到问题&#xff1a;由于微信小程序引入了mpvue-echarts\echarts.min.js&…

房屋出租出售预约系统支持微信小程序+H5+APP

核心功能有&#xff1a;新盘销售、房屋租赁、地图找房、小区找房&#xff0c;地铁找房等方式。 地图找房&#xff1a;通过地图标注查看附近房源&#xff0c;方便用户根据地理位置查找合适的房产。二手房资讯&#xff1a;提供租房及二手房市场的相关资讯&#xff0c;帮助用户了…

Axure农业农村数据可视化大屏模板分享

在当今信息技术飞速发展的时代&#xff0c;数据可视化已成为各行各业提升管理效率、优化决策过程的重要手段。Axure作为一款强大的原型设计工具&#xff0c;凭借其高度的自定义能力和丰富的交互设计功能&#xff0c;在农业农村数据可视化领域展现出强大的潜力。本文将详细介绍A…

【分享】PPT打开密码的设置与移除方法

设置和取消PPT的打开密码&#xff0c;是保障和移除文件访问权限的重要操作。以下将分别讲解如何为PPT设置密码&#xff0c;以及如何取消打开密码。 一、如何设置PPT打开密码 方法1&#xff1a; 1、在PowerPoint中打开目标文件&#xff0c;然后点击左上角的“文件”选项。在弹…

网络基础 - 地址篇

一、IP 地址 IP 协议有两个版本&#xff0c;IPv4 和 IPv6IP 地址(IPv4 地址)是一个 4 字节&#xff0c;32 位的正整数&#xff0c;通常使用 “点分十进制” 的字符串进行表示&#xff0c;例如 192.168.0.1&#xff0c;用点分割的每一个数字表示一个字节&#xff0c;范围是 0 ~…

在 Ubuntu 上部署 MediaWiki 开源维基平台

MediaWiki 是一个功能强大的开源维基软件&#xff0c;全球众多组织使用它来创建协作文档网站。本文将指导你如何在 Ubuntu 服务器上安装 MediaWiki&#xff0c;使用 Nginx 作为 Web 服务器&#xff0c;PostgreSQL 作为数据库管理系统。 简介 MediaWiki 是一个灵活且强大的维基…

Spring Boot整合EasyExcel

文章目录 EasyExcel简介Spring Boot整合EasyExcel一、单sheet写操作二、多sheet写数据三、读操作 EasyExcel简介 1、EasyExcel 是一个基于 Java 的简单、省内存的读写 Excel 的开源项目。在尽可能节约内存的情况下支持读写百 M 的 Excel&#xff08;没有一次性将数据读取到内存…

Java 基础面试题

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

deepin 安装 chrome 浏览器

deepin 安装 chrome 浏览器 最近好多小伙伴儿和我说 deepin 无法安装最新的谷歌浏览器 其实是因为最新的 谷歌浏览器 其中的一个依赖需要提前安装 提前安装依赖然后再安装谷歌浏览器就可以了 安装 fonts-liberationsudo apt -y install fonts-liberation安装 chrome 浏览器sudo…

数据结构2:顺序表

目录 1.线性表 2.顺序表 2.1概念及结构 2.2接口实现 1.线性表 线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串 线性表在逻辑上是线性结构&#xff0c;也就说…

Java 反射(Reflection)

Java 反射&#xff08;Reflection&#xff09; Java 反射&#xff08;Reflection&#xff09;是一个强大的特性&#xff0c;它允许程序在运行时查询、访问和修改类、接口、字段和方法的信息。反射提供了一种动态地操作类的能力&#xff0c;这在很多框架和库中被广泛使用&#…

利用Python爬虫阿里巴巴中国站获得跨境属性的详细指南

在全球化贸易的背景下&#xff0c;跨境电商成为了连接全球买家和卖家的重要桥梁。阿里巴巴中国站作为全球知名的B2B电子商务平台&#xff0c;提供了海量的商品信息&#xff0c;其中跨境属性信息对于跨境电商尤为重要。本文将详细介绍如何使用Python编写爬虫&#xff0c;从阿里巴…

【JavaEE】Spring Web MVC

目录 一、Spring Web MVC简介1.1 MVC简介1.2 Spring MVC1.3 RequestMapping注解1.3.1 使用1.3.2 RequestMapping的请求设置1.3.2.1 方法11.3.2.2 方法2 二、Postman介绍2.1 创建请求2.2 界面如下&#xff1a;2.3 传参介绍 一、Spring Web MVC简介 官方文档介绍&#xff1a; Sp…