ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

StarNet++实战:用神经网络轻松移除深空照片中的恒星

StarNet++实战:用神经网络轻松移除深空照片中的恒星 1. 先说清楚StarNet 到底是干什么的可能第一次听说 StarNet 的朋友会下意识以为这又是个什么高深框架或平台实际上它是我最近两年在深空摄影后期里用得最勤的一个神经网络工具全名一般叫StarNet。如果只看名字里的“Star”你可能猜不到它真正干的事情很纯粹把天文照片里的恒星从画面里“摘”出去生成一张只有星系、星云、暗尘埃等延展天体的无星版本。为什么这件事值得专门写一篇完整的技术笔记因为只要你拍过深空大概率都经历过这种痛M31 仙女座星系明明拍了几十张叠加处理完以后星系盘面细节还可以但图片上密密麻麻的星点一压亮度就糊一拉对比度就炸星点周围还容易拖出奇怪的光晕。这时候最常规的思路是用 Photoshop 或者传统方式慢慢修要么用星点蒙版一层层抠费时费力还经常搞出“塑料感”。而 StarNet 直接让神经网络去预测画面里恒星的位置和光强分布几秒钟就能把恒星和延展天体分离开。这篇笔记主要写给三类人一是玩深空摄影、被星点困扰了很久的后期党二是刚开始接触深度学习但想在图像分割这个方向找个实战案例的学生三是单纯好奇神经网络如何做像素级分离的吃瓜群众。我会从原理、参数、实操、踩坑四个部分掰开讲尽量让你看完之后不仅能跑通模型也能自己判断它的边界在哪。注意StarNet 名字在不同领域还有别的同名产品例如室内定位库、区块链项目本文只讨论天文图像处理场景下的 StarNet。2. StarNet 凭什么能把星星“摘”掉2.1 它做的不是抠图而是图像语义分离很多人第一次拿到 StarNet 的处理结果第一反应是“这不就是抠图嘛”。确实从效果上看它确实把星点从原图中分离出来输出一张纯背景图和一张纯星点图。但本质上它跟我们手工用套索、魔棒、色彩范围那些完全不是一回事。手工抠星点的核心逻辑是找边界——你告诉软件哪里是星点边缘然后软件沿着边缘生成选区。可深空图像里的恒星根本不存在清晰的边界。视宁度、大气色散、望远镜的衍射效应都会让星点变成一个弥散的光斑光斑和高光附近的星云信号混在一起边界模糊到没法用“边缘”去定义。StarNet 的做法是全局预测。它把整张图输入一个卷积神经网络网络输出的是每个像素属于“恒星辐射”的概率图然后根据这个概率图把原始图像拆成两个通道一颗星点干净到可以忽略的延展天体图以及一张只保留星点光强分布的点源图。换句话说它不是在找边而是在理解“哪些光子来自恒星”这个物理过程。2.2 为什么用神经网络而不是传统算法传统上天文学家分离恒星其实有一套成熟办法先用 PSF点扩散函数模型拟合每个星点的光强分布然后用拟合结果把星点减掉。这个方法在只有几十颗亮星的星场里非常好用但在深空照片里根本不现实。我拍一幅 M31两三百颗能肉眼分辨的星点还有大量暗到几乎淹没在背景噪声里的低信噪比恒星PSF 拟合法得逐颗设置初始参数稍微有点星点重叠或者背景梯度就有大面积残差算下来可能要忙一晚上。神经网络不一样它在海量合成图像上学习过“恒星在不同亮度、不同背景、不同噪声水平下长什么样”一进一出一张图全处理完速度是传统方法的上百倍。这里面有一个很关键的设计选择StarNet 选择在合成数据上训练而不是真实观测数据。真实照片的“正确答案”根本没法人工标注——你没法手工画出每个像素的光子到底是来自恒星还是星系。合成数据则是一边用点源模型生成无数个形态各异的星点叠加上已知的延展星云模拟图像和噪声模型。这样训练数据里的“分割真值”是完全精确的让模型学会了分离而不是死记硬背某一幅图。2.3 从输入到输出模型处理的核心细节从工程实现角度StarNet 的流程其实很直接。输入一张灰度 FITS也可以是 TIFF模型会对每个像素输出一个 0 到 1 之间的权重系数接近 1 表示该像素大概率属于恒星接近 0 表示大概率属于延展天体。然后通过一个叫“像素级乘法”的操作无星图 原图 × (1 − 星点权重) 星点图 原图 × 星点权重注意这个乘法的物理意义它不仅把星点中心的强信号删除还在星点周围建立起一圈平滑的过渡带。整张图任意像素的能量都不会凭空消失两张输出图加起来严格等于原始图像没有任何信息损失只是被打散到两个“图层”里了。这一点的价值在使用中会体现得很明显。因为你拿星点图可以随意做锐化、缩星、加颜色拿无星图可以放心大幅拉伸对比度而不必担心星点爆掉。处理完以后把两张图叠加回来输出的结果比原图干净得多。输入格式单通道 FITS、TIFF、PNG 都可以输出通道星点蒙版star mask和无星背景starless模型文件PyTorch 架构权重文件需要单独下载3. 实操三种最常见的 StarNet 使用方法3.1 方式一独立命令行调用StarNet 最早是以 Python 脚本形式发布的如果你习惯用终端处理图像这种方式最灵活。首先把仓库克隆到本地建一个虚拟环境安装依赖git clone https://github.com/starnet-maksymowych/starnet_plusplus.git cd starnet_plusplus python -m venv starnet_env source starnet_env/bin/activate pip install -r requirements.txt安装完成后命令行调用语法其实非常直观。以处理一张名叫m31_lum.fits的图像为例python starnet.py --input m31_lum.fits --output_dir ./output/ --model_path ./models/starnet_rgb.onnx跑完之后输出目录里会出现两个文件m31_lum_starless.fits和m31_lum_starmask.fits。这里有个值得注意的参数--model_path指向的模型文件有多个版本常见的是灰度starnet_bw和彩色starnet_rgb两种。灰度版本处理 L 通道快很多彩色版本适合直接处理单反或冷冻相机的彩色图像。3.2 方式二PixInsight 整合工作流如果你和我一样主力后期工具是 PixInsight完全不需要绕道命令行。比较省心的做法是直接安装社区打包好的 StarNet 脚本模块。装好之后在主界面 Process 菜单里就能看到 StarNet 项双击加载然后拖到目标图像上即可。PixInsight 里的流程通常是这样把线性图像正确裁剪后先复制一份对复制件做一次简单的 MaskedStretch 以增强星点可见度对拉伸后的图像运行 StarNet生成星点蒙版把蒙版拉回图像你会发现它自动作用于线性图像本身亮度、星点大小都跟你的预处理状态匹配这个过程看似只是点了几下鼠标但有个重要问题StarNet 对非线性图像的预测效果远好于线性图。因为线性图像里星点核心亮度和周边星云的对比差异太大神经网络难以准确判断。而经过 MaskedStretch 之后动态范围被压缩星点和延展天体的分布更接近模型在合成数据里见过的状态预测准确率会高很多。3.3 方式三Siril 里的轻量集成还有一部分同好用 Siril 做后期它从 1.2 版本起也能调用 StarNet。Siril 里的入口在菜单“图像处理—星点移除”下前提是你提前把 StarNet 的可执行文件路径填进配置里。我的经验是Siril 集成适合快速预览比如你只想看某个目标“去星之后长什么样”或者对比不同处理路线就用它直接出一张图。但如果你要做精细合成还是建议回到 PixInsight 或者命令行因为 Siril 这个模块暴露的参数很少中间产物不如前两者可控。4. 实战记录以 M31 为例的恒星移除全流程4.1 素材准备与预处理这里我拿一张积累约 8 小时曝光的 M31 窄带 L 通道来做示例。头一天拍摄完我已经用 WBPP 完成了校准、对齐和叠加最后得到一张线性 FITS。在真正运行 StarNet 之前我通常还会做两步必要准备裁剪掉因为对齐产生的黑边不然边缘的黑色区域会让神经网络产生误判用 DBE 做一次背景均匀化处理去掉轻微的天空梯度减小背景中的伪造纹理这两步看起来不起眼但直接影响后面星点蒙版的质量。如果背景里有明显的梯度或者暗角网络可能会把部分背景纹理误认为延展天体信号导致星点图里缺了该剔的东西无星图里反而留下一些怪异的亮斑。4.2 星点分离与蒙版检查对这张 M31 L 通道我用 PixInsight 内置 StarNet 流程先生成了一份经过 MaskedStretch 的预览图然后让模型算出星点蒙版。检查蒙版时我通常直接看三个地方亮星系核周围这里最容易翻车因为 M31 的星系核本身就是极亮区域神经网络可能把它当成超大星点之一给摘掉暗弱尘埃带附近这部分画面中既有弥散的暗尘埃又有零星暗星点是考验模型分离能力的高难度区域画面边缘边缘的畸变和噪声如果太强蒙版上会出现明显的不连续块实测下来 StarNet 的表现比 PSF 拟合法稳定得多。星系核没有被当成恒星摘走边缘虽然有几处蒙版小瑕疵但用 0.5 像素的轻微羽化就能抹平。4.3 无星版本处理与合成拿到干净的无星图之后真正的乐趣从这开始。无星图里的像素不包含星点能量你可以放心地把黑电平拉到很低也可以给结构做很强的反卷积或 HDR 变换不用担心亮星周围出现黑圈或者色差。我用无星版本做了这些处理对照星点蒙版做了几轮 LocalHistogramEqualization把 M31 尘埃带和外侧旋臂的纹理层次拉开对无星图整体加了一点 SCNR 绿色降噪因为去星之后原本被星点掩盖的绿色噪声显露出来了把原图的星点图缩到适当大小强化了亮星色彩再作为叠加层混合回去最后一步叠合时有个分水岭你是想保留“满天星点”的真实观感还是做“缩星”后的干净深空风格。我选择缩星后星点略小但色彩饱和再在中央高光区域加一点星芒效果最终成图比单处理原图时质感高了一个档次。5. 常见故障与避坑实录5.1 显存不足与高分辨率图卡顿StarNet 虽然是轻量级网络但它对输入分辨率非常敏感。我最初用一张 6240×4168 的全尺寸单反图直接跑结果 GPU 显存直接顶满报错。解决办法不是换显卡而是把图像缩放一般缩到 1000~1600 像素宽度效果和全尺寸差异肉眼几乎看不出来。还有一个很少有人提的点显存不够时不要急着降低画质可以先切分图像分块处理。网上有封装好的脚本支持把大图切成四块或者九块分别推理再拼接我用这个方法处理过亿级像素的马赛克拼图效果和整图推理基本一致。5.2 星点去除不干净或亮星出现伪影最常见的解释其实是“你的预处理这一步没有达标”。如果输入图像里有强烈的竖纹、坏行或者没有校准好的偏置神经网络会把这些伪装成恒星信号的特征导致蒙版上全是乱七八糟的白点。另外要注意一点StarNet 对红蓝两个通道的权重并不完全相同彩色图像里如果蓝通道有明显色差星点边缘容易留下蓝色残留。我的补救方案是先做一次星点对齐用 PSF 对星点中心做亚像素配准再跑 StarNet结果会干净很多。5.3 星点蒙版在交接上的微妙失误用 StarNet 生成蒙版后很多人习惯直接拿蒙版当图层透明度直接做处理这其实是个坑。因为蒙版是浮点权重图范围是 0 到 1而你在编辑软件里常常默认它是 8 位或 16 位整数。换算过程中如果不做归一化蒙版的暗部细节会整段丢失。我自己的做法是在 PixInsight 里始终以浮点格式保存蒙版跨软件处理时导出成 32 位 TIFF。如果实在要导出 16 位请记得在导出前给蒙版乘一个 65535 的缩放系数否则切回 16 位整型后原本小于 1/65535 的微弱权重全部变成 0星点周边羽化效果直接被磨平。6. 一些个人经验和后续可以尝试的方向跑了大半年 StarNet我最大的体会是它不是一个替代人工的“一键修图”工具而是一个重构后期工作流的“第七块拼图”。过去一套片子要处理两三天主要时间耗在星点的反复微调上而现在我把星点分离这一步交给网络之后更多精力用在延展天体的层次表现和色彩还原上。最后再分享几个我在实际操作中觉得特别值得记住的细节如果目标画面里有特别亮的木星、金星这类太阳系天体StarNet 很容易误判为“超亮恒星”生成蒙版时会把整个天体连同它的镜头光晕一起扣掉。遇到这种图建议先把行星区域手动遮盖一下再跑。我习惯保存两份中间结果一份是刚分离完的原始无星图一份是处理到一半的弱拉伸版本。这样如果某种后期策略效果不理想可以从任意一步重新开始而不必从头跑模型。后续想尝试的方向是彩色窄带图像的分离。当前 StarNet 在 RGB 合成后的窄带图上表现还可以但窄带原始信号直接分离时仍会出现Ha与RGB通道错位的问题。如果你也在这方面试过欢迎多交流踩坑心得。
返回列表