做者|Lamothe Thibaud
編譯|Flin
來源|towardsdatasciencepython
使用曲率積分和動態時間規整,讓咱們深刻研究抹香鯨識別!算法
最近,咱們嘗試了Capgemini的全球數據科學挑戰賽。我與Acores鯨魚研究中心合做,挑戰的目的是肯定抹香鯨,用人工智能幫助拯救抹香鯨的生命。網絡
爲了完成這項任務,咱們收集了幾千張過去幾年的鯨魚照片。在訓練數據集中,平均每頭鯨魚有1.77張照片,不少動物只出現過一次。所以,主要思想是,給定一個新的圖片,在已有數據中找出最接近它的。架構
所以,若是鯨魚已經被拍下來,研究人員就能夠知道是什麼時候何地拍的了。機器學習
我很自豪地宣佈,咱們以第三名的成績結束了比賽,咱們使用暹羅網絡取得了勝利。可是,因爲已經有不少關於這個奇妙架構的文章,今天我將介紹一個更有趣、更新穎的方法來解決這個問題。ide
由Weideman等人設計,在他們的論文「用於識別海豚和鯨魚的曲率積分表示和匹配算法」中,這是我今天要介紹的方法的關鍵步驟以下:函數
基於顏色分析和輪廓檢測的尾部提取學習
曲率積分尾部處理(IC)測試
與動態時間規整(DTW)的尾部比較人工智能
免責聲明N°1:預測率不如暹羅網絡好,咱們不得不探索其餘解決方案。可是這個想法很是有趣,值得分享和了解。
免責聲明N°2:在許多數據科學項目中,數據準備是最困難的部分。實際上,要將尾部處理爲信號,信號的質量必須很是好。在本文中,咱們將花一些時間來理解信號處理以前的全部必要步驟。
如引言中所述,咱們獲得了數千張圖片。乍一看,鯨魚就是鯨魚。全部這些圖片看上去都像是一個藍色背景(天空和大海),中間有一個灰色斑點(尾巴)。
通過初步探索以後,咱們開始在兩條不一樣的抹香鯨之間進行區別,這主要歸功於尾巴的形狀,咱們確信這對咱們的算法相當重要。那顏色呢?像素分佈中是否有什麼有趣的信息?
每一個圖片中顏色數量之間的相關性(綠色與紅色–藍色與紅色–綠色與藍色)
使用Bokeh可視化庫(https://bokeh.org/) ,咱們很快發現圖像中的顏色高度相關。所以,咱們專一於輪廓,嘗試經過顏色變化來檢測它們。
檢測尾巴輪廓的第一步是從天空和水中提取尾巴。實際上,這是該過程當中最困難的部分。
首先,咱們使用輪廓檢測算法。可是因爲從一個鏡頭到另外一個鏡頭的陽光不斷變化,所以對比度發生了很大變化,結果總不能使人滿意。
順便說一句,看到圖片算法失敗最多的地方仍是頗有趣的,由於在大多數狀況下,尾巴和大海之間的區別對於人類來講是顯而易見的。
話雖如此,讓咱們深刻研究顏色分析和輪廓提取自動化。
讓咱們爲每一個通道強度(紅色,綠色,藍色)繪製灰度圖片
觀察單個圖片的三個通道
正如你在上面看到的,對於大多數圖片來講都是這樣,圖片中間的顏色較少,能夠按像素強度進行過濾。因爲尾巴一般是灰色的,所以它們的每種顏色的數量幾乎相同(R = G = B),可是,海和天空每每是藍色的,這使該顏色成爲過濾的理想選擇。
讓咱們看看當只保留藍色值,而且只保留藍色值<選定的閾值(blue_value < SELECTED_THRESHOLD)的像素時會發生什麼。
選定的閾值SELECTED_THRESHOLD的最大值爲255,由於它是像素強度的最大值。
經過這一系列圖片,咱們能夠相信,提取尾巴很容易。可是我該如何選擇過濾閾值?
如下是使用10到170(十乘十)的全部值做爲單個圖片的閾值的結果示例。
根據藍色像素的強度,在一張圖片上應用17種不一樣的濾波器:
如下是一些有趣的內容:
閾值很小(大約10),大海消失了,但尾巴也消失了
閾值很小(大約20),尾巴的一部分消失了
閾值不過高(大約40),提取的挺好,全部的尾巴都沒有閾值那麼藍,可是全部的大海都比閾值藍。
在中間閾值(大約80)的狀況下,尾巴保持完整,但咱們開始只能保留部分海洋
在接近中間值的閾值(約110)的狀況下,很難區分海和尾巴
在較高的閾值(>=140)下,尾巴徹底消失。這意味着即便大海也不夠藍,沒法經過過濾器選擇。
這樣就到了,並且彷佛很明顯應該採用SELECTED_THRESHOLD = 40並應用filter blue_value < 40。
能夠猜到,這並不容易。給定該圖片的光強度,該圖片的正確值爲40。可是這也是陳詞濫調了。經過將全部這些閾值繪製在隨機圖片上的結果,該閾值發生在10到130之間變化。那麼如何選擇合適的值呢?
經過查看前面的圖片,咱們想到了一些東西:正確閾值的正確圖片是外部具備最大空白區域而內部具備最大區域的圖像。並但願一些在ImageNet上訓練的神經網絡能夠將鯨魚定位在圖片中。咱們決定使用基於ImageNet類的MobileNet。
與原始圖片相比,一批提取的尾巴帶有邊框
這真是個好主意。以下所示,咱們能夠很是準確地肯定圖片中尾巴的位置。而後,咱們幾乎能夠在全部圖片中將「尾部-內部」與「海部-外部」分開。
爲了更好地瞭解這種分離,對於訓練集的每張圖片,咱們將邊界框內每一個像素的藍色值相加,並對框外的像素進行相同的處理。
而後,咱們在下圖上繪製每一個圖片,內部結果體如今X軸上,外部結果體如今Y軸上。藍線表明X = Y。咱們能夠今後圖形中得到的含義以下:你離線條越遠,尾巴和海洋之間的分隔就越容易。
在邊界框內外的藍色像素強度下比較抹香鯨圖片
咱們嘗試根據與線的距離應用過濾器閾值,但這沒有產生任何結果。通過幾回嘗試,咱們僅根據圖片的顏色分佈作不出什麼,所以決定採用強硬的方法。除了查看圖片並肯定閾值外,咱們還爲每張圖片應用15個濾波器,對其進行分析,而後自動選擇最佳濾波器以進行進一步處理。
而後對於給定的圖片,咱們將15個濾波器應用了15個不一樣的值做爲閾值。對於每一個濾波器,咱們計算邊界框內的像素和外面的像素的數量(過濾後,像素值爲0或1,無需再對強度求和)。而後,咱們對結果進行歸一化,使數字獨立於圖像的大小,並將結果繪製在一個圖形上。
單個圖片和不一樣過濾閾值的邊界框內(X軸)和外框(Y軸)的像素數量。
對於每張圖片,咱們獲得的曲線都相似於上面的曲線,這是咱們隨着閾值的演變而對前面的陳述進行的數學轉換。
當閾值很小時,尾巴和大海消失了。尾部內部或外部均無像素
當閾值增長時,出現尾巴,而且X軸的值升高。
直到閾值開始出如今海洋的某些部分,而且外部價值開始增加。
使用線性迴歸或導數,如今很容易檢測到正確的閾值:它是圖的兩條線的交點處的閾值。
注意:橙色線是 y = y_of_the_selected_threshold
最後,爲了在提取時獲得最好的圖片,當咱們計算出最佳閾值(10,20,30,40,…,120,130,140,150)時,假設是80。咱們對-5/+5值應用了過濾器。因此咱們有三張照片:藍色< 75,藍色< 80,藍色< 85。而後咱們將這些網格圖片中的三個(0和1)求和,而且只保留結果像素的值等於2。這將做爲最後的過濾器,去除尾部的噪音。這樣的提取效果很好,咱們決定適用於全部的圖片。
做爲總結,如下是咱們到目前爲止所作的假設:
咱們可使用濾波器對藍色像素的強度把尾巴和海洋區分開
在過濾以前,須要爲每一個圖片找到一個閾值
使用邊界框是找到此閾值的有效的方法
通過幾個小時的工做,咱們最終獲得了一個很是好的尾巴提取器,能夠很好地處理具備不一樣亮度,天氣,海洋顏色,尾巴顏色的尾巴,而且可以瀏覽最難的圖片。
一批提取出來的尾巴與原始圖片進行比較
如今尾部位於圖片中,咱們進行輪廓檢測。確實,要處理時間序列中的尾巴,咱們須要發出信號。
在這一步,咱們可使用OpenCV的輪廓檢測算法,可是經過如下兩個步驟,看起來會更快一些:
使用熵變僅保留提取的尾巴的輪廓
應用熵濾波器後檢測到的提取的尾巴輪廓
此步驟很是簡單,沒有什麼複雜性。
經過從海中提取尾巴並獲取圖片的上部像素,咱們獲得了尾巴的後沿做爲信號。如今咱們有了這個,咱們就要處理規範化問題。實際上,全部圖片的大小或像素數量都不相同。此外,到抹香鯨的距離並不老是相同的,拍攝時的方位可能會發生變化。
尾巴方向的示例,同一條鯨的兩張照片之間可能會有所不一樣
爲了進行標準化,咱們必須沿着兩個軸進行。首先,咱們決定使用每條尾巴300個點進行信號比較。而後咱們對最短的插值進行插值,並對最長的進行採樣。其次,咱們將0到1之間的全部值歸一化。這致使信號疊加,以下圖所示。
標度信號疊加
爲了解決定向問題,咱們使用了曲率積分度量,該度量經過局部評估將信號轉換爲另外一個信號。
如原始論文中所述:「它捕獲沿後緣的每一個點的局部形狀信息。對於位於後緣上的給定點,咱們在該點處放置一個半徑爲r的圓,而後找到後緣上位於該圓內的全部點。」
而後,在每一步中,咱們將信號的邊緣沿圓形拉直,以使其內接爲正方形。
最後,咱們定義曲率以下:
曲率是曲線下到正方形總面積的面積,這意味着直線的曲率值爲c = 0.5
所以,咱們得到了標準化信號,與鯨魚和攝影者之間的距離無關,與鯨魚和攝影者之間的角度無關,而且與鯨魚和海洋之間的傾角無關。
而後,對於每張訓練測試圖片,咱們在IC相移期間建立了半徑分別爲五、10和15像素的那些信號。咱們將它們存儲起來,並用於最後一步:時間序列之間的比較。
在本文中,我將介紹這種算法的實現。一旦工做,咱們就能夠將其應用到尾緣,並從環境細節中提取信號。對於一條尾巴,信號看起來像這樣:
曲率積分應用於帶有3個不一樣半徑值的抹香鯨尾緣
如今,讓咱們進行信號比較!
動態時間規整(DTW,https://en.wikipedia.org/wiki/Dynamic_time_warping) 是一種可以在兩個時間序列之間找到最佳對齊方式的算法。它一般用於肯定時間序列的類似性,分類以及查找兩個時間序列之間的對應區域。
與歐幾里得距離(指的是兩條曲線之間的距離,逐點)相反,DTW距離容許連接曲線的不一樣部分。該算法的工做原理以下:
使用2條曲線,咱們建立了兩個系列之間的距離矩陣,從左下角到右上角,計算兩點之間的距離Ai和Bi,以下計算兩個點之間的距離:D(Ai, Bi) = |Ai — Bi] + min(D[i-1, j-1], D[i-1, j], D[i, j-1])。
當距離矩陣知足時,咱們計算從右上角到左下角的權重較小的路徑。爲此,咱們在每一步中選擇具備最小值的平方。
最後,所選的路徑(下圖中的綠色)指示來自序列A的哪一個數據點對應於序列B中的數據點。
這樣的基本計算的實現很是容易。例如,這是一個根據兩個序列s和建立距離矩陣的函數t。
def dtw(s, t): """ Computes the distance matrix between two time series args: s and t are two numpy arrays of size (n, 1) and (m, 1) """ # Instanciate distance matrix n, m = len(s), len(t) dtw_matrix = np.zeros((n+1, m+1)) for i in range(n+1): for j in range(m+1): dtw_matrix[i, j] = np.inf dtw_matrix[0, 0] = 0 # Compute distance matrix for i in range(1, n+1): for j in range(1, m+1): cost = abs(s[i-1] - t[j-1]) last_min = np.min([ dtw_matrix[i-1, j], dtw_matrix[i, j-1], dtw_matrix[i-1, j-1] ]) dtw_matrix[i, j] = cost + last_min return dtw_matrix
話雖如此,讓咱們回到咱們的抹香鯨!數據集的每一個尾巴都轉換爲「積分曲線信號」,咱們計算了全部尾巴之間的距離,以發現最接近的那些。
以後,當接收到一張新圖片時,咱們必須使其經過整個準備流程:使用藍色濾波器的尾部提取,使用熵方法進行輪廓檢測以及使用IC進行輪廓轉換。它給了咱們一個300x1形狀的張量,最後咱們要計算整個數據集的距離。順便說一句,這很費時。
判決:結果可觀!當咱們有兩張相同的鯨魚照片時,在大多數狀況下,兩張照片是最接近的40張,這在2000年中是最好的。可是,如引言中所述,使用暹羅網絡的結果要好於這張照片(圖片一般在最近的5張中) ),鑑於比賽的時間,咱們不得不在調查中選擇其餘的方法。
咱們嘗試使用半尾巴,假設如下任一狀況:
尾巴是對稱的,這將簡化計算。
尾巴是不對稱的,所以能夠經過半尾巴進行比較。
儘管進行了大量測試,但這並無給咱們很是肯定的結果。咱們認爲咱們的分離不夠可靠:咱們將須要更多時間來研究信號處理帶來的更好分離。
在發送了一些比咱們想象的要難的時間的尾部提取後,因爲圖片的顏色(基本上是藍色——海洋和天空)以及數據集中圖片的各類亮度,咱們對尾巴識別應用了兩種連續的處理方法。
首先,曲率積分是一種經過查看曲線的局部變化對信號進行歸一化的方法。而後,咱們使用了動態時間規整,這是兩條曲線之間的距離計算,即便移動了兩條曲線也可能會發現兩條曲線之間的類似性。
不幸的是,結果並不如我所願,咱們沒法繼續使用該解決方案。經過更多的時間和更多的努力,我深信咱們能夠改進管道的每一個步驟,從而得到更好的模型。我也很是喜歡和本文提到的這些概念一塊兒工做。
經過全部步驟,實現它們的不一樣方法以及參數,監視全部轉換很是具備挑戰性。正如咱們有路線圖同樣,每一步都有其自身的困難,每一次小小的成功都是勝利,它開啓了下一步。很是可喜。
我發現這種方法很是有趣,而且與一般的預訓練的CNN徹底不一樣。但願你也喜歡本文主題的這種方法的優勢。若有任何疑問,請隨時與我聯繫😃
咱們從這篇論文中獲得了IC + DTW的想法:
動態時間規整1–0–1(中等)
DTW python實現
Kaggle座頭鯨鑑定比賽
關於這次活動的Capgemini 網頁(面向公司外人員)
原文連接:https://towardsdatascience.com/whale-identification-by-processing-tails-as-time-series-6d8c928d4343
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方文檔:
http://sklearn123.com/
歡迎關注磐創博客資源彙總站:
http://docs.panchuang.net/