卷積神經網路在流星雨攝影中的應用
卷積神經網路在流星雨攝影中的應用
介紹
流星雨是一種常見的天文現象,北半球三大流星雨象限儀座流星雨(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。目前從直觀上看本文的流星檢測模型的效果不如「其他方法」一節中介紹的基於圖片差異的流星檢測方法,本工作給出了流星檢測的一種新思路。
快,關注這個公眾號,一起漲姿勢~
轉載請聯繫
TAG:PKUFineLab |