共计 6002 个字符,预计需要花费 16 分钟才能阅读完成。
作者 |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…)是一种可能在两个工夫序列之间找到最佳对齐形式的算法。它通常用于确定工夫序列的相似性,分类以及查找两个工夫序列之间的对应区域。
与欧几里得间隔(指的是两条曲线之间的间隔,逐点)相同,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 进行轮廓转换。它给了咱们一个 300×1 形态的张量,最初咱们要计算整个数据集的间隔。顺便说一句,这很费时。
裁决:后果可观!当咱们有两张雷同的鲸鱼照片时,在大多数状况下,两张照片是最靠近的 40 张,这在 2000 年中是最好的。然而,如引言中所述,应用暹罗网络的后果要好于这张照片(图片通常在最近的 5 张中)),鉴于较量的工夫,咱们不得不在考察中抉择其余的办法。
处分:解决一半的尾巴和一半的信号
咱们尝试应用半尾巴,假如以下任一状况:
- 尾巴是对称的,这将简化计算。
- 尾巴是不对称的,因而能够通过半尾巴进行比拟。
只管进行了大量测试,但这并没有给咱们十分确定的后果。咱们认为咱们的拆散不够牢靠:咱们将须要更多工夫来钻研信号处理带来的更好拆散。
最初的想法
在发送了一些比咱们设想的要难的工夫的尾部提取后,因为图片的色彩(基本上是蓝色——陆地和天空)以及数据集中图片的各种亮度,咱们对尾巴辨认利用了两种间断的解决办法。
首先,曲率积分是一种通过查看曲线的部分变动对信号进行归一化的办法。而后,咱们应用了动静工夫规整,这是两条曲线之间的间隔计算,即便挪动了两条曲线也可能会发现两条曲线之间的相似性。
可怜的是,后果并不如我所愿,咱们无奈持续应用该解决方案。通过更多的工夫和更多的致力,我坚信咱们能够改良管道的每个步骤,从而取得更好的模型。我也十分喜爱和本文提到的这些概念一起工作。
通过所有步骤,实现它们的不同办法以及参数,监督所有转换十分具备挑战性。正如咱们有路线图一样,每一步都有其本身的艰难,每一次小小的胜利都是胜利,它开启了下一步。十分可喜。
我发现这种办法十分乏味,并且与通常的预训练的 CNN 齐全不同。心愿你也喜爱本文主题的这种办法的长处。如有任何疑难,请随时与我分割????
参考文献
-
咱们从这篇论文中失去了 IC + DTW 的想法:
- https://arxiv.org/abs/1708.07785
-
动静工夫规整 1–0–1(中等)
- https://towardsdatascience.co…
-
DTW python 实现
- https://pypi.org/project/dtw-…
-
Kaggle 座头鲸鉴定较量
- https://www.kaggle.com/c/hump…
-
对于此次流动的 Capgemini 网页(面向公司外人员)
- https://www.yammer.com/capgem…
原文链接:https://towardsdatascience.co…
欢送关注磐创 AI 博客站:
http://panchuang.net/
sklearn 机器学习中文官网文档:
http://sklearn123.com/
欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/