# SPIN复现+改进 **Repository Path**: wangpin-code/spin-replication-improvement ## Basic Information - **Project Name**: SPIN复现+改进 - **Description**: 作为计算机视觉大作业,复现并改进SPIN图像超分模型,进行了一次跳跃性的尝试,并取得了不错的成果。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-04-20 - **Last Updated**: 2025-04-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SPIN论文复现及改进 ## 数据: https://pan.baidu.com/s/122MZ5DkZfHWQ3X_-7x8DFw?pwd=1234 ## 运行: ./train.sh python eval.py ## 发表信息 ICCV2023 ## 背景介绍 ### 做什么的 图像超分辨率:给定一张低分辨率图片,基于此得到高分辨率的图片。(如果需要,我给你发几张) ### 当前问题和解决方案 有太多的办法能够解决图像超分,但是或者不够清晰或者不够轻量。最轻量的是双线性插值(并非深度学习方法),效果差;效果好的,一般的采用了注意力机制的方式,网络参数量较大、对训练设备的要求更高。 ![alt text](images_readme/PSNR-SIZE.png) 如图所示,SPIN在超分效果和轻量化之间达到了比较好的平衡。(红点是SPIN) ## 作者方法 #### 作者整体架构 ![alt text](images_readme/作者整体架构.png) #### SPA模块 超像素聚合(super pixel aggregation)。一般的基于注意力的方法,例如ViT,会均匀的将图像划分为patch,将每个patch视为token,进行和NLP相同的自注意力方法。 作者用图卷积神经网络的方法,指定一些像素作为超像素的根;而后计算每个像素和这些超像素之间的关系,递归的将当前和超像素相接近的像素聚合成新的超像素,从而实现了基于语意的超像素聚合方法。右侧的两张图是超像素聚合后的结果。 ![alt text](images_readme/super_pixe.png) #### SPCA模块 超像素间的信息融合。Transformer架构最主要的优势就是获取长距离依赖,可以跨越长距离获得token之间的相关性。 作者的方法主要体现在,通过超像素作为query矩阵、和像素构成的KV矩阵进行信息融合,从而将超像素信息融合的像素信息中;而后用得到的矩阵作为key矩阵、将原始的value矩阵继续做value矩阵,将超像素信息融合回像素矩阵中。从而实现长距离依赖。 ![alt text](images_readme/SPCA.png) #### ISPA模块 融合超像素内部的信息。就是对超像素内部的每个像素之间进行注意力机制。考虑到超像素的大小并不相同,比如鸟的眼睛可能是一个超像素的注意区域、而鸟的身体又是另一个区域,鸟的身体肯定比鸟的眼睛大多了,自然不同超像素也就不一样大。作者的方法是,对于超像素下辖的像素,选取top-k个和超像素最接近的,其中k的选择能够保证比每个超像素都小。这个过程即是一种工程技巧,也是减少参数量的重要方法。 ![alt text](images_readme/ISPA.png) ## 我们的改进 1. 实际实验中,我们发现4090显卡运行本实验比较吃力,因此想要对作者的方法进行改进 2. transformer中,MLP模块所占用的显存和需要的计算量更多。我们参考微软的StarNet,对MLP层进行了改进。 ![alt text](images_readme/starnet.png) 3. 参考SparseAttention,在SPCA模块中,我们有意的让super pixel只能注意到和自己最相关的pixe ![alt text](images_readme/sparse.png) ## 取得效果 效果不掉,快了10s ### 运行结果: | 运行结果 | 作者原版 | 加快10秒 | | :--- | :---: | ---: | | 训练损失 | 0.039281 | 数据3 | | 测试损失 | 0.04 | 数据6 | | 模糊打分 | 24.625 | 24.55 | 运行结果见train.log