AI算法开发流程
AI 算法开发主要按照以下流程进行。
| Step | 阶段 | 内容 |
|---|---|---|
| 1 | 概要 | 把握 AI 算法开发的整体流程。 |
| 2 | 需求分析 | 整理要实现的功能,明确所需的子算法。 |
| 3 | 数据准备 | 收集训练所需的多样化数据,并进行适当标注和预处理。 |
| 4 | 模型选择 | 根据精度、速度和用途选择合适的模型结构。 |
| 5 | 模型训练 | 使用 TensorFlow、PyTorch、Caffe 等框架训练模型。 |
| 6 | 模型转换 | 将训练完成的模型转换为 RKNN 格式,并进行量化和预编译。 |
1. 概要
AI 算法开发不是单一操作,而是一系列流程,包括需求整理、数据准备、模型选择、模型训练,以及面向实际运行环境的模型转换。
通过合理设计每个阶段,可以开发出既满足实际使用场景精度要求,又兼顾处理速度的 AI 模型。
2. 需求分析
算法功能通常会用较短的词语来描述,例如“人脸识别”“驾驶员行为检测”“商业设施客户行为分析”等。
但在实际应用中,最终功能往往需要多个子算法按顺序协同工作才能实现。这是因为各个子算法的神经网络结构不同,并且会针对各自的功能进行优化。
| 模型分类 | 功能 |
|---|---|
| 目标检测模型 | 检测图像中是否存在目标物,并输出该目标物的具体坐标。也可以同时提供分类功能。 |
| 关键点检测模型 | 检测图像中的特定对象,并输出骨骼点、面部器官位置等关键点。 |
| 相似度比较模型 | 比较两个不同个体之间的相似度。常用于人脸识别、猪脸识别、商品识别等场景。 |
| 分割模型 | 检测图像中的物体,并按照轮廓等基准将其分割为不规则像素区域。有时也同时具备分类功能。 |
| OCR 模型 | 识别文字。 |
下面列出由多个子算法构成的示例。
示例 A:人脸识别算法
人脸识别算法由以下子算法构成。
- 人脸检测模型(检测模型)
- 人脸姿态校正模型(关键点检测模型)
- 人脸比对模型(相似度比较模型)
示例 B:驾驶员行为检测算法
驾驶员行为检测算法由以下子算法构成。
- 人脸识别算法
- 吸烟、操作手机等危险行为识别(检测模型)
- 疲劳驾驶检测(关键点检测模型)
- 车道偏离检测(检测模型)
示例 C:商业设施分析
商业设施分析由以下子算法构成。
- 人脸识别算法
- 人体跟踪算法(检测模型 + 相似度比较模型)
只有明确实现具体需求所需的处理阶段,才能围绕目标进行数据收集、模型优化和模型训练。
3. 数据准备
对很多人来说,数据准备看起来是一项单调且重复的工作。但这一阶段有很多需要注意的重要要点。
数据样本的多样性
数据样本需要具备充分的多样性。样本多样性是保证算法泛化能力的基础。
例如,在开发农产品识别功能时,如果只收集红苹果图像进行训练,模型就很难准确识别绿苹果。
同时,还需要足够的负样本数据。如果只把农产品图像提供给神经网络,不能期待训练后的网络能够有效区分真苹果和塑料苹果。
为了提高算法可靠性,需要充分考虑实际使用场景中可能出现的特殊情况,并将这些数据加入训练数据中。
数据样本的压缩可能性
单个样本数据的大小会显著影响网络模型的运行效率。
在能够保持效果的范围内,应尽可能压缩图像尺寸,以提高处理效率。例如,在相同环境下,112×112 像素图像的处理速度可能比 224×224 像素图像快约 4 倍。
另一方面,在某些场景中,为了避免图像信息缺失,也需要完整图像。例如在山火检测中,对召回率要求较高,过度压缩图像可能导致召回率下降,从而降低算法性能。
合理标注和预处理
数据需要进行合理且准确的标注和预处理。
数据标注会在很大程度上决定训练结果所能达到的性能上限。如果错误标签过多,就很难得到有效的训练结果。
数据预处理是指为了让机器更容易理解数据,预先对数据进行一定处理。
例如,在表示农产品位于图像中的位置时,“中心点位于从左侧开始第 200 个像素”这样的表达直观且准确。但如果图像尺寸发生变化,像素位置差异会变大,可能增加学习难度。
因此,需要将距离归一化,例如表示为“中心点位于图像宽度从左侧开始 40% 的位置”。
语音数据的预处理更加多样。分词方式、傅里叶变换等处理方法的差异都会影响训练结果。
数据准备贯穿整个开发过程
数据准备并不一定要在最初阶段就完全完成。
模型训练后如果已经取得一定效果,但仍然存在部分缺陷,可以通过追加或优化训练数据,并对现有模型重新训练来修正问题。
即使在后期优化阶段,追加合适图像也经常是最有效的改善手段。
因此,与数据相关的评估和优化应贯穿整个开发流程持续进行。只在开发初期关注数据样本问题是不充分的。
4. 模型选择
通常,即使要实现相同功能,也会存在多个候选模型。不同模型在精度和计算速度方面具有不同特点。
模型主要通过学术研究、企业公开竞赛等方式被提出和改进。因此,开发者需要持续关注 AI 新模型相关论文和文章。
同时,积累和分析已有模型也非常重要。下表列出各类功能中相对优秀的模型结构示例。
| 模型类型 | 模型名 | 效果 | 速度 |
|---|---|---|---|
| 检测模型 | yolov5 | 精度高 | 中等 |
| 检测模型 | ssd | 精度中等,对小目标识别能力一般 | 快 |
| 关键点检测模型 | mtcnn | 精度一般,可检测关键点较少 | 快 |
| 关键点检测模型 | openpose | 精度高,可检测关键点较多 | 中等 |
| 相似度比较模型 | resnet18 | 精度高 | 快 |
| 相似度比较模型 | resnet50 | 精度高、鲁棒性强、抗干扰能力高 | 中等 |
| 分割模型 | mask-rcnn | 精度中等,可分割图像中的不规则物体区域 | 慢 |
5. 模型训练
具备 AI 开发经验的开发者,可以使用 TensorFlow、PyTorch、Caffe 等自己熟悉的通用框架训练模型。
本公司的开发套件可以将这些框架训练得到的模型转换为 EASY EAI Nano-TB 专用模型。
6. 模型转换
使用 TensorFlow、PyTorch、Caffe 等开发自有模型后,首先需要将模型转换为 RKNN 模型。
通常还需要进行模型量化和预编译,以提高运行效率。