加载模型

唐志强
2025-06-24 09:24
阅读 669

从0到上线:我在工业质检中落地计算机视觉实战项目的心路历程

开篇:为什么分享这个故事?

两年前,我所在的公司接手了一个工业质检相关的外包项目。客户是制造业的一家中型企业,生产的产品涉及精密机械部件,表面划痕、凹坑等问题直接影响产品质量和后续组装。他们希望能通过计算机视觉手段实现自动化检测,替代过去依赖人工目测的流程。

作为一个技术负责人,我最初的想法其实挺“理想化”的——无非就是训练一个目标检测模型,部署后做图像推理罢了。但随着项目的深入,我发现现实远比理论复杂得多。从数据采集、标注困难,到模型泛化能力差,再到现场环境的不确定性……这一路上踩过的坑至今回想起来都心有余悸。

今天,我想用第一人称的方式,把这段真实的经历记录下来,也希望能给正在或即将步入类似项目的朋友一些启发与帮助。


问题描述:从需求到现实之间有多远?

我们的目标听起来很清晰:

对特定型号的金属零部件进行自动外观缺陷检测,准确率要达到98%以上,支持批量处理,并可嵌入现有产线系统。

但在实际操作过程中,我们遇到的第一个问题是数据质量差。客户能提供的样本图片只有不到200张,而且这些图大多是从产线上随手拍下来的,分辨率不一、角度不同、光线混乱,甚至连有没有缺陷都不确定。

更糟糕的是,他们的产品在生产过程中还会有一些微小的批次差异(例如颜色深浅变化),这对模型学习造成了很大干扰。

再往下走,当我们初步完成模型训练后,在验证集上表现还不错,但一放到产线上模拟运行时就频频出错。我们很快意识到,现场的光照、相机角度、背景杂乱程度等变量完全超出了我们在实验室能模拟的范围。


解决方案:构建一个灵活可用的CV质检系统

面对上述挑战,我们决定采用一个渐进式优化+模块化设计的策略来推进整个项目:

第一步:数据增强与半监督标注

我们先从数据入手。既然客户无法提供更多高质量数据,那就自己想办法生成!

我们做了几个尝试:

  1. 合成数据:使用OpenCV手动模拟各种光照、反光、划痕、污渍等效果;
  2. 图像风格迁移:尝试用CycleGAN将已有少量“标准照”迁移到不同光照条件下的版本;
  3. 主动学习辅助标注:我们将已训练好的模型预测结果输出为可视化报告,提供给客户产线人员进行人工复核,从而快速补全更多有效数据;
  4. 多视角融合:后期我们升级了硬件系统,加装多个摄像头从不同角度采集同一物体,增强信息完整性。
第二步:选择合适的模型架构

神经网络结构图-2

一开始我们尝试YOLOv5,但发现它对细微缺陷的识别能力不够强,尤其是在边缘模糊的情况下容易漏检。我们转而尝试Faster R-CNN + Swin Transformer Backbone组合,在保持精度的同时提升了模型鲁棒性。

不过模型过大导致推理速度慢成了新问题。为了平衡速度和准确性,我们最终选用了YOLOv8n加上TensorRT加速推理,配合轻量级预处理pipeline,既保证了速度又控制了误判率。

第三步:部署方案的设计与实现

部署是我们最容易忽视但也最关键的一环。我们选择了以下结构:

Web API (Flask) -> Inference Engine (ONNX Runtime / TensorRT) 
    -> 客户端接收JSON结果 -> 集成至PLC控制系统

这样设计有几个好处:

  • 易于维护和扩展(比如替换模型)
  • 支持远程调试和日志追踪
  • 可以直接对接原有生产线控制软件

另外,考虑到工厂现场网络可能不太稳定,我们还做了离线缓存机制,当网络断开时临时存储待检图像并在恢复连接后继续上传结果。


代码实践:关键部分示例展示

下面是一段简化版的预处理和推理调用核心逻辑:

import cv2
import numpy as np
from ultralytics import YOLO

model = YOLO("runs/train/weights/best.pt")

def preprocess(img_path):
    img = cv2.imread(img_path)
    img = cv2.resize(img, (640, 640))  # 输入尺寸适配YOLOv8
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    return img

def detect_defects(img_path):
    img = preprocess(img_path)
    results = model.predict(source=img, conf=0.35)  # 设置置信度阈值
    defects = []
    
    for result in results:
        boxes = result.boxes.cpu().numpy()
        for box in boxes:
            x1, y1, x2, y2 = box.xyxy[0].astype(int)
            score = float(box.conf[0])
            cls_id = int(box.cls[0])
            if cls_id == 1:  # 假设1代表划痕,0代表正常
                defects.append({
                    "bbox": [x1, y1, x2, y2],
                    "score": score
                })
    return {"defects": defects}

深度学习框架对比-1

此外,关于推理服务的封装也很关键。我们使用FastAPI搭建了REST接口,便于前后端调用:

from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
import uvicorn

app = FastAPI()

@app.post("/detect")
async def upload_file(file: UploadFile = File(...)):
    with open(f"temp/{file.filename}", "wb") as f:
        f.write(await file.read())
    result = detect_defects(f"temp/{file.filename}")
    return JSONResponse(content=result)

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8080)

踩坑经验:那些深夜里debug出来的教训

1. 数据质量问题远比想象严重

我们一度认为只要训练好模型就能解决问题,但实际上,很多错误其实是数据层面的偏见造成的。后来我们专门花了一周时间做了个“缺陷分布统计表”,才发现某些类型缺陷的数据几乎可以忽略不计。于是我们有针对性地补充了这部分数据,模型性能才真正提升上去。

2. 推理部署时不要只看FPS,要看延迟稳定性

我们曾在测试机上看到每秒处理10帧的画面非常满意,结果现场部署时却发现有时会卡顿超过1秒。经过排查发现,是内存占用过高造成频繁GC。最后我们引入了TensorRT量化+GPU异步执行,才算彻底解决问题。

3. 现场设备的兼容性是个大问题

有些工控机只能跑Windows系统,还不允许安装CUDA驱动;有的只能用USB2.0接口摄像头;还有些老产线连Python环境都没法安装。我们被迫做了三套不同的部署包:一个是Docker容器版,一个是独立的EXE程序,还有一个基于树莓派的小盒子。


效果总结:上线后的收益有多大?

项目交付半年后回访客户,他们反馈以下几个关键指标的变化:

指标 上线前 上线后
检测效率 平均3分钟/件 实时在线
错检率 10%~15% <2%
人力成本 每天需4人巡检 只需1人监控
异常响应时间 >5小时 <10分钟

最让我欣慰的不是这些数字,而是客户告诉我们:“现在我们可以提前知道哪一批次可能出现问题,甚至还能做趋势分析预警,这是我们以前根本做不到的。”


经验分享:几点来自一线战场的建议

✅ 建议1:尽早定义好什么是“问题”

很多时候,团队内每个人对“合格品”、“缺陷”的认知并不一致。最好一开始就和业务方一起拉出一份明确的缺陷分类表,包括但不限于缺陷类型、大小要求、容忍误差范围等。

✅ 建议2:不要急于追求SOTA,实用优先

很多人一上来就想用最新的ViT、SAM之类的大模型,但往往忽略了工程上的可行性。在工业场景下,稳定性和延时控制比模型参数量更重要。

✅ 建议3:建立完善的异常上报和闭环机制

系统不可能做到100%完美。我们专门做了个UI页面,供现场员工点击“标记误判图像”。这些反馈会被定期同步到模型训练集中,形成持续迭代。

✅ 建议4:关注运维而非只是开发

写完代码只是开始,如何远程监控服务状态、模型是否退化、设备是否过热、网络是否中断?这些问题如果不在前期设计阶段考虑进去,后面会付出成倍代价。


写在最后:技术之外的思考

回顾整个项目,最大的收获不是学会了哪个模型调参技巧,也不是掌握了哪种部署方式,而是一种“从用户痛点出发的技术思维”。

在这个AI满天飞的时代,真正有价值的并不是你用了多么炫酷的算法,而是你能否把一项技术落地到真实业务中去解决具体的问题。这中间需要大量沟通、折中、妥协,以及不断试错。

如果你也在做一个CV实战项目,不妨问问自己:这套系统真的能帮客户省时间、降成本、提质量吗?

愿你在通往技术落地的路上少走弯路,多点温度。

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝