卷积神经网络在流星雨摄影中的应用

卷积神经网络在流星雨摄影中的应用

介绍

流星雨是一种常见的天文现象,北半球三大流星雨象限仪座流星雨(1月3日左右)、英仙座流星雨(8月13日左右)、双子座流星雨(12月13日左右)是天文爱好者们的年度盛宴,人们在感叹流星华丽的同时,也会用相机记录下流星转瞬即逝的美。通常我们看到的流星雨成片是这个样子:

图1 猎户座流星雨(图片来源 APOD)

还有这样的:

图2 双子座流星雨(图片来源:夜空中国 摄影师Steed)

众多的流星如离弦之箭一样,从流星雨的辐射点射出,看起来像是“下雨”一样,众多流星同时出现。那夜真的像图片中那样“星坠如雨”吗?但是真实情况并不是这样的,我们看到的“流星蔽天如织”的优秀摄影作品,都是经过后期叠加合成的。注意,这里的“后期合成”不是“胡编乱造”,而是根据流星的实际位置将多个流星合并到一张图片里。在流星雨摄影后期处理的第一步,便是从海量的图片中筛选出含有流星的图片。这一过程往往是很耗时的,因为在流星雨摄影中往往采用的连拍,拍数小时,一晚的拍摄会产生数以千计的图片,目前摄影师大多是人工的方式筛选流星。在2016年的双子座流星雨笔者以5秒/张的速度拍了5个小时,在浏览完3600张图片后,突然发现脖子“僵劲不能动”,长时间保持一个姿势对颈椎真是一个挑战,于是痛定思痛,本着“能让程序能干的事儿决不让人干”的原则,尝试用程序的方式筛选流星,于是便有了本文的工作。在介绍本工作之前,先浅谈流星雨摄影,以便读者理解“为什么拍摄流星雨会产生那么多照片?”并且对流星雨有初步的了解。

流星与流星摄影

流星是指运行在星际空间的流星体(通常包括宇宙尘粒和固体块等空间物质)在接近星球时由于受到星球引力的摄动而被星球吸引,从而进入星球大气层,并与大气摩擦燃烧所产生的光迹。流星体的速度通常在数十公里每秒,会在大气中迅速划过,并很快消失殆尽。

那如何记录下美丽的流星呢?在此之前应首先谈谈星空摄影(或者叫星野摄影)。星空摄影处在弱光环境下,摄影师通常使用相机中的长曝光进行拍摄,相机的长曝光可将数十秒(通常是10~120秒)内的所有光线做累加,因此最终的图片亮度大大提高,可以看到肉眼看不到的更多细节。如下图,曝光时间为60秒,银河内的细节非常明显,观看效果远超人眼。

图3 夏威夷的星空(摄影师王卓骁,参数f/2.8,20mm,星空60s跟踪曝光,地景30s并稍有提亮)

流星摄影与星空摄影稍有不同,其不同点有两个:

1. 拍摄参数略微不同。由于流星出现时间短,要想让流星看起来更亮,需要修改两个参数:ISO(感光度),在星空摄影中为了控制相机的热噪声通常不会选取过高的ISO(如12800),但是在流星摄影中,流星出现的时间短,星空摄影的参数可能会使得大部分流星在照片上显得非常暗淡,因此流星摄影会选取高ISO,同时为了防止过度曝光需选取较短曝光时间(如5秒)。

2. 连拍数小时。其原因是流星的不可预知性导致的,虽然我们可以从流星的母体(如彗星、小行星)的运行规律预测流星雨的时间,但目前的技术仍不能预测单个流星的出现时间和位置。因此只能用连拍技术,持续对着某块天空拍摄,如果有流星出现便可以记录下流星的痕迹。

上述两点共同导致的后果是:一晚上的拍摄会产生大量图片,

若使用多台相机拍摄,一晚产生的图片的数量达到一万以上也是有可能的。因此,需要一种流星图片检测方法,自动地将含有流星的图片与其他图片区分开,提升摄影师在筛选流星图片的效率,关爱颈椎。

基于卷积神经网络的流星检测模型

基本思路

流星检测问题本质上是一个二分类问题,正类为含有流星,负类为不含有流星。一个现实的问题是,流星摄影中用到的相机多为高分辨率的单反相机,以笔者使用的佳能6D为例,分辨率为5472×3648,直接将其作为深度神经网络的输入,模型的参数可能会大到令人恐惧。故一种可行的方法是使用滑动窗口遍历图片,若有一个窗口检测到流星,则认为该图片中含有流星。

数据集构造

构建深度神经网络首先需要解决数据问题,笔者从曾经拍摄的流星图片中以及网上公开的流星摄影作品中,手动截取了40张流星的图片,图4展示了部分训练用的流星图片,直观上看流星的结构还是很简单的,基本上就是一条明显亮于背景的直线,流星的颜色也有多重颜色,常见的有绿色、白色、红色等,具体的发光原理与流星体的材料及其运行速度有关。

图4 流星图片样例

40张图片对于训练深度神经网络来说实在是太少了,需要再“造”一点数据,本工作采用的数据生成方法分为:缩放、平移、旋转,可根据40张样例生成数千张流星图片。对于负类,可使用笔者曾经拍摄的大量星空图片,每张图片切分成若干小图后作为训练集中的负类。

数据预处理

数据预处理的目的是让识别的目标更容易被识别,本工作中用到的图片预处理分为3步:

1. 将彩色图片转为灰度图片。流星的形态特征比颜色特征更为明显,为了简化输入,可将RGB图片转为灰度图片(黑白)。

2. 加强图片对比度。加强图片对比度,可以使图片亮的部分更亮,暗的部分更暗,可以使流星相对于背景图更加突出。

3.加强图片的锐度。增加锐度的目的是使图片中的星点、流星的边界更清晰,更容易被识别。增加锐度可在后续的图片缩放中尽可能保留流星的特征。

4.将图片缩放到200*200。本工作中的深度神经网络模型的输入图片大小为200像素*200像素,这一大小是在权衡模型复杂度、训练准确率、训练速度之间权衡后决定的。

5.图像滤波。图像滤波中的微分算子可以用来检测边缘和特征提取,考虑到流星识别主要依靠其的形态特征,而形态特征可以通过边缘检测使其突出,因此在数据预处理阶段,使用sobel算子检测图片中的边缘信息。

图5 数据预处理流程

模型结构

图6 用于流星检测的深度神经网络模型

本工作基于keras构建深度神经网络,后端为TensorFlow。模型主要采用了两个卷积神层,卷积核为5*5,两个全连接层,神经元个数分别为128和2。在构建模型时考虑到流星痕迹形状简单,仅为一条直线,因此构建了一个较为简单的深度神经网络模型。

结果

用上文“数据集构造”中给出的方法生成了2192个图片,其中正类(含有流星)1440张,负类(不含有流星)752张,经过随机shuffle后,选取了80%作为训练集,20%作为验证集。训练时在第10轮的时候loss已经降到0.0132,准确率达到0.9967。在验证集上的测试结果显示,对于正类(含有流星图片)的分类精确率为0.91,召回率0.93,f1-score为0.92,对于负类(不含有流星是图片),分类精确率为0.97,召回率0.95,f1-score为0.96。

有了流星检测模型,我们可以用滑动窗的方法遍历一张图片,检测一张高分辨率的图片中是否存在流星,顺便可以将流星圈出来(图7)。其实,从图7中可以看出,识别效果并没有想象中的那么好,而且6号框中明显是不存在流星的,这里存在误报,误判的原因很有可能是将汽车引擎盖上的光线识别作流星,另外也存在不少漏报的情况,如1旁边的水平方向的小流星,模型仍有很大的调优空间。

未来工作

目前笔者仍然在用自己的PC在训练、调试模型,未来可以使用GPU服务器,并且使用更大的数据集,使识别更准确,目前一千条训练数据对于深度神经网络来说还是比较少的。

另外还有个问题,可能一些摄影同好已经发现了,本文中的流星检测模型并没有针对飞机痕迹、人造卫星痕迹做区分,而在这三者的在图片中的形态、痕迹是十分类似的,甚至有些初学者很难将其分开。实际上三者之间有略微差异,未来可以训练多分类模型,将3者分开,提升流星检测的准确率。

PS:

发稿日(2018年4月24日)正值天琴座流星雨高峰期前后,说不定今晚你仰望星空的时候就能看到一颗流星!祝晴天!

图7流星检测模型的结构

其他方法

除了使用深度神经网络,传统的图片处理方法也可以用来做流星检测。“天文摄影圈中最会编程”的章佳杰大神将自己的工作分享在知乎上,详情可见《三维流星雨背后的故事》,他的方法的基本思路是 “将两张照片按照星空进行对齐,然后用后一张照片减去前一张照片。如果照片中没有流星,那么前后相减的结果是接近 0 的,因为静止的星空对齐之后是几乎一样的;而如果照片中有流星,那就可以看到相减的结果中有一条明显的直线。利用 Hough 变换就可以轻易地把直线找出来了”,效果拔群。该方法的前提条件是待检测的图片之间差异不大,至少有两张连续拍摄的图片,也就是说在拍摄时机位固定。

总结

为了在于减少摄影师在流星雨摄影后的流星图片筛选工作,本文提出了一种基于卷积神经网络的流星检测模型,在笔者构造的数据集上,流星的识别率精确率达到了0.91,召回率达到了0.93。目前从直观上看本文的流星检测模型的效果不如“其他方法”一节中介绍的基于图片差异的流星检测方法,本工作给出了流星检测的一种新思路。

快,关注这个公众号,一起涨姿势~

转载请联系

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180424G0VFWL00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券