训练数据自动化与优化全解析
1. 观察者模式(Watcher)
在训练数据的场景中,用户的操作,如创建注释、删除注释、更改标签等,都被视为事件。从语义层面来看,像
create_instance
这样的事件比普通的鼠标点击更具意义。例如,当用户创建实例后,我们可能希望运行某个模型,此时
create_instance
事件就更能满足需求。
要使用观察者,首先需要定义一个在
create_instance
事件发生时执行的函数,示例代码如下:
create_instance: function (data){ // your function goes here }
create_instance: function (data){
console.log(data[0])
}
2. 感兴趣区域(ROI)的交互式捕获
根据用户的注释捕获画布上的感兴趣区域,这是基于裁剪区域运行算法的第一步。示例代码如下:
create_instance: function (data){
let ghost_canvas = diffgram.get_new_canvas()
let instance = {...data[0]}
let roi_canvas = diffgram.get_roi_canvas_from_instance(
instance,
ghost_canvas)
}
这里的核心思想是利用用户的输入对输入模型的数据进行预处理。
3. 使用 GrabCut 将交互式绘制框转换为多边形
该示例会对感兴趣区域的画布运行标准的 OpenCV GrabCut 算法,并输出多边形点,这些点随后会转换为可由人工编辑的注释。关键在于,你可以用自己偏好的算法替换
GrabCut()
。简化的伪代码(JavaScript)如下:
let src = cv.imread(roi_canvas);
cv.grabCut(src,//args) // replace with your model or preferred algorithm
cv.findContours(//args) // because it’s a dense mask
cv.approxPolyDP(//args) // reduce to useful volume of points
points_list= map_points_back_to_global_reference()
// because roi is local, but we need the location relative to whole image
diffgram.create_polygon(points_list)
4. 全图像模型预测示例
除了直接的交互式示例,我们还可以运行文件级别的模型。其核心思路是获取用户交互信息和原始媒体数据,然后执行自动化操作。以下是一个 JavaScript 示例:
this.bodypix_model = await bodyPix.load()
let canvas = diffgram.get_new_canvas()
let metadata = diffgram.get_metadata()
segmentation = await this.bodypix_model.segmentPerson(canvas, {});
Points_list = get_points_from_segementation()
diffgram.create_polygon(points_list)
5. 不同属性的人物检测示例
我们可以利用自动化来运行模型。例如,在 Diffgram 用户脚本中使用 BodyPix 模型对整幅图像进行处理,分割出所有人物。然后,我们可以选择人物并添加自定义属性,如“是否在打电话”。这展示了如何使用并非直接针对训练数据目标的模型,避免重复造轮子。
6. 质量保证自动化
6.1 使用模型调试人工标注
模型可以发现标注数据中的错误。如果模型有大量的真实示例,它就能克服一些小错误。在处理图像时,可以使用交并比(IoU)来判断模型预测与真实标注之间的差异。如果模型预测附近没有对应的真实标注,那么可能是模型出错,也可能是真实标注有误。应用程序可以将这些差异以排名列表的形式呈现出来。
6.2 自动化检查列表示例
检查列表是质量保证工作流程的重要组成部分。它可以是供人工审核的列表,也可以进行编程实现。以下是一些示例参数:
- 样本数量是否合理?
- 空间坐标是否合理?
- 所有属性是否都经过人工选择或批准?
- 所有实例是否都经过人工批准?
- 是否存在重复实例?
- (特定于视频)是否存在实例在某些帧中缺失的情况(例如,在第 n 帧存在,第 n + 1 帧缺失,第 n + 2 帧又出现,且未标记为序列结束)?
- 是否存在依赖类型规则的问题(例如,如果存在 A 类,则应同时存在 B 类,但 B 类缺失)?
6.3 特定领域的合理性检查
根据不同的领域,我们可以使用或构建特定的检查方法。例如,如果类别是“人”,而样本空间位置上 95% 的像素颜色相似,那么这可能是不正确的。或者,我们可以检查大部分像素的直方图分布是否与预期不同(例如,已知某个对象永远不会有红色像素)。
7. 数据发现:标注内容的选择
数据发现工具可以帮助我们理解现有数据集,识别最有价值的数据进行标注,并避免在收益递减的数据上浪费时间。从概念上讲,这些方法大致可以分为以下三类:
- 人工探索
- 基于元数据
- 基于原始数据
7.1 人工探索
所有方法在某个阶段都需要一定形式的人工审核。常见的人工数据发现步骤包括:
- 在用户界面目录中直观地探索数据
- 查询数据以识别感兴趣的子集(例如,“胡萝卜数量 > 10”)
- 审查工具的结果(例如,相似度搜索)
人工探索在整个过程的多个阶段都会发生,包括原始未标注数据、已有部分标注但需要更多价值添加的数据、数据子集以及各种工具实践的结果。人工审核对于发现自动化过程中的错误至关重要,因为自动化可能会对数据做出错误的假设。
7.2 原始数据探索
原始数据探索方法主要关注实际的原始数据。例如:
- 相似度搜索:当我们发现与给定样本相似的标注数据不足时,可以对该样本进行相似度搜索,找到更多相似但未标注的样本,然后创建任务对这些样本进行审核。
- 数据分组:假设有白天和夜晚的图片,我们可以使用原始数据探索工具将这些数据分为两组。系统可能不知道这是白天和夜晚的图片,但通过查看原始数据可以识别出两个(视觉上)不同的组。然后,我们可以从每组中采样,例如各取 100 个样本,以避免获取大量相似分布的样本。
- 异常值识别:标记那些可能由于数量不足而难以正确理解的稀有样本。
7.3 元数据探索
样本通常会附带元数据,我们可以根据这些元数据进行查询,如时间、显微镜分辨率、位置等。在插入数据时,确保添加元数据,以便后续进行有效查询。此外,还可以使用现有网络进行粗略的预标注,例如在文件级别进行标注。例如,对于一家机器人公司,若只想标注“白天”的图像,但数据的元数据不可用,我们可以运行一个网络将图像标记为“白天”或“夜晚”,然后只标注“白天”的图像。
以下是数据发现方法的分类表格:
| 方法类别 | 具体方式 |
| ---- | ---- |
| 人工探索 | 直观探索数据、查询数据、审查工具结果 |
| 基于元数据 | 根据元数据查询、添加预标注元数据 |
| 基于原始数据 | 相似度搜索、数据分组、异常值识别 |
下面是数据发现流程的 mermaid 流程图:
graph LR
A[数据发现] --> B[人工探索]
A --> C[基于元数据]
A --> D[基于原始数据]
B --> B1[直观探索数据]
B --> B2[查询数据]
B --> B3[审查工具结果]
C --> C1[根据元数据查询]
C --> C2[添加预标注元数据]
D --> D1[相似度搜索]
D --> D2[数据分组]
D --> D3[异常值识别]
8. 数据增强(Augmentation)
数据增强是对真实数据进行修改的过程,例如对现有图像进行倾斜、改变亮度、引入伪像等。数据增强是一个活跃的研究领域,不同人对此有不同的看法。有人认为数据增强可以减少训练数据的工作量,一些流行的库和方法也会进行大量的数据增强操作,但实际带来的提升效果有时会被忽视。
8.1 数据增强的效果与问题
数据增强通常只能提供相对较小的性能提升,甚至可能导致性能下降,提升幅度大概在 -10% 到 10% 之间。随着模型和算法的不断改进,数据增强的效果会逐渐减弱。例如,数据存在近乎无限的细微组合,试图通过训练大量细微不同的数据来提高理解能力并不是一个好的策略。
在实际应用中,数据增强可能会带来一些问题。比如,使用某些方法快速标注空间位置时,可能会引入难以纠正的错误和伪像,这些问题在数据集中花费大量时间后才会被发现,可能导致需要重新处理数据或出现难以理解的生产错误。另外,需要不断纠正的预标注方法也存在问题,因为纠正的速度大约是直接正确绘制空间位置的三分之一,所以预标注必须非常准确才能实现净提升。使用外部模型进行数据增强还可能会引入偏差,污染新的训练数据。
8.2 数据增强的使用原则
在使用数据增强时,需要遵循以下原则:
- 谨慎探索:数据增强方法往往隐藏着一些权衡,需要仔细考虑。
- 考虑净提升:要综合考虑增加的复杂性、降低的灵活性以及计算/存储成本等因素。
- 注意方法的特异性:很多数据增强方法只适用于特定的情况,在其他情况下可能效果不佳。
此外,还有一些一般性的观察结果:
- 空间类型的增强方法通常比类别标签的增强方法更有效。
- 在探索基于模型的增强方法之前,最好先创建一个“种子”数据集。
- 在某些情况下,如“纠正”生产管道时,可能难以避免使用增强后的训练数据。
8.3 训练/运行时增强
只要数据增强的方法和过程是可重现的,就不需要将增强后的数据与常规训练数据一起存储。增强后的数据通常比较“嘈杂”,对人类来说价值不大。然而,在训练时实现数据增强会面临一些挑战,如内存和计算成本。将数据增强移到运行时也并非总是容易实现的。
8.4 补丁和注入方法(裁剪和注入)
该方法是将数据的补丁(即裁剪或子部分)进行组合,创建新的组合。对于图像来说,可以将稀有类别放置在场景中,类似于一种混合模拟,在不同的位置模拟真实数据。但这仍然是一个研究领域,模型需要对这种情况具有鲁棒性。
以下是数据增强相关问题及原则的表格:
| 方面 | 具体内容 |
| ---- | ---- |
| 效果与问题 | 提升效果有限,可能引入错误、偏差,随着模型改进效果减弱 |
| 使用原则 | 谨慎探索,考虑净提升,注意方法特异性 |
| 一般性观察 | 空间类型增强更有效,先创建“种子”集,某些情况难避增强数据 |
下面是数据增强流程的 mermaid 流程图:
graph LR
A[数据增强] --> B[训练/运行时增强]
A --> C[补丁和注入方法]
B --> B1[可重现增强]
B --> B2[面临挑战]
C --> C1[组合数据补丁]
C --> C2[模型需鲁棒]
9. 模拟和合成数据
模拟和合成数据技术与特定领域密切相关,通常涉及训练数据之外的其他领域和学科。所有合成数据方法都需要一定的真实数据和人工审核才能发挥作用,因此合成数据不能完全替代真实数据,只能作为真实数据的补充。
9.1 模拟数据的效果
模拟数据在一定程度上可以提升性能,并且在获取数据困难或不可能的情况下有一定的应用价值。但模拟数据不太可能达到理想的效果,因为要模拟出达到所需真实度的数据是一个非常困难的问题,类似于人工智能领域的难题。使用模拟自动创建训练数据类似于使用启发式方法,与人类监督的方式有所不同。
9.2 模拟数据需要人工审核
即使是大型公司提供的模拟数据也可能存在问题。例如,某公司声称的“完美”数据中,模拟图像中的人行横道线有模糊和缺失的情况,但训练数据渲染时却忽略了这些问题,生成了完美的人行横道线。如果直接使用这样的数据进行训练,会误导模型。
对于一些不可能或罕见的情况,应该将模拟视为自动创建场景,而不是自动创建训练数据,人类需要对这些场景进行进一步处理以创建训练数据。同时,要清楚模拟实际能够知道的信息,例如超市货架的模拟,如果没有特殊设计,货架可能看起来相似,但不清楚它们在哪些维度上会有所不同。
以下是模拟和合成数据相关内容的表格:
| 方面 | 具体内容 |
| ---- | ---- |
| 效果 | 可提升性能,适用于难获取数据情况,但难达理想效果 |
| 人工审核 | 模拟数据可能存在错误,需人工审核,应视为创建场景而非训练数据 |
下面是模拟和合成数据流程的 mermaid 流程图:
graph LR
A[模拟和合成数据] --> B[模拟数据效果]
A --> C[需要人工审核]
B --> B1[提升性能]
B --> B2[难达理想效果]
C --> C1[数据可能有错误]
C --> C2[视为创建场景]
综上所述,在训练数据的处理过程中,从观察者模式的应用到数据发现、数据增强以及模拟和合成数据的使用,每个环节都有其特点和需要注意的问题。合理运用这些技术和方法,可以有效提高训练数据的质量和模型的性能。
超级会员免费看

被折叠的 条评论
为什么被折叠?



