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

天文望远镜是天文学家的另一双眼睛,其空间分辨率和空间采样率是两个重要指标。传统光学望远镜的分辨率受到光的衍射极限的物理限制,而禁止人们通过望远镜获取无限细节。 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厉害多了

相关推荐
再__努力1点2 小时前
【77】积分图像:快速计算矩形区域和核心逻辑
开发语言·图像处理·人工智能·python·算法·计算机视觉
ccLianLian2 小时前
DINO系列
人工智能·计算机视觉
Coding茶水间3 小时前
基于深度学习的草莓健康度检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
图像处理·人工智能·深度学习·yolo·目标检测·机器学习·计算机视觉
Evand J8 小时前
【课题推荐】基于视觉(像素坐标)与 IMU 的目标/自身运动估计(Visual-Inertial Odometry, VIO),课题介绍与算法示例
人工智能·算法·计算机视觉
roman_日积跬步-终至千里11 小时前
【计算机视觉概述】:从像素到理解的完整图景
人工智能·计算机视觉
海边夕阳200611 小时前
【每天一个AI小知识】:什么是多模态学习?
人工智能·深度学习·机器学习·计算机视觉·语言模型·自然语言处理
有为少年11 小时前
带噪学习 | Ambient Diffusion (NeurIPS 2023)下篇
人工智能·深度学习·神经网络·学习·机器学习·计算机视觉
再__努力1点12 小时前
【78】HOG+SVM行人检测实践指南:从算法原理到python实现
开发语言·人工智能·python·算法·机器学习·支持向量机·计算机视觉
c#上位机12 小时前
halcon计算仿射变换矩阵的逆矩阵
计算机视觉·矩阵·c#
Das112 小时前
【计算机视觉】04_角点
人工智能·计算机视觉