一次实战落地的计算机视觉项目:从需求模糊到线上稳定运行
引子:为什么是这个项目值得分享?

刚加入公司不久时,我参与了一个计算机视觉相关的实际项目。当时项目的背景是公司想在一款面向制造业客户的智能质检系统中嵌入一个缺陷检测模块,用于代替人工肉眼识别产品表面是否有划痕、气泡、色差等问题。
这个项目听起来不复杂:图像识别嘛,CNN(卷积神经网络)就完事了,但真正干起来才发现,现实和理想的距离,不只是数据量的问题。
整个项目历时3个多月,经历了需求模糊、数据匮乏、模型调参失败、线上部署卡顿等一系列“折磨”,最终顺利上线。这篇文章我想从一名普通AI开发者的角度出发,聊聊这次真实的项目经历,希望对同样在一线战斗的你有所启发。
项目背景:从零开始的“质检大脑”


我们服务的主要客户是一家手机壳制造厂。他们每天要手工抽检数万件成品,质检员盯着灯光下一个个产品,凭经验判断是否存在瑕疵。效率低、容易疲劳、误检漏检的情况时常发生。
客户提出的需求也比较模糊:“能不能做个能自动识别不良品的系统?”没有明确说明具体缺陷类型,没有标注数据,甚至连拍照设备都还没确定下来。
我们的目标是搭建一套自动化质检平台,使用摄像头拍照后,通过图像识别算法实时检测出有缺陷的产品,并分类标记。虽然看起来像是一个标准的工业质检应用案例,但做起来远没那么轻松。
遇到的第一个挑战:数据从哪来?

数据问题比预期严重得多
一开始我就意识到最大的问题是数据不足。客户说:“我们不是一直在拍照吗?你们拿照片来训练不就行了?”
结果拿到的数据让我有点崩溃:
- 拍照环境不统一:不同时间、不同光照条件下的图片差异大。
- 缺陷样本极少:几千张图里只有一两百张是有缺陷的。
- 标注全无:完全没有边界框或语义分割标签。
也就是说,我们需要自己设计采集流程、协调产线资源重新拍摄数据、再进行标注。这对原本只想负责模型训练的我来说是个意外的“加餐”。
解决方案:边建数据集边迭代模型
我们决定采用“双线并行”的方式推进:
与产线协作建立标准化采集流程
我们联合产线技术团队,定制了一套简单的拍摄装置:固定相机位+环形灯,确保每次拍照的尺寸、分辨率和光照一致。先快速打标少量样本跑原型
利用LabelImg工具手动标注了100多张正负样本,训练了一个初步版本的Faster R-CNN,虽然准确率只有60%左右,但至少有了一个可展示的效果。基于原型反馈优化采集和标注重点
客户看效果后提出了一些新发现的缺陷类别,比如“边缘变形”、“颜色偏黄”等之前未被注意到的问题。我们随即调整采集策略,在后续采集中有针对性地收集这些类别的数据。
这一步让我意识到:图像质量控制和数据预处理其实是整个CV项目中最关键的一环,甚至比模型本身还重要。
算法选型与调优:从“跑通”到“可用”

模型选择的考虑
初始阶段尝试了几个主流目标检测模型:
| 模型 | 优点 | 缺点 |
|---|---|---|
| Faster R-CNN | 检测精度高 | 推理速度慢,不太适合生产线上的实时场景 |
| YOLOv5 | 推理速度快,支持自定义训练 | 对小缺陷敏感度较低 |
| SSD | 均衡型模型 | 准确率不够理想 |
最终我们选择了YOLOv5作为主模型架构,因为它能满足实时性的要求(每秒大约3帧),并且经过微调后可以达到80%以上的平均精度(mAP)。同时我们也保留了Faster R-CNN作为离线质检的后备方案。
小插曲:第一次部署YOLOv5到工控机上,由于算力不足加上代码逻辑没优化好,延迟高达4秒。后来发现有个同事把推理过程写在主线程里,而且用了PIL做图像解码——这简直是灾难。改用OpenCV + 多线程异步处理后,问题才解决。
图像增强与难例挖掘
缺陷样本太少,是我们最大的瓶颈。为了解决这个问题,我们做了两件事:
数据增强
使用Albumentations库进行了一系列图像增强操作:随机亮度变换、对比度拉伸、椒盐噪声添加,甚至仿射旋转(模拟拍照角度误差)。难例挖掘机制
在每一轮训练后,我们手动筛选一批“模型预测错误”的样本重新标注并加入训练集中。
这两个手段显著提升了模型泛化能力。特别是难例挖掘带来的提升非常直观——mAP从72%提升到了83%。
模型评估与指标优化
光有mAP还不够,我们还要衡量模型是否真的能解决问题。于是设定了以下几个关键指标:
| 指标 | 计算方式 | 作用 |
|---|---|---|
| Precision | TP / (TP + FP) | 衡量模型把正常样本错判为缺陷的能力 |
| Recall | TP / (TP + FN) | 衡量模型有没有漏掉真正的缺陷 |
| F1 Score | 2 * (P * R)/(P + R) | 综合精度与召回,适用于不平衡数据 |
| 推理延迟 | 单次推理耗时 | 影响生产线节拍,需控制在合理范围 |
客户特别关注的是Recall,因为宁可误报也不能漏检。所以我们在损失函数中引入了Focal Loss以提高召回率,并且适当降低了置信度阈值。
心得:业务指标和模型指标有时并不完全一致,理解客户的优先级非常重要。
上线部署与稳定性问题

模型训练好了,接下来是更头疼的部分:如何把它部署到生产环境中去。
工控机上的部署限制
客户使用的是一台老旧的工控机,配置如下:
- CPU: i5 四核
- 内存: 8GB
- GPU: Intel HD Graphics 620(无CUDA支持)
- 系统:Windows Embedded Standard 7
这意味着不能直接使用PyTorch模型来做推理。我们采用了两种方案:
ONNX格式导出 + OpenVINO加速推理
- 将YOLOv5模型导出为ONNX格式
- 使用OpenVINO的CPU执行引擎加速
- 性能提升约3倍
简化模型结构
- 移除不必要的NMS操作
- 对输入图像进行降采样(从640×640降到480×480)
此外,为了避免因图像质量问题造成误检,我们加入了图像预处理流水线,包括白平衡调整、Gamma矫正等步骤。
实际运行中的“坑”
- 内存泄漏:最初版本在持续运行一段时间后出现内存溢出,后来发现是一个图像缓存队列没有及时释放。
- 光源波动影响识别率:后期发现晚上车间灯光强度变化会导致图像变暗,部分缺陷无法识别。解决方案是在相机端设置曝光补偿,并在软件中加入自动白平衡修正逻辑。
- 模型冷启动问题:刚启动时需要等待模型加载完成才能进入工作状态。我们将模型初始化放在开机脚本中异步加载,并配合健康检查接口实现无缝切换。
成果总结:从人工质检到智能替代
项目上线两个月后,我们整理了一份报告,以下是核心数据对比:
| 指标 | 上线前 | 上线后 |
|---|---|---|
| 日均质检数量 | ~6000件 | ~9000件 |
| 误检率 | N/A(纯人工) | < 5% |
| 漏检率估算 | ~3% | < 1% |
| 人力成本 | 2名专职质检员 | 无人值守 |
| 整体效率 | 受限于人眼反应 | 稳定节拍输出 |
客户非常满意,甚至主动帮我们申请了一个创新奖项。对我们来说,除了看到技术落地,更重要的是收获了宝贵的实战经验。
干货经验总结:给准备入手CV项目的你
结合这次项目,我想给正在或者将要做图像识别项目的同行几点建议:
1. 别急着跑模型,先搞定数据
数据永远是第一位的。没有好的数据,再强的模型也无济于事。尤其是工业场景,真实缺陷样本稀少、标注困难是常态,务必预留足够的时间去做数据工程。
2. 尽早介入现场,多和产线沟通
我们曾一度忽略了“现场实际情况”。例如摄像头安装位置是否遮挡、产品摆放姿态是否多样等,都会直接影响模型表现。建议在前期调研时多去现场看看,最好亲自拍照测试一下。
3. 模型不是越大越好,适配硬件才是王道
别盲目追求最新模型。我们一开始尝试过YOLOv8,结果推理太慢根本用不了。根据实际设备情况选择合适的模型架构非常重要,必要时可以牺牲一点精度换取性能。
4. 不要忽视前后处理和整体流程
图像识别不仅仅是调个模型。图像质量、预处理流程、异常处理、用户反馈闭环缺一不可。往往一个小细节就能让效果翻车。
5. 上线之后才是真正考验的开始
训练模型只是第一步,部署后的日志分析、异常监控、客户反馈跟踪同等重要。建议提前搭建好可视化日志面板和报警机制。
最后的话:技术落地,贵在坚持
这场实战项目虽然过程中遇到不少挫折,但回顾起来,每一次“踩坑”其实都是成长的机会。特别是在工业质检这种看似传统却充满机会的领域,人工智能的赋能空间还很大。
如果你也在做类似的项目,不妨把每一个“不可能”当作挑战,保持耐心和热情,你会发现那些曾经让你抓狂的问题,终将成为你职业生涯中闪光的记忆。
愿你在自己的AI征程上,也能收获属于你的“完美缺陷检测时刻”。

评论 0