本文概述
- 关于比赛
- 设计机器学习解决方案
- 完整方案
我和我的一个朋友最近参加了N + 1鱼, N + 2鱼比赛。这项机器学习竞赛需要大量图像处理, 因此你需要处理被识别, 测量, 保藏或扔回海中的鱼类的视频剪辑。
文章图片
在本文中, 我将向你介绍如何使用标准图像处理技术和预先训练的神经网络模型从竞争中解决问题。提交的解决方案的性能是基于特定公式进行衡量的。通过我们的解决方案, 我们成功地获得了第11位。
有关机器学习的简要介绍, 可以参考本文。
关于比赛 我们获得了每个段中一条或多条鱼的视频。这些视频是在缅因湾的不同船上捕鱼的底栖鱼上捕获的。
这些视频是从固定位置的摄像机收集下来的, 这些摄像机放置在俯视标尺的位置。将鱼放在标尺上, 渔夫将手从标尺上移开, 然后渔夫根据种类和大小丢弃或保留鱼。
文章图片
绩效指标
有三个任务对这个项目很重要。最终目标是创建一种算法, 该算法可自动为视频文件生成注释, 其中注释包括:
- 出现的鱼的顺序
- 视频中出现的每种鱼的种类
- 视频中出现的每条鱼的长度
你可以从官方比赛网页上的每个任务的绩效指标中了解有关如何计算总体绩效指标的更多信息。
设计机器学习解决方案 在处理涉及图片或视频的机器学习项目时, 你很可能会使用卷积神经网络。但是, 在使用卷积神经网络之前, 我们必须对框架进行预处理, 并通过不同的策略解决其他一些子任务。
为了进行培训, 我们使用了一个nVidia 1080Ti GPU。为了优化我们的代码以保持竞争优势, 我们损失了很多时间。但是, 我们确实花了更少的时间, 而本来会更重要的是。
阶段0:找出唯一船的数量
通过轮廓分析, 找到船的数量变得相当琐碎。步骤如下, 并利用了一些非常标准的技术:
- 从每个视频中获取一些随机帧。
- 计算每个图像的统计信息并加快鲁棒性(SURF)。
- 使用轮廓分析进行K均值聚类, 我们可以找到船的数量。
知道图像中兴趣点的特征后, 将执行K均值聚类, 然后进行轮廓分析以确定图像中船的大约数量。
阶段1:识别重复的帧
尽管数据集包含单独的视频文件, 但每个视频似乎都与数据集中的其他视频有些重叠。这可能是因为视频是从一个长视频中分离出来的, 因此最终在每个视频的开头或结尾都有一些共同的帧。
文章图片
为了识别此类帧并根据需要将其删除, 我们在帧上使用了一些快速哈希函数。
阶段2:找到标尺
通过应用一些标准的图像处理方法, 我们找到了标尺的位置及其方向。然后, 我们旋转并裁剪图像, 以在所有帧中以一致的方式定位标尺。这也使我们可以将帧大小减小十倍。
检测到的标尺(标绘在中间帧上):
文章图片
裁剪和旋转区域:
文章图片
阶段3:确定鱼的顺序
在这个比赛中, 我花费了大部分时间来实施这一阶段来确定鱼的顺序。训练新的卷积神经网络似乎太昂贵了, 因此我们决定使用预训练的神经网络。
为此, 我们选择了以下神经网络:
- VGG16
- VGG19
- ResNet50
- Xception
- 盗梦空间V3
我们仅提取模型的卷积层, 并将其通过竞争数据集。在输出中, 我有很多紧凑的功能。
然后, 我们仅使用完全连接的密集层来训练神经网络, 并为每个预先训练的模型预测结果。之后, 我们将结果取平均值, 结果却很差。
为了更好地预测, 我们决定将其替换为长短期记忆(LSTM)神经网络, 其中输入数据是五个帧的序列, 并使用预训练的模型进行了转换。
【机器学习视频分析(识别鱼)】为了合并所有模型的输出, 我们使用了几何平均值。
鱼的检测管道为:
- 使用预训练的模型生成特征。
- 在密集的神经网络上预测鱼出现的可能性。
- 使用预训练的模型生成LSTM功能。
- 在LSTM神经网络上预测鱼出现的可能性。
- 使用几何平均值合并模型。
文章图片
阶段4:确定鱼类种类
在花了大部分比赛时间实施前一阶段之后, 我们尝试弥补前一阶段的模型在识别鱼的种类上所浪费的时间。
我们的处理方法大致如下:
- 在卷积预训练模型VGG16, VGG19, ResNet50, Xception, InceptionV3层中添加密集层(卷积层的权重是固定的)。
- 用小图像增强训练模型。
- 用每种模型预测物种。
- 通过投票巩固模型。
为了确定鱼的长度, 我们使用了神经网络。其中一位受过训练以识别鱼头, 另一位受过训练以识别鱼尾。鱼的长度近似为两个神经网络确定的两点之间的距离。
文章图片
完整方案 以下是各阶段的总体方案:
文章图片
总体设计相当简单, 因为在合并单独的结果之前, 视频帧已通过上述阶段。
推荐阅读
- 前端框架(解决方案还是膨胀的问题())
- 混合整数规划(计算决策指南)
- 使用Node.js和MongoDB轻松进行集成和端到端测试
- 微服务通信(Redis的Spring集成教程)
- 构建文本分类程序(NLP教程)
- 风险与回报(了解软件容器的指南)
- 解决 Android Studio(Failed to resolve: com.android.support:appcompat-v7:29.+ 错误)
- Android Studio学习记录-第四周
- 无障碍开发(十七)之京东APP一期优化案例讲解