本教程的目的是通过一个我们必须解决的现实示例来演示算法标记的威力。*如果您想查看此过程中生成的完整标记数据集,请在此处注册。
在以后的文章中,我们将详细介绍什么是算法标记,但是,简而言之,算法标记是关于在问题空间中收集所有现有信息,并将其转换为程序形式的解决方案。
这是一个算法标签示例,用于标记汽车的简短视频:
Cord在我们通常的专业领域是处理视频数据,但是最近我们遇到了一个问题,其中唯一可用的数据是图像。因此,我们不能依靠视频数据中可靠存在的帧之间的正常时空相关性来提高注释过程的效率。但是,我们仍然可以使用算法标记的原理来自动标记数据。在讨论之前,问题如下:
A公司想要建立一个深度学习模型,该模型可以查看一盘食物并量化该盘食物的卡路里计数。他们拥有一个开源数据集,希望将其用作识别板上各个成分的第一步。他们要使用的数据集带有图像级别分类,但没有“食物对象”本身的边界框标记。我们的目标是重新标记数据集,以使每个框架在每个食物周围都具有正确放置的边界框。
我们将不使用手工绘制这些边界框,而是使用算法标记来标记数据。
因此,在讨论使用算法标记解决此问题之前,我们先来看一下标记该数据集的现有选项。我们可以:
继续并自己给标签贴上标签。绘制边界框大约需要六秒钟,使用约3000张图像,手动标记所有图像大约需要五个小时。
将数据发送到其他地方进行标记。估计每张图像的外包成本可能约为0.15美元,总成本约为450美元。另外,还要花一些时间来编写规范,并将数据往返传递给外部提供商。
如果我们将算法标记的成本/时间权衡与前两个选项进行比较,那似乎就不是灌篮。编写一个好的程序将花费一些时间,最初可能比您自己为数据添加注释要花费更多的时间。但是它具有非常重要的好处:
一旦算法生效,它既可用于类似问题,又可扩展以适应稍有变化的问题。
编写程序的初始时间成本是固定的,不会随您拥有的数据量而增加。因此,编写良好的标签算法是可扩展的。
最重要的是,编写标签算法可以改善最终模型。有了标记的数据集,数据科学过程就不会开始,而一旦有了任何数据,它就开始。通过仔细思考算法来标记数据的过程将使您深入了解仅将数据发送给外部方进行注释时将丢失的数据。
使用算法标记,通过您编写的程序实际了解数据具有很强的积极外部性。时间是固定的,但程序和您的见解将永远存在。
考虑到所有这些,让我们考虑一下可用于编写此数据程序的过程。 高级步骤将是 任何数据科学过程的第一步都应该是查看数据并清点其组织结构以及其共有的属性和不变量。 这通常从数据的目录结构开始: 数据被组织在盘子上单个食物项目的照片图像组中。 包含图像的每个文件夹的标题是要拍照的食物的名称 每个图像只有一块食物,而食物是图像中最突出的部分 在大多数图像中,食物的颜色都很醒目,因为食物总是放在一张坐在不彩色桌子上的白板上 照片中通常会有一个拇指,摄影师可能会用它来放大尺寸
有些食物看起来比其他食物更具挑战性。例如,鸡蛋的图片突出,因为颜色配置文件是白色的。也许不应该对每一种食物都使用相同的程序。
下一步是看看我们是否可以将这些观察结果综合到原型程序中。
我们可以从观察中得出一些结论,也可以在编写原型时做出一些有根据的猜测:
-我们可以使用图像组的标题来帮助我们。如果标题中包含食品名称,我们只需要担心该食品在图像组中。如果我们有一个特定食物模型,我们可以在所有带有该标题的图像组上运行它。
-每帧应该只有一个边界框,并且每帧中都应该有一个边界框。我们可以编写一个显式强制执行此条件的函数。
-我们应该在更具“挑战性”的食品上添加更多的手注。
-由于食物位置在图像之间的跳动幅度不大,因此我们不妨尝试使用对象跟踪器来标记每个图像组
-食品在每个图片中的定义都非常好,因此深度学习模型在此数据上可能会做得很好
-图片中的颜色对比可能会很好地利用语义分割模型
让我们将其更严格地综合在一起,成为原型标签算法。我们的注释策略如下:
使用目录结构以编程方式将数据上传到Cord注释平台上,以指导我们。我们将使用Cord数据功能将单独的图像连接到视频对象中,以便我们也可以使用对象跟踪
用手注释两个食物示例,一个在第一个图像上,一个在中点图像上。对于我们认为像鸡蛋之类的棘手食品,我们将尝试使用十个注释,而不是两个。
在图像之间运行CSRT对象跟踪器。同样,该数据集不是视频数据集,但是每个图像中只有一个对象位于每帧的同一位置附近,因此对象跟踪算法可以用作标签的不错的第一近似。
使用跟踪器生成的标签,针对每个食品项目,通过迁移学习来训练深度学习模型。我们可以从细分模型开始。这些对象与背景形成鲜明对比。用嘈杂的标签加上清晰的轮廓训练模型可能足以获得良好的结果。在上一步中,我们已经将边界框转换为多边形,因此,Cord客户端现在可以训练分段模型。
在标题带有该食物的所有图像分组上运行模型。将多边形预测转换回边界框,并通过采用最高置信度预测来确保每个图像只有一个框。
而已。该程序的完整代码可以在下面找到。数据功能库和完整的SDK仍处于私有Beta中,但是如果您想亲自尝试,请在此处注册。
现在,让我们在一些示例数据上运行该程序。我们将选择香蕉进行测试:
现在我们有了一个运行良好的算法,我们可以将其缩放到剩余的数据集。首先,让我们浏览并注释我们需要的几帧。我们将为较困难的物品(例如鸡蛋)添加更多框架。总体而言,我们只对3000张图像中的90张图像进行了注释。我们现在可以运行该程序,并等待结果与所有标签一起返回。让我们回顾一下各个标签。
我们可以看到在很大程度上它做得很好。
故障模式在这里也很有趣,因为我们对最终的下游模型可能出现问题的地方有了“第一眼的印象”。
对于这些“故障”,我可以进行检查并计算需要纠正的总数。整个数据集中只有50次手部校正。总体而言,标签算法需要少于5%的手工标签才能使所有内容正常工作。
这就是整个过程。 我们对数据进行了一些相对简单的观察,并将其转换为95%的数据的自动标记。 现在,我们可以使用标记的数据集构建所需的卡路里模型,但关键的是,我们也可以使用算法标记过程中的许多想法来帮助我们。 *实际示例总是比混合示例更好,因为它们混乱,复杂并且需要动手实践的解决方案。 在这种情况下,您将使用不同的解决问题的肌肉,而不是通常使用带有良好封闭成型类型解决方案的炮制示例中不使用的肌肉。