【天文】星光超分辨图像增强

天文望远镜是天文学家的另一双眼睛,其空间分辨率和空间采样率是两个重要指标。传统光学望远镜的分辨率受到光的衍射极限的物理限制,而禁止人们通过望远镜获取无限细节。 STAR,这是一个大规模的天文SR数据集,包含54,738个通量一致的星场图像对,覆盖了广泛的天体区域。这些对将哈勃太空望远镜的高分辨率观测与通过保存通量的数据生成管道生成的物理忠实的低分辨率对应物相结合,从而能够系统地开发场级 ASR 模型。

超分辨率(SR)技术通过实现经济高效的高分辨率图像捕获,推动了天文成像的发展,这对于探测遥远的天体和进行精确的结构分析至关重要。然而,现有的天文超分辨率(ASR)数据集存在三个关键局限性:通量不一致、目标裁剪设置以及数据多样性不足,这严重阻碍了ASR的发展。

STAR:天文星场超分辨率的基准

STAR是一个大规模的天文超分辨率数据集,包含54,738对通量一致的星场图像对,覆盖了广阔的天区。这些图像对将哈勃太空望远镜的高分辨率观测数据与通过通量保留数据生成管道生成的物理上可信的低分辨率对应图像相结合,从而能够系统地开发场级ASR模型。为了进一步推动ASR领域的发展,STAR提供了一种新颖的通量误差(FE)指标,用于从物理角度评估SR模型。利用这个基准,提出了一种通量不变超分辨率(FISR)模型,该模型可以根据输入的光度信息准确推断出通量一致的高分辨率图像,在新设计的通量一致性指标上比几种SR最先进方法高出24.84%,显示在天体物理学中的优势。大量实验证明了提出的方法的有效性和数据集的价值。

复制代码
from .common import *
# import common
import time
import torch
# print(torch.__version__)
import torch.nn as nn
import torch.nn.functional as F
from pdb import set_trace as stx
import numbers


from einops.layers.torch import Rearrange
import time
from . import MODEL
from .base_model import Base_Model
from .model_init import *
from einops import repeat, rearrange
import torch.nn.functional as F

url = {
    'r16f64x2': 'https://cv.snu.ac.kr/research/EDSR/models/edsr_baseline_x2-1bc95232.pt',
    'r16f64x3': 'https://cv.snu.ac.kr/research/EDSR/models/edsr_baseline_x3-abf2a44e.pt',
    'r16f64x4': 'https://cv.snu.ac.kr/research/EDSR/models/edsr_baseline_x4-6b446fab.pt',
    'r32f256x2': 'https://cv.snu.ac.kr/research/EDSR/models/edsr_x2-0edfb8a3.pt',
    'r32f256x3': 'https://cv.snu.ac.kr/research/EDSR/models/edsr_x3-ea3ef2c6.pt',
    'r32f256x4': 'https://cv.snu.ac.kr/research/EDSR/models/edsr_x4-4f62e9ef.pt'
}

# def make_model(args, parent=False):
#     return EDSR(args)

@MODEL.register
class EDSR(Base_Model):
    def __init__(self,  
                
                n_resblocks=32,
                n_feats =64,
                scale= 2,
                res_scale = 0.1,
                n_colors=1,
                rgb_range = 255,
                **kwargs):
        super(EDSR, self).__init__(**kwargs)

        self.n_resblocks = n_resblocks
        self.n_feats = n_feats
        kernel_size = 3 
        self.scale = scale
        self.res_scale = res_scale
        self.n_colors = n_colors
        self.rgb_range = rgb_range
        conv=default_conv

        act = nn.ReLU(True)
        url_name = 'r{}f{}x{}'.format(self.n_resblocks, self.n_feats, self.scale)
        if url_name in url:
            self.url = url[url_name]
        else:
            self.url = None
        self.sub_mean = MeanShift(self.rgb_range)
        self.add_mean = MeanShift(self.rgb_range, sign=1)

        # define head module
        m_head = [conv(self.n_colors, self.n_feats, kernel_size)]

        # define body module
        m_body = [
            ResBlock(
                conv, self.n_feats, kernel_size, act=act, res_scale=self.res_scale
            ) for _ in range(self.n_resblocks)
        ]
        m_body.append(conv(self.n_feats, self.n_feats, kernel_size))

        # define tail module
        m_tail = [
            Upsampler(conv, self.scale, self.n_feats, act=False),
            conv(self.n_feats, self.n_colors, kernel_size)
        ]

        self.head = nn.Sequential(*m_head)
        self.body = nn.Sequential(*m_body)
        self.tail = nn.Sequential(*m_tail)

    def forward(self, x,targets):
        # x = self.sub_mean(x)
        x = self.head(x)

        res = self.body(x)
        res += x

        x = self.tail(res)
        pred_img = x
        # x = self.add_mean(x)
        if self.training:
            # 提取 targets 中的数据
            attn_map = targets['attn_map']
            mask_float = targets['mask']
            attn_map = torch.nan_to_num(attn_map, nan=0.0)
            # 计算 L1 损失
            l1_loss = (torch.abs(pred_img - targets['hr']) * mask_float).sum() / (mask_float.sum() + 1e-3)
            weighted_diff = torch.abs(pred_img - targets['hr']) * attn_map
            flux_loss = weighted_diff.sum() / (attn_map.sum() + 1e-3)
            total_loss = l1_loss + 0.01 * flux_loss
            losses = dict(l1_loss=l1_loss, flux_loss=0.01*flux_loss)
            return total_loss, losses
        else:
            return dict(pred_img = pred_img)
        # return x 

损失函数非常巧妙,它不是一个简单的L1或L2损失,而是一个复合损失函数 ,由两部分加权组成:一个带掩码(Masked)的L1损失 和一个带注意力权重(Attention-weighted)的L1损失

GuoCheng12/STAR: This repo is used for super-resolution in astronomy.

天文学家的修图技术,可比AI厉害多了

相关推荐
张人玉44 分钟前
Cognex VisionPro 相机工具集成代码分析笔记
数码相机·计算机视觉·vsionpro
AI浩2 小时前
VSSD:具有非因果状态空间对偶性的视觉Mamba模型
人工智能·目标检测·计算机视觉
深度学习lover5 小时前
<数据集>yolo航拍斑马线识别数据集<目标检测>
人工智能·深度学习·yolo·目标检测·计算机视觉·数据集·航拍斑马线识别
这张生成的图像能检测吗5 小时前
(论文速读)AIMV2:一种基于多模态自回归预训练的大规模视觉编码器方法
人工智能·计算机视觉·预训练·视觉语言模型
AndrewHZ6 小时前
【图像处理基石】 怎么让图片变成波普风?
图像处理·算法·计算机视觉·风格迁移·cv
CV实验室8 小时前
AAAI 2026 Oral 之江实验室等提出MoEGCL:在6大基准数据集上刷新SOTA,聚类准确率最高提升超8%!
人工智能·机器学习·计算机视觉·数据挖掘·论文·聚类
QTreeY1238 小时前
detr目标检测+deepsort/strongsort/bytetrack/botsort算法的多目标跟踪实现
人工智能·算法·yolo·目标检测·计算机视觉·目标跟踪
yolo_guo15 小时前
opencv 学习: QA_01 什么是图像锐化
linux·c++·opencv·计算机视觉
QTreeY12315 小时前
yolov5/8/9/10/11/12/13+deep-oc-sort算法的目标跟踪实现
人工智能·算法·yolo·目标检测·计算机视觉·目标跟踪
nnn__nnn16 小时前
图像分割技术全解析:从传统算法到深度学习的视觉分割革命
深度学习·算法·计算机视觉