互联网资讯

AI算法工程师的宝贵经验

2024年4月5日 · admin
openmagic ad

近期一直在优化部署模型,最近又接到新需求,需要重新训练一些模型。借此机会把以往训练阶段的笔记整理成文,供后续参考。需要强调的是,这仅是个人经验总结,除了训练过程,还有不少部署细节尚未展开。

训练阶段

1. 算法工程师大量时间用于处理数据:将数据从多个源拷贝到统一目录、筛选质量较差的数据、对数据重新命名或增加前缀以便区分特性(如多尺度或不同增强策略)。这些工作往往需要重复多次,建议集中管理并写成脚本,Python、Shell 脚本或 Jupyter Notebook 都适用,方便日后调用。

2. 不清楚数据来源和可靠性时,可先用简单命令进行初步筛选,如 find ./ -size -1k -exec rm {} +,用于删除过小的损坏图片等。很多时候并非所有数据都符合要求,提前筛选能减少后续处理难度。

3. 并非所有数据都带有标注信息。当有预标注的人力时,可以先给数据打上初步框以供标注人员复核或补充。预标框的效果与训练策略相关:可先用小模型预测再打框,或让已有模型辅助打框;但要注意,标注人员在有预标框的数据上质量有时反而下降,需要监督以确保后续模型精度。

4. 模型评估不仅关心指标,还要考虑实际场景:对于检测模型,输出框的阈值会影响召回与精准度之间的权衡,不同场景需要不同的阈值设置。理论指标如 loSS、MAP 与实际表现有关系但并非绝对,需结合应用场景综合判断。

5. 遇到 badcase 时,简单地增加容量未必有效,因为 badcase 往往与场景强相关。可通过收集场景相关的 badcase,或从用户反馈中获取,用当前模型在相关查询上进行检测并筛选低置信度的样本,逐步构建更具针对性的数据集。

6. 测试集的重要性不言而喻:测试集不应来自训练集的切分,测试集应尽量代表真实场景。验证集用于判断是否过拟合,但并不直接代表实际水平;若没有独立的测试集,可通过评估 loSS 的稳定性来辅助判断。通常情况下,除 DEMO 场景外,模型不会因为图像增强分布的变化而过拟合,但要避免在训练中泄露测试信息。

7. LOss 与准确率并非正相关关系,低 LOss 不一定意味着高 MAP,LOss 的波动是正常现象。需要综合考虑场景及评估指标,避免以单一指标判断模型好坏。

8. 计算检测模型的 MAP 时,实际计算通常不受阈值限制;但需要设定最大检测目标数 Max_nuM(如 100、500、5000 等),以便对分数进行排序并计算。若需可视化结果,可以设定分数阈值(如大于 0.2)来筛选框,最后记得应用非极大值抑制(NMS)。

9. 测试转换后的模型时,输入图像的一致性至关重要:像素值范围、通道顺序(RGB)、是否有假彩色、输入尺寸、填充策略、是否需要对齐到 32 的倍数、边界约束等都需严格保持一致,以确保评估的一致性和推理精度。

10.上线部署方面有多种路径:如 PyTorch + Flask 直接部署在 Docker 中、使用 LibTorch、TensorRT 等;如果关注离线高精度且不需要实时性,可以使用 Flask + Docker 的服务组合;若需要极高实时性,则需在设计阶段就考虑推理框架与服务器端部署,如 TensorRT + Triton Inference Server 等。具体选择要结合精度、延迟、场景实时性等因素。

部署阶段

1. 重新强调训练集、验证集和测试集在实际中的角色:训练集像作业,验证集像模拟试卷,测试集像正式考试的题卷。训练后如需评估,最好先进行自测,然后再用测试集评估。测试集应与训练批次不同,以保持未知性;不要让测试集参与训练过程,以防信息泄露。验证集用于调整超参数,但最终测试集的信息应在最后才暴露。

2. 数据质量直接决定模型表现。初期可通过修改模型结构提升性能,逐步加强注意力、引入更多特征或结构创新来提升精度。但提升泛化能力需要更多高质量训练数据,因为真实场景中的 badcase 往往在初期数据中缺失。数据增强和图像生成对模拟真实场景也非常关键,需尽可能让增强后的分布接近测试集分布。

3. 当存在两个数据集 A 与 B,且 A 的标签仅在 a、B 的标签仅在 b 时,直接用这两个数据集训练会有困难。可通过以下几种方式解决:1) 分别训练检测 a 与检测 b 的模型,在对方数据集上进行预测打标签,构建新数据集后继续训练;2) 采用蒸馏,将两模型的软标签用于训练新的模型;3) 修改 LOss,使对缺少某类别 GT 的图片,该类别损失为 0,从而不把该类别当作背景;4) 在模型尾部设计分离的 head,一个用于检测 a,一个用于检测 b,使 Backbone 变成特征提取器,以便并行处理两种检测任务。

4. 实际工作中,常需要通过已有模型筛选新模型的训练数据,例如用已训练的检测模型筛选出包含某类别的图像,进而用于新模型的训练。这时可以搭建一个小服务来实现此流程;也可以复用已有模型的代码与参数,提升工作效率。通常采用 Flask + PyTorch 的组合来实现,遇到高并发时需做容量与吞吐优化,离线场景下也可采用相对放宽的设置来保障效率。

5. 目前较为成熟的目标检测框架仍以经典、使用广泛、部署友好的为主。单阶段框架如 SSD、YOLOv2-V5、FCOS、CornerNet、CenterNet,以及基于 Transformer 的 DETR 等都可通过 TensorRT 进行部署。选择应结合数据特征、速度要求和是否支持动态尺寸等因素,切勿盲目追求最强模型,而要匹配数据与应用场景的特点。