<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          使用Python+OpenCV探索鯨魚識別

          共 2330字,需瀏覽 5分鐘

           ·

          2022-01-01 09:03

          點擊下方卡片,關(guān)注“新機器視覺”公眾號

          視覺/圖像重磅干貨,第一時間送達

          本文轉(zhuǎn)載自小白學視覺,文章僅用于學術(shù)分享。

          使用曲率積分和動態(tài)時間規(guī)整,讓我們深入研究抹香鯨識別!

          前言

          最近,我們參加了Capgemini的全球數(shù)據(jù)科學挑戰(zhàn)賽。我與Acores鯨魚研究中心合作,挑戰(zhàn)抹香鯨的識別任務,用人工智能幫助拯救抹香鯨的生命。

          為了完成這項任務,我們收集了過去幾年幾千張的鯨魚照片。在訓練數(shù)據(jù)集中,平均每頭鯨魚有1.77張照片,很多動物只出現(xiàn)過一次,因此,我們的目標是,給定一個新的圖片,在已有數(shù)據(jù)中找出最相似的。

          因此,如果鯨魚已經(jīng)被拍下來,研究人員就可以知道是何時何地拍的了。

          我很自豪地宣布,我們以第三名的成績結(jié)束了比賽,我們使用暹羅網(wǎng)絡取得了勝利,但是,由于已經(jīng)有很多關(guān)于這個架構(gòu)的文章,所以今天將介紹另一個更有趣、更新穎的方法來解決這個問題。

          方法

          本文介紹的方法由Weideman等人提出,算法的主要步驟如下:

          • 基于顏色分析和輪廓檢測的尾部提取

          • 曲率積分進行尾部處理(IC)

          • 與動態(tài)時間規(guī)整(DTW)進行尾部比較

          所以該方法的預測率不如暹羅網(wǎng)絡好,但是這個想法非常有趣,值得分享和了解。在許多數(shù)據(jù)科學項目中,數(shù)據(jù)準備是最困難的部分,要將鯨魚尾部處理為信號,信號的質(zhì)量必須非常好。在本文中,我們將花一些時間來理解信號處理之前的所有必要步驟。

          探索我們的數(shù)據(jù)集,分析圖片

          如引言中所述,我們得到了數(shù)千張圖片。乍一看,鯨魚就是鯨魚,所有這些圖片看上去都像是一個藍色背景(天空和大海),中間有一個灰色斑點(尾巴)。

          經(jīng)過初步探索之后,我們發(fā)現(xiàn)尾巴的形狀可以作為區(qū)分鯨魚的重要特征,我們確信這對我們的算法至關(guān)重要。那顏色呢?像素分布中是否有什么有用的信息?

          使用Bokeh可視化庫(https://bokeh.org/)來分析每個圖片中顏色數(shù)量之間的相關(guān)性(綠色與紅色–藍色與紅色–綠色與藍色) ,我們很快發(fā)現(xiàn)圖像中的顏色高度相關(guān)。因此,我們專注于輪廓,然后嘗試通過顏色變化來識別鯨魚。

          基于彩色濾波器的尾巴提取

          檢測尾巴輪廓的第一步是在圖片里從天空和海水中提取尾巴,這也是尾部提取中最困難的部分。

          首先,我們使用輪廓檢測算法,但是由于從一個鏡頭到另一個鏡頭的陽光不斷變化,因此對比度發(fā)生了很大變化,輪廓檢測算法得到結(jié)果總不能令人滿意。

          使用顏色提取尾巴

          我們?yōu)槊總€通道強度(紅色,綠色,藍色)繪制灰度圖片

          觀察單個圖片的三個通道

          正如你在上面看到的,對于大多數(shù)圖片來說,圖片中間的顏色較少,可以按像素強度進行過濾。由于尾巴通常是灰色的,因此它們的每種顏色的數(shù)量幾乎相同(R = G = B),但是,海和天空往往是藍色的,這使該顏色成為過濾的理想選擇。

          讓我們看看當只保留藍色值,并且只保留藍色值<選定的閾值(blue_value < SELECTED_THRESHOLD)的像素時會發(fā)生什么。

          選定的閾值SELECTED_THRESHOLD的最大值為255,因為它是像素強度的最大值。

          通過這一系列圖片,我們可以確信通過此方法可以很容易提取圖片中的尾巴區(qū)域。但是我們該如何選擇過濾閾值?

          以下是使用10到170(十乘十)的所有值作為單個圖片的閾值的結(jié)果示例。

          根據(jù)藍色像素的強度,在一張圖片上應用17種不同的濾波器:

          以下是一些有趣的內(nèi)容:

          • 閾值很小(大約10),大海消失了,但尾巴也消失了

          • 閾值很?。ù蠹s20),尾巴的一部分消失了

          • 閾值不太高(大約40),提取的挺好,所有的尾巴都沒有閾值那么藍,但是所有的大海都比閾值藍。

          • 在中間閾值(大約80)的情況下,尾巴保持完整,但我們只能保留部分海洋

          • 在接近中間值的閾值(約110)的情況下,很難區(qū)分海和尾巴

          • 在較高的閾值(>=140)下,尾巴完全消失,這意味著即使大海也不夠藍,無法通過過濾器選擇。

          很明顯應該采用SELECTED_THRESHOLD = 40并應用filter blue_value < 40。

          但是并不是每一張圖片的光照強度都是一樣的,通過將所有這些閾值繪制在隨機圖片上的結(jié)果,該閾值在10到130之間變化。那么如何選擇合適的值呢?

          使用邊界框選擇閾值

          通過查看前面的圖片,我們想到了一些東西:正確閾值的正確圖片是外部具有最大空白區(qū)域而內(nèi)部具有最大區(qū)域的圖像,我們希望一些在ImageNet上訓練的神經(jīng)網(wǎng)絡可以對圖片中的鯨魚進行定位,我們決定使用基于ImageNet預訓練的MobileNet。

          與原始圖片相比,一批提取的尾巴帶有邊框

          如下所示,我們可以非常準確地確定圖片中尾巴的位置,然后,我們可以在所有圖片中將“尾部-內(nèi)部”與“海部-外部”分開。

          為了更好地了解這種分離,對于訓練集的每張圖片,我們將邊界框內(nèi)每個像素的藍色值相加,并對框外的像素進行相同的處理。

          然后,我們在下圖上繪制每個圖片,內(nèi)部結(jié)果體現(xiàn)在X軸上,外部結(jié)果體現(xiàn)在Y軸上,藍線代表X = Y。我們可以從此圖形中獲得的含義如下:你離線條越遠,尾巴和海洋之間的分隔就越容易。

          我們嘗試根據(jù)與線的距離應用過濾器閾值,但這沒有產(chǎn)生任何結(jié)果,經(jīng)過幾次嘗試,我們知道僅根據(jù)圖片的顏色分布還得不到結(jié)果,因此我們決定采用強硬的方法,即除了查看圖片并確定閾值外,我們還為每張圖片應用15個濾波器,對其進行分析,然后自動選擇最佳濾波器以進行進一步處理。

          然后對于給定的圖片,我們將15個濾波器應用了15個不同的值作為閾值,對于每個濾波器,我們計算邊界框內(nèi)的像素和外面的像素的數(shù)量(過濾后,像素值為0或1,無需再對強度求和),然后,對結(jié)果進行歸一化,使數(shù)字獨立于圖像的大小,并將結(jié)果繪制在一個圖形上。

          單個圖片和不同過濾閾值的邊界框內(nèi)(X軸)和外框(Y軸)的像素數(shù)量。

          對于每張圖片,我們得到的曲線都類似于上面的曲線,這是我們隨著閾值的演變而對前面的陳述進行的數(shù)學轉(zhuǎn)換。

          • 當閾值很小時,尾巴和大海消失了,尾部內(nèi)部或外部均無像素

          • 當閾值增加時,出現(xiàn)尾巴,并且X軸的值升高。

          • 直到閾值開始出現(xiàn)在海洋的某些部分,并且外部關(guān)注度開始增長。

          使用線性回歸或?qū)?shù),很容易計算出正確的閾值:它是圖的兩條線的交點處的閾值。

          注意:橙色線是?y = y_of_the_selected_threshold

          尾巴提取的最后的提示

          最后,為了在提取時得到最好的圖片,當我們計算出最佳閾值(10,20,30,40,…,120,130,140,150)時,假設是80。我們對-5/+5值應用了過濾器,所以我們有三張照片:藍色<75,藍色<80,藍色<85,然后我們將這些網(wǎng)格圖片中的三個(0和1)求和,并且只保留結(jié)果像素值等于2的像素,這將作為最后的過濾器,去除尾部的噪音。

          結(jié)果
          • 我們可以使用濾波器根據(jù)藍色像素的強度把尾巴和海洋區(qū)分開來

          • 在過濾之前,需要為每個圖片找到一個閾值

          • 使用邊界框是找到此閾值的有效方法

          經(jīng)過幾個小時的工作,我們最終得到了一個非常好的尾巴提取器,可以很好地處理具有不同亮度、天氣、海洋顏色、尾巴顏色的尾巴。

          一批提取出來的尾巴與原始圖片進行的比較


          輪廓檢測

          現(xiàn)在已經(jīng)可以定位尾部在圖片中的位置,我們可以進行輪廓檢測了。

          在這一步,我們可以使用OpenCV的輪廓檢測算法,但是通過以下兩個步驟會更快一些:

          步驟1:使用熵去除尾巴周圍的噪聲

          使用熵變僅保留提取的尾巴輪廓

          步驟2:保持每列圖片的高光像素

          應用熵濾波器后檢測到的尾巴輪廓

          此步驟非常簡單,沒有什么復雜性。

          曲率積分

          通過從海中提取尾巴并獲取圖片的上部像素,我們可以把尾巴的后沿作為數(shù)學信號?,F(xiàn)在我們就要處理規(guī)范化問題了,因為所有圖片的大小或像素數(shù)量都不相同,同時到抹香鯨的距離并不總是相同,拍攝時的方位也可能會發(fā)生變化。

          尾巴方向的示例,同一條鯨的兩張照片之間可能會有所不同

          為了進行標準化,我們必須沿著兩個軸進行。首先,我們使用每條尾巴300個點進行信號比較;然后我們對最短的插值進行插值,并對最長的進行采樣;其次,我們將0到1之間的所有值歸一化,這導致信號疊加,如下圖所示。

          標度信號疊加

          為了解決定向問題,我們使用了曲率積分度量,該度量通過局部評估將信號轉(zhuǎn)換為另一個信號。然后,在每一步中,我們將信號的邊緣沿圓形拉直,以使其內(nèi)接為正方形。

          曲率積分原理

          最后,我們定義曲率如下:

          曲率是曲線下到正方形總面積的面積,這意味著直線的曲率值為c = 0.5

          因此,我們獲得了標準化信號,與鯨魚和攝影者之間的距離無關(guān)、與鯨魚和攝影者之間的角度無關(guān)、并且與鯨魚和海洋之間的傾角無關(guān)。

          然后,對于每張訓練測試圖片,我們在IC相移期間創(chuàng)建了半徑分別為5、10和15像素的信號并將它們存儲起來,用于最后一步:時間序列之間的比較。

          對于一條尾巴,信號如下所示:

          曲率積分應用于帶有3個不同半徑值的抹香鯨尾緣

          現(xiàn)在,讓我們進行信號比較!

          動態(tài)時間調(diào)整

          動態(tài)時間規(guī)整(DTW,https://en.wikipedia.org/wiki/Dynamic_time_warping) 是一種能夠在兩個時間序列之間找到最佳對齊方式的算法,它通常用于確定時間序列的相似性,分類以及查找兩個時間序列之間的對應區(qū)域。

          與歐幾里得距離(指的是兩條曲線之間的距離,逐點)相反,DTW距離允許鏈接曲線的不同部分。該算法的工作原理如下:

          使用兩條曲線,并創(chuàng)建了兩個曲線之間的距離矩陣,從左下角到右上角,計算兩點之間的距離Ai和Bi,計算兩個點之間的距離:D(Ai, Bi) = |Ai — Bi] + min(D[i-1, j-1], D[i-1, j], D[i, j-1])。

          然后我們計算從右上角到左下角的權(quán)重較小的路徑,為此,我們在每一步中選擇具有最小值的平方。

          最后,所選的路徑(下圖中的綠色)指示在序列A的數(shù)據(jù)點到序列B中的對應數(shù)據(jù)點。

          這些基本計算的實現(xiàn)非常容易。例如,這是一個根據(jù)兩個序列s和創(chuàng)建距離矩陣的函數(shù)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


          現(xiàn)在讓我們回到我們的抹香鯨!數(shù)據(jù)集的每個尾巴都轉(zhuǎn)換為“積分曲線信號”,我們計算了所有尾巴之間的距離,以發(fā)現(xiàn)最接近的那些尾巴。

          然后,當接收到一張新圖片時,我們必須使其通過整個準備流程:使用藍色濾波器的尾部提取,使用熵方法進行輪廓檢測以及使用IC進行輪廓轉(zhuǎn)換,最后會得到一個300x1形狀的張量,最后我們要計算它到整個數(shù)據(jù)集中所以樣本的相似度,當然這個過程這很費時。

          結(jié)果顯示,當我們有兩張相同的鯨魚照片時,在大多數(shù)情況下,兩張照片是最接近的40張,這在2000年中是最好的。但是,如引言中所述,使用暹羅網(wǎng)絡的結(jié)果要好于該算法,鑒于比賽的時間,我們不得不研究選擇其他的方法。

          使用一半的尾巴和一半的

          我們嘗試使用半尾巴特征,如下所示:

          • 尾巴是對稱的,這將簡化計算。

          • 尾巴是不對稱的,可以通過半尾巴進行比較。

          盡管進行了大量測試,但這并沒有給我們非常確定的結(jié)果,因為我們認為我們的分離不夠可靠,我們將需要更多時間來研究信號處理帶來的更好分離。

          最后的想法

          本文中由于圖片的顏色(基本上是藍色——海洋和天空)以及數(shù)據(jù)集中圖片的不同亮度,我們對尾巴識別應用了兩種連續(xù)的處理方法。

          首先,曲率積分是一種通過查看曲線的局部變化對信號進行歸一化的方法,然后,我們使用了動態(tài)時間規(guī)整,這是兩條曲線之間的距離計算方法,即使移動了兩條曲線也可能會發(fā)現(xiàn)兩條曲線之間的相似性。

          不幸的是,結(jié)果并不如我所愿,我們無法繼續(xù)使用該解決方案。通過更多的時間和更多的努力,我深信我們可以改進實現(xiàn)中的每個步驟,從而獲得更好的模型。

          通過所有步驟,實現(xiàn)它們的不同方法以及參數(shù),監(jiān)視所有轉(zhuǎn)換非常具有挑戰(zhàn)性。正如我們有路線圖一樣,每一步都有其自身的困難,每一次小小的成功都是勝利,并開啟了下一步,這是非常另人興奮的。

          我發(fā)現(xiàn)這種方法是非常有趣的,與通常的預訓練CNN模型完全不同。希望你也喜歡本文中這種方法的優(yōu)點。

          參考文獻
          • IC + DTW的總結(jié):

            • https://arxiv.org/abs/1708.07785

          • 動態(tài)時間規(guī)整1–0–1(中等)

            • https://towardsdatascience.com/dynamic-time-warping-3933f25fcdd

          • DTW python實現(xiàn)

            • https://pypi.org/project/dtw-python/

          • Kaggle座頭鯨鑒定比賽

            • https://www.kaggle.com/c/humpback-whale-identification

          • 關(guān)于此次活動的Capgemini 網(wǎng)頁(面向公司外人員)

            • https://www.yammer.com/capgemini.com/#/threads/inGroup?type=in_group&feedId=13438430&view=all

          參考鏈接:https://towardsdatascience.com/whale-identification-by-processing-tails-as-time-series-6d8c928d4343

          本文僅做學術(shù)分享,如有侵權(quán),請聯(lián)系刪文。
          —THE END—
          瀏覽 75
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  无码激情 | 777中文字幕 | 国产精品爽爽久久久久久 | 五月激情婷婷基地 | 日韩成人午夜视频 |