利用尾巴作为时间序列进行处理来识别鲸鱼
作者|Lamothe Thibaud
编译|Flin
来源|towardsdatascience
使用曲率积分和动态时间规整,让我们深入研究抹香鲸识别!
前言
最近,我们尝试了Capgemini的全球数据科学挑战赛。我与Acores鲸鱼研究中心合作,挑战的目的是确定抹香鲸,用人工智能帮助拯救抹香鲸的生命。
为了完成这项任务,我们收集了几千张过去几年的鲸鱼照片。在训练数据集中,平均每头鲸鱼有1.77张照片,很多动物只出现过一次。因此,主要思想是,给定一个新的图片,在已有数据中找出最接近它的。
因此,如果鲸鱼已经被拍下来,研究人员就可以知道是何时何地拍的了。
我很自豪地宣布,我们以第三名的成绩结束了比赛,我们使用暹罗网络取得了胜利。但是,由于已经有很多关于这个奇妙架构的文章,今天我将介绍一个更有趣、更新颖的方法来解决这个问题。
方法
由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的轮廓检测算法,但是通过以下两个步骤,看起来会更快一些:
步骤1:使用熵去除尾巴周围的噪声
使用熵变仅保留提取的尾巴的轮廓
步骤2:保持每列图片的高光像素
应用熵滤波器后检测到的提取的尾巴轮廓
此步骤非常简单,没有什么复杂性。
曲率积分
通过从海中提取尾巴并获取图片的上部像素,我们得到了尾巴的后沿作为信号。现在我们有了这个,我们就要处理规范化问题。实际上,所有图片的大小或像素数量都不相同。此外,到抹香鲸的距离并不总是相同的,拍摄时的方位可能会发生变化。
尾巴方向的示例,同一条鲸的两张照片之间可能会有所不同
为了进行标准化,我们必须沿着两个轴进行。首先,我们决定使用每条尾巴300个点进行信号比较。然后我们对最短的插值进行插值,并对最长的进行采样。其次,我们将0到1之间的所有值归一化。这导致信号叠加,如下图所示。
标度信号叠加
为了解决定向问题,我们使用了曲率积分度量,该度量通过局部评估将信号转换为另一个信号。
如原始论文中所述:“它捕获沿后缘的每个点的局部形状信息。对于位于后缘上的给定点,我们在该点处放置一个半径为r的圆,然后找到后缘上位于该圆内的所有点。”
然后,在每一步中,我们将信号的边缘沿圆形拉直,以使其内接为正方形。
曲率积分原理
最后,我们定义曲率如下:
曲率是曲线下到正方形总面积的面积,这意味着直线的曲率值为c = 0.5
因此,我们获得了标准化信号,与鲸鱼和摄影者之间的距离无关,与鲸鱼和摄影者之间的角度无关,并且与鲸鱼和海洋之间的倾角无关。
然后,对于每张训练测试图片,我们在IC相移期间创建了半径分别为5、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/