基于彩色滤波器的尾部提取
检测尾巴轮廓的第一步是在图片里从天空和海水中提取尾巴,这也是尾部提取中最困难的部分。
首先,我们使用轮廓检测算法,但是由于从一个镜头到另一个镜头的阳光不断变化,因此对比度发生了很大变化,轮廓检测算法得到结果总不能令人满意。
使用颜色提取尾巴
我们为每个通道强度(红色,绿色,蓝色)绘制灰度图片
观察单个图片的三个通道
正如你在上面看到的,对于大多数图片来说,图片中间的颜色较少,可以按像素强度进行过滤。由于尾巴通常是灰色的,因此它们的每种颜色的数量几乎相同(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。
但是并不是每一张图片的光照强度都是一样的,通过将所有这些阈值绘制在随机图片上的结果,该阈值在10到130之间变化。那么如何选择合适的值呢?
使用边界框选择阈值
通过查看前面的图片,我们想到了一些东西:正确阈值的正确图片是外部具有最大空白区域而内部具有最大区域的图像,我们希望一些在ImageNet上训练的神经网络可以对图片中的鲸鱼进行定位,我们决定使用基于ImageNet预训练的MobileNet。
与原始图片相比,一批提取的尾巴带有边框
如下所示,我们可以非常准确地确定图片中尾巴的位置,然后,我们可以在所有图片中将“尾部-内部”与“海部-外部”分开。
为了更好地了解这种分离,对于训练集的每张图片,我们将边界框内每个像素的蓝色值相加,并对框外的像素进行相同的处理。
然后,我们在下图上绘制每个图片,内部结果体现在X轴上,外部结果体现在Y轴上,蓝线代表X = Y。我们可以从此图形中获得的含义如下:你离线条越远,尾巴和海洋之间的分隔就越容易。
我们尝试根据与线的距离应用过滤器阈值,但这没有产生任何结果,经过几次尝试,我们知道仅根据图片的颜色分布还得不到结果,因此我们决定采用强硬的方法,即除了查看图片并确定阈值外,我们还为每张图片应用15个滤波器,对其进行分析,然后自动选择最佳滤波器以进行进一步处理。
然后对于给定的图片,我们将15个滤波器应用了15个不同的值作为阈值,对于每个滤波器,我们计算边界框内的像素和外面的像素的数量(过滤后,像素值为0或1,无需再对强度求和),然后,对结果进行归一化,使数字独立于图像的大小,并将结果绘制在一个图形上。
单个图片和不同过滤阈值的边界框内(X轴)和外框(Y轴)的像素数量。
对于每张图片,我们得到的曲线都类似于上面的曲线,这是我们随着阈值的演变而对前面的陈述进行的数学转换。
-
当阈值很小时,尾巴和大海消失了,尾部内部或外部均无像素
-
当阈值增加时,出现尾巴,并且X轴的值升高。
-
直到阈值开始出现在海洋的某些部分,并且外部关注度开始增长。
使用线性回归或导数,很容易计算出正确的阈值:它是图的两条线的交点处的阈值。
注意:橙色线是 y = y_of_the_selected_threshold