从数据到训练到部署AOI 项目的踩坑全记录开头每个坑都是一次「学费」你有没有过这种经历每个坑都是一次「学费」。有的坑值 100 块有的坑值 1000 块有的坑值 10000 块。AOI 项目踩了无数坑。我把这些坑整理成了 10 条铁律每条配一行代码示例。可以打印出来贴在工位上。不是因为坑有多深——而是因为「避坑」是最高效的学习方式。一、数据篇踩坑坑1OBB 角度 约90 度 误当 C 倾角旋正# 错误把 OBB 角度当 C 倾角angle_rad1.57# 约90度ifabs(angle_rad)0.03:# 2度rotate_image(image,angle_rad)# 97% 样本被误旋# 正确先折算水平倾角horizontal_tilt(angle_radmath.pi/2)%math.pi-math.pi/2ifabs(math.degrees(horizontal_tilt))2:# 只旋正小倾角rotate_image(image,horizontal_tilt)影响97% 的样本被误旋芯片从横放变成竖放。坑2训练集和验证集有重叠# 错误随机划分时没有去重train_imgsall_imgs[:800]val_imgsall_imgs[800:]# 可能有重叠# 正确按文件名去重后划分train_imgsset(all_imgs[:800])val_imgsset(all_imgs[800:])-train_imgs# 确保无重叠影响模型「背答案」训练集 99%产线 80%。坑3类别不平衡# 错误不看类别分布# 训练集a_chip 1000张c_broken 10张# 模型学到所有样本都是 a_chip# 正确查看类别分布平衡采样fromcollectionsimportCounter labelsCounter()forlabel_fileinglob(labels/*.txt):withopen(label_file)asf:forlineinf:clsint(line.split()[0])labels[cls]1print(labels)# {0: 1000, 1: 10} - 类别1太少影响c_broken 完全不检漏检严重。二、训练篇踩坑坑4EarlyStopping 停在 epoch1# 错误用 best.pt 做验收best_modelYOLO(runs/train/weights/best.pt)# epoch1 的权重# 正确用 last.pt 做验收last_modelYOLO(runs/train/weights/last.pt)# 最后一个 epoch 的权重影响best.pt 是 epoch1 的权重没有充分训练。坑5从错误的 run 续训# 错误从 V2 的 run 续训 V4modelYOLO(runs/train/v2/weights/best.pt)# 数据集版本不匹配# 正确从同版本的 run 续训modelYOLO(runs/train/v3/weights/last.pt)# V3 last - V4影响数据集版本不匹配模型学到了错误特征。坑6AMP 导致 NaN# 错误默认开启 AMPmodel.train(ampTrue)# 训练到一半出现 NaN# 正确工业场景关闭 AMPmodel.train(ampFalse)# 用 FP32 训练稳定影响训练中断浪费时间。三、导出篇踩坑坑7IR 版本过高# 错误用默认 IR 版本exportedmodel.export(formatonnx)# IR11旧 ORT 加载失败# 正确手动锁定 IR 版本onnx_modelonnx.load(str(exported))onnx_model.ir_version8# 锁定 IR8onnx.save(onnx_model,str(exported))影响C 加载 ONNX 失败。坑8FP16 精度损失未验证# 错误直接用 FP16 导出不验证精度exportedmodel.export(formatonnx,halfTrue)# 可能有精度损失# 正确用 FP32 对比验证exported_fp16model.export(formatonnx,halfTrue)exported_fp32model.export(formatonnx,halfFalse)# 对比两个模型的精度确认 FP16 没有精度损失影响FP16 精度损失产线精度下降。四、部署篇踩坑坑9Python 和 C 预处理不一致# 错误Python 和 C 用不同预处理# Python: RGB, /255# C: BGR, /127.5 - 不一致# 正确统一预处理# Python: RGB, /255, mean0, std1# C: RGB, /255, mean0, std1影响推理结果错误。坑10BGR/RGB 搞反# 错误没有转 RGBimgcv2.imread(image_path)# BGR# 直接喂给模型没有转 RGB# 正确先转 RGBimgcv2.cvtColor(img,cv2.COLOR_BGR2RGB)影响推理结果错误。五、避坑清单总结----------------------------------------------------- | 10 条铁律打印贴工位 | ----------------------------------------------------- | 1. OBB 角度 不等于 C 倾角先折算再旋转 | | 2. 训练集和验证集不能有重叠 | | 3. 查看类别分布平衡采样 | | 4. 用 last.pt 做验收不用 best.pt | | 5. 续训时确保数据集版本一致 | | 6. 工业场景关闭 AMPampFalse | | 7. 导出 ONNX 时锁定 IR8 | | 8. FP16 导出后验证精度 | | 9. Python 和 C 预处理必须一致 | | 10. BGR 要转 RGB 再喂给模型 | -----------------------------------------------------六、系列总结这个系列从「pip install ultralytics」开始到「产线 C 部署」结束覆盖了深度学习落地的完整链路环境搭建 - 数据准备 - 模型选择 - 模型训练 - 模型导出 - 模型验证 - 数据增强 - 微调续训 - 产线部署 - 踩坑总结核心思想深度学习不难难的是「从零到一」的每一步都有坑。避坑清单可以帮你跳过 80% 的坑。AOI 项目优秀实践完整的踩坑归档每个坑都有详细记录和解决方案版本化的错误产物管理错误产物放在_bad_rot90_20260718/不会误用三级验证体系裁图 - Holdout - E2E层层递进AOI 项目可改进之处缺少踩坑搜索工具没有自动化的踩坑查询缺少新人避坑培训新人需要自己踩坑才能学会缺少踩坑可视化没有踩坑热力图结尾说回那个「每个坑都是一次学费」的故事。后来我把这些坑整理成了 10 条铁律打印出来贴在工位上。新人来了先看这 10 条可以跳过 80% 的坑。不是因为坑有多深——而是因为「避坑」是最高效的学习方式。翻翻你的项目你踩过最深的坑是什么值多少钱你有避坑清单吗还是每个坑都要自己踩一遍你会把这些坑教给新人吗还是让他们自己踩评论区说说你踩过最深的坑以及你是怎么解决的。觉得有用收藏整个系列下次遇到问题时翻出来对照。转发给你团队里那个天天踩坑的同事。系列完结。感谢你跟着我走完了这十篇。从「pip install」到「产线部署」从理论到实战从踩坑到避坑。如果这个系列帮到了你留言告诉我。我会根据反馈决定要不要开下一个系列。本文是《深度学习基础知识与实战技术栈》系列第十篇终篇。全系列目录篇标题01深度学习实战开篇从 pip install 到训练出第一个模型02数据准备模型训练 80% 的时间在搞数据03模型选择YOLOv8/v11/v12 选型指南04模型训练model.train() 两行代码背后藏着多少坑05模型导出ONNX 是产线部署的通行证06模型验证训练准 ≠ 产线准07数据增强100 张图训出 1000 张的效果08微调与续训站在巨人肩膀上09产线部署.onnx 到 C 的最后一公里10实战踩坑录10 个血泪教训
