作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
迈克尔·卡切夫斯基的头像

Michael Karchevsky

Michael是一位经验丰富的Python、OpenCV和c++开发人员. 他对机器学习和计算机视觉特别感兴趣.

Previously At

SLB
Share

比赛是提升机器学习技能的好方法. 您不仅可以访问高质量的数据集,还可以获得明确的目标. 这可以帮助您专注于重要的部分:为手头的问题设计高质量的解决方案.

我和我的一个朋友最近参加了 N+1 fish, N+2 fish competition. 这个机器学习竞赛,有很多图像处理,需要你 process video 鱼被识别、测量、保存或扔回大海的片段.

用于识别和测量鱼类的机器学习的抽象图像

In the article, 我将引导您了解我们如何使用标准图像处理技术和预训练的神经网络模型来解决比赛中的问题. 提交的解决方案的性能是根据一定的公式来衡量的. 凭借我们的解决方案,我们获得了第11名.

关于机器学习的简单介绍,可以参考 this article.

About the Competition

我们在每个片段中都有一条或多条鱼的视频. 这些视频是在缅因湾捕鱼的不同船只上拍摄的.

这些视频是从固定位置的摄像机收集的,这些摄像机被放置在尺子上向下看. 尺子上放着一条鱼, 渔夫把手从尺子上移开, 然后渔夫根据鱼的种类和大小丢弃或保留鱼.

来自该项目的一个示例视频剪辑

Performance Metric

这个项目有三个重要的任务. 最终目标是创建一种算法,可以自动为视频文件生成注释, 其中注释由以下部分组成:

  • 鱼出现的顺序
  • 视频中出现的每条鱼的种类
  • 视频中出现的每条鱼的长度

比赛的组织者创建了一个综合指标,对所有这些任务的表现进行总体评估. 该指标是每个任务的单个指标的简单加权组合. 虽然有一定的重量, 他们建议我们专注于一个能够为所有任务做出贡献的全面的算法!

您可以从中了解有关如何通过每个单独任务的性能度量来计算总体性能度量的更多信息 官方竞赛网页.

设计一个机器学习解决方案

When working with machine learning 处理图片或视频的项目,您将最有可能使用 卷积神经网络. But, 在我们使用卷积神经网络之前, 我们必须对帧进行预处理,并通过不同的策略解决一些其他的子任务.

对于训练,我们使用了一个nVidia 1080Ti GPU. 为了在竞争中保持竞争力,我们浪费了大量时间去优化代码. 然而,我们确实花了更少的时间在那些更重要的事情上.

阶段0:找出独特船只的数量

通过轮廓分析,找到船只的数量变成了一项相当琐碎的任务. 步骤如下,并利用了一些非常标准的技术:

  1. 从每个视频中随机获取一些帧.
  2. 计算统计数据和 加速鲁棒特性(SURF) for each image.
  3. Using silhouette analysis 对于k均值聚类,我们可以找到船的数量.

SURF检测图像中的兴趣点并生成特征描述. 这种方法非常健壮,即使在各种图像转换中也是如此.

一旦图像中感兴趣点的特征已知, 进行K-means聚类, 然后进行轮廓分析,以确定图像中船只的大致数量.

阶段1:识别重复的框架

尽管数据集包含单独的视频文件, 每个视频似乎都与数据集中的其他视频有一些重叠. 这可能是因为这些视频是从一个长视频中分离出来的,因此在每个视频的开始或结束处都有一些共同的帧.

常用框架的图形表示

识别这样的框架,并在必要时删除它们, 我们在帧上使用了一些快速哈希函数.

第二步:定位尺子

通过应用一些标准的图像处理方法, 我们确定了尺子的位置和方向. 然后,我们旋转并裁剪图像,以一致的方式在所有帧中定位标尺. 这也使我们能够将帧尺寸减小到原来的十倍.

检测到的标尺(绘制在平均帧上):

标尺检测过程的可视化描述

裁剪和旋转区域:

裁剪后的尺子的照片

第三步:确定鱼的序列

在这次比赛中,执行这个阶段来确定鱼的顺序花费了我大部分的时间. 训练新的卷积神经网络似乎太昂贵了, 所以我们决定使用预训练的神经网络.

为此,我们选择了以下神经网络:

这些神经网络模型是在 ImageNet dataset.

我们只提取模型的卷积层,并通过它们传递竞争数据集. 在输出中,我有一个相当紧凑的特征数组.

Then, 我们只训练具有完全连接的密集层的神经网络,并预测每个预训练模型的结果. 之后,我们对结果求平均值,结果很糟糕.

我们决定用 长短期记忆(LSTM) 神经网络用于更好的预测,其中输入数据是由预训练模型转换的五帧序列.

为了合并所有模型的输出,我们使用了几何均值.

鱼类检测管道为:

  1. 用预训练的模型生成特征.
  2. 在密集神经网络上预测鱼出现的概率.
  3. 使用预训练的模型生成LSTM特征.
  4. 在LSTM神经网络上预测鱼出现的概率.
  5. 使用几何平均值合并模型.

一个视频的结果是这样的:

样本鱼检测结果显示在图形上,帧索引沿x轴,概率沿y轴

第四阶段:鉴定鱼的种类

在花费大部分比赛时间执行前一阶段后, 我们试图用前一阶段的模型来确定鱼的种类,以弥补失去的时间.

我们的方法大致如下:

  1. 向卷积预训练模型VGG16添加密集层, VGG19, ResNet50, Xception, InceptionV3层(卷积层的权重是固定的).
  2. 用小图像增强训练模型.
  3. 用每个模型预测物种.
  4. Сonsolidate模型通过投票.

第五步:测量鱼的长度

为了确定鱼的长度,我们使用了神经网络. 其中一个被训练来识别鱼头,另一个被训练来识别鱼尾. 鱼的长度近似为两个神经网络识别的两点之间的距离.

显示鱼头和鱼尾之间距离的照片

Complete Scheme

以下是各阶段的总体方案:

描述完整方案的流程图

整体设计相当简单,因为视频帧在合并单独的结果之前经过了上面概述的阶段.

关于总博客的进一步阅读:

了解基本知识

  • 什么是剪影分析?

    轮廓分析是一种能够区分视觉上彼此分离的数据点簇的技术.

  • 什么是机器学习模型?

    机器学习模型是机器学习算法在数据上训练的产物. 该模型以后可用于为类似的输入产生相关的输出.

聘请Toptal这方面的专家.
Hire Now
迈克尔·卡切夫斯基的头像
Michael Karchevsky

Located in Batumi, Adjara, Georgia

Member since September 12, 2016

About the author

Michael是一位经验丰富的Python、OpenCV和c++开发人员. 他对机器学习和计算机视觉特别感兴趣.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

Previously At

SLB

世界级的文章,每周发一次.

订阅意味着同意我们的 privacy policy

世界级的文章,每周发一次.

订阅意味着同意我们的 privacy policy

Toptal Developers

Join the Toptal® community.