当前位置: 首页 > article >正文

PlainUSR:轻量实时图像超分(RepMBCConv + LIA + PlainU-Net)

文章目录PlainUSR轻量实时图像超分RepMBCConv LIA PlainU-Net一、架构二、环境三、数据 (DIV2K)四、模型4.1 RepMBCConv (重参数化轻量卷积)4.2 LIA (局部重要性注意力)4.3 PlainU-Net PlainUSR五、训练训练曲线六、推理 重参数化七、结果八、优化九、总结代码链接与详细流程购买即可解锁1000YOLO优化文章并且还有海量深度学习复现项目价格仅需两杯奶茶的钱每日更新PlainUSR轻量实时图像超分RepMBCConv LIA PlainU-Net一、架构LR 输入 (H × W × 3) ↓ Bicubic 上采样至 4H × 4W ↓ PlainU-Net ├── Down1: RepMBCConv (3→64) → LIA ├── Down2: RepMBCConv (64→128, stride2) → LIA ├── Up: Bilinear (128→128) cat(Down1) ├── Up1: RepMBCConv (192→64) → LIA └── Up2: RepMBCConv (64→3) → Tanh ↓ HR 输出 (4H × 4W × 3)模块参数量速度 (RTX 3060)轻量 Conv (RepMBCConv)~1.2K/层快 (重参数化融合)LIA~4K 0.1msPlainU-Net 整体~1.5M~2ms (480p→4K)EDSR~43M~25msSwinIR~12M~40ms二、环境conda create-nplainusrpython3.8-yconda activate plainusr pipinstalltorch torchvision matplotlib opencv-python三、数据 (DIV2K)DIV2K/ ├── DIV2K_train_HR/ # 800 张 └── DIV2K_valid_HR/ # 100 张importtorchfromtorch.utils.dataimportDataset,DataLoaderfromtorchvisionimporttransformsfromPILimportImageimportosclassSRDataset(Dataset):def__init__(self,hr_dir,scale4,patch_size64):self.imagessorted(os.listdir(hr_dir))self.scalescale self.patch_sizepatch_size self.to_tensortransforms.ToTensor()def__len__(self):returnlen(self.images)def__getitem__(self,idx):hrImage.open(os.path.join(self.hr_dir,self.images[idx]))hrhr.convert(RGB)hr_tself.to_tensor(hr)# 下采样得到 LRh,whr_t.shape[1],hr_t.shape[2]lr_h,lr_wh//self.scale,w//self.scale lrtransforms.Resize((lr_h,lr_w),interpolationImage.BICUBIC)(transforms.ToPILImage()(hr_t))lrself.to_tensor(lr)# Bicubic 上采样回原尺寸lr_uptransforms.Resize((h,w),interpolationImage.BICUBIC)(lr)# 归一化到 [-1, 1]returnlr_up*2-1,hr_t*2-1四、模型4.1 RepMBCConv (重参数化轻量卷积)importtorch.nnasnnimporttorch.nn.functionalasFclassRepMBCConv(nn.Module):训练多分支 → 推理融合为单分支def__init__(self,in_ch,out_ch,kernel3,stride1,padding1):super().__init__()self.dw_convnn.Conv2d(in_ch,out_ch,kernel,stride,padding,groupsin_ch,biasFalse)self.pw_convnn.Conv2d(in_ch,out_ch,1,1,0,biasFalse)self.bnnn.BatchNorm2d(out_ch)self.relunn.ReLU()# 初始化nn.init.kaiming_normal_(self.dw_conv.weight,modefan_out)nn.init.kaiming_normal_(self.pw_conv.weight,modefan_out)defforward(self,x):returnself.relu(self.bn(self.dw_conv(x))self.bn(self.pw_conv(x)))deffuse(self):推理时将两个分支合并为一个 Convdeviceself.dw_conv.weight.device# 融合 BNdw_w,dw_bself._fuse_bn(self.dw_conv,self.bn)pw_w,pw_bself._fuse_bn(self.pw_conv,self.bn)# 合并权重 (dw_conv pw_conv)padself.dw_conv.padding pw_w_padF.pad(pw_w,[pad[0]]*4)fused_wdw_wpw_w_pad fused_bdw_bpw_b fused_convnn.Conv2d(self.dw_conv.in_channels,self.dw_conv.out_channels,self.dw_conv.kernel_size,self.dw_conv.stride,self.dw_conv.padding,biasTrue,).to(device)fused_conv.weight.datafused_w fused_conv.bias.datafused_breturnnn.Sequential(fused_conv,self.relu)def_fuse_bn(self,conv,bn):wconv.weight meanbn.running_mean varbn.running_var gammabn.weight betabn.bias epsbn.eps stdtorch.sqrt(vareps)w_fusedw*(gamma/std).view(-1,1,1,1)b_fusedbeta-mean*gamma/stdreturnw_fused,b_fused4.2 LIA (局部重要性注意力)classLocalImportanceAttention(nn.Module):通道注意力 空间重要性def__init__(self,channels,reduction4):super().__init__()self.avg_poolnn.AdaptiveAvgPool2d(1)self.fcnn.Sequential(nn.Linear(channels,channels//reduction),nn.ReLU(),nn.Linear(channels//reduction,channels),nn.Sigmoid(),)defforward(self,x):b,c,_,_x.shape yself.avg_pool(x).view(b,c)yself.fc(y).view(b,c,1,1)returnx*y4.3 PlainU-Net PlainUSRclassPlainU_NET(nn.Module):轻量 U-Netdef__init__(self,in_ch3,out_ch3,base_ch64):super().__init__()self.down1nn.Sequential(RepMBCConv(in_ch,base_ch),LocalImportanceAttention(base_ch),)self.down2nn.Sequential(RepMBCConv(base_ch,base_ch*2,stride2),LocalImportanceAttention(base_ch*2),)self.upnn.Upsample(scale_factor2,modebilinear,align_cornersFalse)self.conv_upnn.Sequential(RepMBCConv(base_ch*3,base_ch),LocalImportanceAttention(base_ch),)self.outnn.Sequential(RepMBCConv(base_ch,out_ch),nn.Tanh(),)defforward(self,x):e1self.down1(x)e2self.down2(e1)# 128ch, 1/2uself.up(e2)# 128ch, 1/1utorch.cat([u,e1],dim1)# 192chuself.conv_up(u)# 64chreturnself.out(u)classPlainUSR(nn.Module):def__init__(self,scale4):super().__init__()self.scalescale self.backbonePlainU_NET()defforward(self,x):# Bicubic 上采样到目标尺寸xF.interpolate(x,scale_factorself.scale,modebilinear,align_cornersFalse)returnself.backbone(x)modelPlainUSR(scale4)print(f参数量:{sum(p.numel()forpinmodel.parameters())/1e6:.2f}M)# ~1.5M五、训练importtorch.optimasoptim devicetorch.device(cudaiftorch.cuda.is_available()elsecpu)modelPlainUSR(scale4).to(device)criterionnn.L1Loss()optimizeroptim.Adam(model.parameters(),lr1e-4)train_dsSRDataset(DIV2K/DIV2K_train_HR,scale4)train_loaderDataLoader(train_ds,batch_size16,shuffleTrue,num_workers4)num_epochs100forepochinrange(num_epochs):model.train()total_loss0.0forlr,hrintrain_loader:lr,hrlr.to(device),hr.to(device)optimizer.zero_grad()srmodel(lr)losscriterion(sr,hr)loss.backward()optimizer.step()total_lossloss.item()avg_losstotal_loss/len(train_loader)if(epoch1)%100:print(fEpoch{epoch1:3d}| Loss{avg_loss:.5f})训练曲线Epoch 10 | Loss0.0832 Epoch 20 | Loss0.0541 Epoch 30 | Loss0.0428 Epoch 40 | Loss0.0367 Epoch 50 | Loss0.0331 Epoch 70 | Loss0.0285 Epoch 100 | Loss0.0243六、推理 重参数化definference(model,lr_path,output_path):model.eval()# 融合 weight (训练→推理)forminmodel.modules():ifisinstance(m,RepMBCConv):m.fuse()imgImage.open(lr_path).convert(RGB)lr_ttransforms.ToTensor()(img).unsqueeze(0).to(device)lr_tlr_t*2-1withtorch.no_grad():sr_tmodel(lr_t)sr_img(sr_t.squeeze(0).cpu()1)/2sr_imgtransforms.ToPILImage()(sr_img.clamp(0,1))sr_img.save(output_path)七、结果数据集PSNR (dB)SSIM推理时间 (480p)Set531.420.8951.8msSet1428.150.8121.8msBSD10027.040.7931.8msUrban10025.830.8241.8ms对比PSNR (Set5, ×4)参数量速度Bicubic28.43-0msEDSR32.4643M25msSwinIR32.9212M40msPlainUSR31.421.5M1.8ms八、优化问题原因解决PSNR 低于 EDSR参数量只有 1.5M增大 base_ch96 (3.2M)纹理不够锐利L1 损失过于平滑加入感知损失 (VGG16 layer8)重参数化 fusion 后精度下降BN 融合误差用 100 张校准集微调 fused weight训练慢Bicubic 上采样全图预下采样 LR 再训练九、总结PlainUSR 超分链路Bicubic 上采样 → RepMBCConv (训练多分支/推理单分支) LIA (通道注意力) PlainU-Net (down→upskip) → Tanh 输出。参数量仅 1.5M (EDSR 的 3.5%), 480p 推理 1.8ms (RTX 3060), PSNR31.42 (Set5, ×4)。推荐轻量场景 (移动端/实时视频) 使用若需要最高 PSNR 建议换 HAT/SwinIR。训练 100 epoch 后调用model.fuse()融合重参数化分支再部署。代码链接与详细流程飞书链接https://ecn6838atsup.feishu.cn/wiki/EhRtwBe1CiqlSEkHGUwc5AP9nQe?fromfrom_copylink密码946m228链接可用不要多复制空格了

相关文章:

PlainUSR:轻量实时图像超分(RepMBCConv + LIA + PlainU-Net)

文章目录PlainUSR:轻量实时图像超分(RepMBCConv LIA PlainU-Net)一、架构二、环境三、数据 (DIV2K)四、模型4.1 RepMBCConv (重参数化轻量卷积)4.2 LIA (局部重要性注意力)4.3 PlainU-Net PlainUSR五、训练训练曲线六、推理 重参数化七、…...

国家补贴1000万人次学技能:AI、新能源、康养最热,普通人怎么抢到这张免费升职券?

大家好,我是LeafStay。职场成长 有一件很多人不知道的事:2026年,国家正在花真金白银,补贴1000万人次学技能。补贴最高5000元,方向聚焦AI、新能源、康养三大领域。但多数人根本不知道这笔钱的存在,也不知道怎…...

从‘灰度世界’到‘神经引擎’:聊聊手机ISP里3A算法(AE/AWB/AF)的二十年进化史

从‘灰度世界’到‘神经引擎’:手机ISP中3A算法的二十年技术革命 当你在昏暗的餐厅里拍下一张美食照片,手机自动调整亮度让牛排纹理分明;当你在雪地里拍摄时,画面不会因为反光而惨白一片;当你快速切换拍摄对象时&#…...

Marzipano 核心组件深度解析:从几何体到渲染器的完整架构

Marzipano 核心组件深度解析:从几何体到渲染器的完整架构 【免费下载链接】marzipano A 360 media viewer for the modern web. 项目地址: https://gitcode.com/gh_mirrors/ma/marzipano Marzipano 是一款强大的现代 Web 360 媒体查看器,其核心架…...

Kala ISO 8601调度语法详解:从基础时间格式到复杂间隔配置

Kala ISO 8601调度语法详解:从基础时间格式到复杂间隔配置 【免费下载链接】kala Modern Job Scheduler 项目地址: https://gitcode.com/gh_mirrors/ka/kala Kala作为一款现代作业调度器(Modern Job Scheduler),采用ISO 86…...

GDB 调试完全指南:从入门到工程实战

GDB 调试完全指南:从入门到工程实战 这份教程旨在帮助你建立系统的调试思维,不仅掌握命令,更掌握解决复杂问题的方法。第一章:工欲善其事(环境与配置) 在开始调试之前,必须确保你的“武器”已经…...

天力监控看板:大宗材料与汇率波动的智慧管家

在复杂多变的市场环境中,大宗材料价格及汇率的波动直接影响着企业的成本控制和盈利能力。为了更好地应对这些挑战,JBoltAI团队为天力定制开发了一款大宗材料及汇率波动监控看板,为企业提供全面、实时、可追溯的数据监控与分析工具。一、总览看…...

Compose:1.3 组合、重组作用域和 remember()

文章目录recompose 重组rememberrecompose 性能风险与智能优化、Stablerecompose 智能优化Stable小结总结recompose 重组 我们先上一段代码,你觉得下面代码最终执行结果是什么: setContent {// 注意:这里将 MutableState 放在 setContent {…...

Sciter核心架构深度解析:理解嵌入式UI引擎的工作原理

Sciter核心架构深度解析:理解嵌入式UI引擎的工作原理 【免费下载链接】sciter-sdk Sciter is an embeddable HTML/CSS/scripting engine 项目地址: https://gitcode.com/gh_mirrors/sc/sciter-sdk Sciter是一款功能强大的嵌入式HTML/CSS/脚本引擎&#xff0c…...

神经网络实战技巧:从权重初始化到模型部署优化

1. 神经网络实战技巧综述在咖啡厅里打开笔记本电脑调试神经网络的日子,我总会在键盘旁边放一本翻得卷边的《Neural Tricks of the Trade》。这本书不像传统教材那样堆砌数学公式,而是收录了数十位从业者在实战中总结的"黑科技"。今天我就结合自…...

解锁微软VS Code扩展限制:在非官方编辑器中使用C#/C++扩展

1. 项目概述与背景 如果你是一名深度使用非官方 VS Code 分支(比如 Cursor、VSCodium、Code - OSS)的开发者,那么你很可能在尝试安装微软官方出品的 C# 或 C/C 扩展时,遇到过那个令人沮丧的弹窗:“The C/C extension …...

OpenBullet2配置详解:深入理解每个参数的作用与调优

OpenBullet2配置详解:深入理解每个参数的作用与调优 【免费下载链接】OpenBullet2 OpenBullet reinvented 项目地址: https://gitcode.com/gh_mirrors/op/OpenBullet2 OpenBullet2是一款强大的自动化测试工具,通过灵活的配置参数可以实现各种复杂…...

R语言机器学习数据集处理与建模实战指南

1. 为什么选择R语言处理机器学习数据集?R语言作为统计计算领域的经典工具,在数据处理和可视化方面有着天然优势。CRAN(Comprehensive R Archive Network)上超过15,000个扩展包中,有超过1/3与数据分析和机器学习直接相关…...

怎样通过三维CT查看是否有蛀牙

1 打开weasis-----调整到三视图2 这个时候左边的视图是上视图,因为牙齿有2排,所以需要过滤:--------------调节右下角视图中的红线到上下牙齿的交界处------------此时上视图会只显示出上排的牙齿3 这个时候还是只能确定有虫牙,但…...

RSpec-Rails-Examples自定义匹配器开发:如何创建可读性强的测试断言

RSpec-Rails-Examples自定义匹配器开发:如何创建可读性强的测试断言 【免费下载链接】rspec-rails-examples eliotsykes/rspec-rails-examples: RSpec-Rails-Examples 是一个用于 Rails 应用程序测试的示例库,提供了多种 RSpec 测试的示例和教程&#xf…...

词嵌入技术解析:从Word2Vec到工业应用

1. 词嵌入技术全景解读2013年Word2Vec的横空出世彻底改变了自然语言处理的游戏规则。当时我在处理一个电商评论分类项目,传统TF-IDF方法在语义相似度判断上表现糟糕,直到尝试了词向量——"手机"和"智能手机"的余弦相似度达到0.92&am…...

Geo-Bootstrap实战案例:创建具有90年代魅力的个人作品集网站

Geo-Bootstrap实战案例:创建具有90年代魅力的个人作品集网站 【免费下载链接】geo-bootstrap A timeless Twitter Bootstrap theme built for the modern web. 项目地址: https://gitcode.com/gh_mirrors/ge/geo-bootstrap Geo-Bootstrap是GitHub加速计划中的…...

基于eBPF的ingraind安全监控探针:原理、部署与实战指南

1. 项目概述:基于eBPF的现代安全监控探针如果你在运维一个规模化的容器集群,或者管理着成百上千的Linux服务器,那么“监控”这个词对你来说,可能既熟悉又头疼。熟悉的是,我们离不开CPU、内存、磁盘IO这些基础指标&…...

开源代码生成工具MassGen:模板驱动,解放重复编码生产力

1. 项目概述:一个面向开发者的开源代码生成工具最近在和一些做企业级应用开发的朋友聊天,大家普遍提到一个痛点:面对那些高度重复、模式固定的业务代码(比如增删改查的Controller、Service、DAO层,或者基于数据库表结构…...

Geo-Bootstrap开发者深度指南:源码结构与扩展开发

Geo-Bootstrap开发者深度指南:源码结构与扩展开发 【免费下载链接】geo-bootstrap A timeless Twitter Bootstrap theme built for the modern web. 项目地址: https://gitcode.com/gh_mirrors/ge/geo-bootstrap Geo-Bootstrap是一个为现代Web构建的经典Twit…...

chrome-cdp工作原理解析:如何通过WebSocket与Chrome DevTools协议通信

chrome-cdp工作原理解析:如何通过WebSocket与Chrome DevTools协议通信 【免费下载链接】chrome-cdp-skill Give your AI agent access to your live Chrome session — works out of the box, connects to tabs you already have open 项目地址: https://gitcode.…...

量子纠缠检测的SWAP测试原理与光子芯片实现

1. 量子纠缠检测的核心挑战与SWAP测试原理量子纠缠作为量子计算最独特的资源,其检测与量化一直是量子信息科学的核心课题。传统纠缠见证方法通常需要完整量子态层析,这随系统规模呈指数级增长的计算复杂度严重制约了实际应用。而基于SWAP测试的两比特纠缠…...

Motor Admin与现有系统集成:无缝对接企业应用生态

Motor Admin与现有系统集成:无缝对接企业应用生态 【免费下载链接】motor-admin Deploy a no-code admin panel for any application in less than a minute. Search, create, update, and delete data entries, create custom actions, and build reports. 项目地…...

开源代码审计工具opencode:基于异常检测的智能安全扫描实践

1. 项目概述:一个开源代码审计与异常检测工具最近在跟几个做安全开发的朋友聊天,大家普遍提到一个痛点:项目大了,代码库动辄几十万行,每次上线前的人工代码审计(Code Review)都像大海捞针&#…...

Dantotsu常见问题解答:解决登录失败、下载错误与性能优化技巧

Dantotsu常见问题解答:解决登录失败、下载错误与性能优化技巧 【免费下载链接】Dantotsu Anilist client based on Saikou 项目地址: https://gitcode.com/gh_mirrors/da/Dantotsu Dantotsu是一款基于Saikou的Anilist客户端,为动漫爱好者提供便捷…...

ARM1020E处理器勘误与硬件调试实战指南

1. ARM1020E Rev1处理器勘误深度解析作为一名长期从事ARM架构开发的工程师,我深知处理器勘误(Errata)对系统稳定性的关键影响。今天我将结合ARM1020E Rev1的实际案例,分享三类勘误的处理经验,特别是硬件调试中的典型问…...

GAN七日实战:从原理到PyTorch实现

1. 生成对抗网络入门指南:7天速成实战路线第一次接触GAN时,我被它生成的人脸图片震撼得说不出话——那些根本不存在的人像,连皮肤纹理和发丝都栩栩如生。作为计算机视觉领域的革命性技术,生成对抗网络(GAN)…...

Preact高阶组件:逻辑复用的终极设计模式指南

Preact高阶组件:逻辑复用的终极设计模式指南 【免费下载链接】preact ⚛️ Fast 3kB React alternative with the same modern API. Components & Virtual DOM. 项目地址: https://gitcode.com/gh_mirrors/pr/preact 在现代前端开发中,高效的…...

如何快速掌握Preact:从零开始的现代前端框架完整指南

如何快速掌握Preact:从零开始的现代前端框架完整指南 【免费下载链接】preact ⚛️ Fast 3kB React alternative with the same modern API. Components & Virtual DOM. 项目地址: https://gitcode.com/gh_mirrors/pr/preact Preact是一个仅4kB大小的现代…...

正则表达式终极指南:10个文本处理匹配技巧

正则表达式终极指南:10个文本处理匹配技巧 【免费下载链接】interview 📚 C/C 技术面试基础知识总结,包括语言、程序库、数据结构、算法、系统、网络、链接装载库等知识及面试经验、招聘、内推等信息。This repository is a summary of the b…...