产线 OCR 实战:Ollama 本地视觉模型部署与踩坑
背景:产线要认字,传统 OCR 先翻车
产线提了个需求:读 SN 码、批次标签、仪表读数。传统 OCR(Tesseract、OpenCV)对打印工整的字体还行,一到现场就露馅——标签脏污、反光、倾斜、字体变形,识别率直线掉到八成以下,误读的 SN 码一旦绑错产品就是质量事故。上云 OCR 呢?产品 SN、批次号属于生产数据,合规上就不允许出内网。两条路都堵死,剩下的方案只有一个:本地部署视觉大模型。
解决思路:Ollama + Qwen2.5-VL,数据不出厂
选型逻辑不复杂:
- 本地部署:模型跑在内网服务器,图片不出厂,合规无忧,断网也能用;
- 视觉模型选 Qwen2.5-VL 7B:中文识别能力强,显存要求低(8G 显卡即可跑),对脏污、倾斜标签的鲁棒性远好过传统 OCR;
- 服务化封装:Ollama 提供 HTTP 接口,Python 封装成识别服务,结果再上报 MES,与设备对接链路完全复用。
第一步:部署 Ollama 并拉模型
服务器装好 Ollama 后直接拉模型,7B 量化版大约 5~6GB:
ollama pull qwen2.5vl:7b
第二步:调用接口——注意最大的坑
先手动验证一次,确认模型能出结果再写代码。这里有个大坑:多模态必须走 /api/generate,走 /api/chat 会直接 400——chat 接口对视觉模型的图片参数兼容性差,报错还不明不白。图片要转成 base64 放进 images 数组:
import base64, json, urllib.request
def ocr(image_path: str, prompt: str = "识别图中SN码,只输出字符,不要解释") -> str:
with open(image_path, "rb") as f:
b64 = base64.b64encode(f.read()).decode("utf-8")
body = json.dumps({
"model": "qwen2.5vl:7b",
"prompt": prompt,
"images": [b64],
"stream": False
}, ensure_ascii=False).encode("utf-8")
req = urllib.request.Request(
"http://127.0.0.1:11434/api/generate", data=body,
headers={"Content-Type": "application/json"}, method="POST")
with urllib.request.urlopen(req, timeout=120) as r:
return json.loads(r.read().decode("utf-8"))["response"]
响应里的 response 字段就是模型输出。生成类任务建议 stream: False 一次性拿全量结果,省去流式解析的麻烦。
第三步:让输出可编程
模型默认会带解释文字("图中的SN码是……"),直接进 MES 就是脏数据。提示词里要求 JSON 输出,再解析:
prompt = '识别图中SN码,只输出JSON:{"sn": "识别结果", "conf": 0到1的置信度}'
识别结果低于置信度阈值(比如 0.7)就不自动入库,转人工确认——OCR 出错不可怕,可怕的是错得理直气壮。
第四步:对接 MES
识别服务起一个 Flask/FastAPI 小接口,产线工位把图片传上来,服务识别后按设备上报协议写回 MES(幂等键、时间格式这些约定直接复用设备对接那套,避免再造一套轮子)。
踩坑记录:五个真实案例
- /api/chat 对视觉模型直接 400:多模态图片参数必须走 /api/generate,这是最坑的一条,报错信息抽象,官方文档也不明显;
- 图片不压缩,识别又慢又超时:相机原图动辄几 MB,base64 再膨胀三分之一,7B 模型在 8G 显存上要跑几十秒。先压缩到长边 1280、JPEG 质量 85,速度能翻倍;
- 8G 显存一次只能跑一个请求:并发一上来直接 OOM 或排队到天荒地老。识别服务用队列串行化,工位请求排队处理,HTTP 超时放宽到 120 秒;
- 脏污标签识别率问题:提示词里写明"忽略污渍、反光",配合压缩和裁剪 ROI 区域,识别率能回到 95% 以上;
- 中文与特殊字符混排:SN 码常有连字符和数字混排,提示词明确"只输出字符,不加空格和标点",否则模型会自作主张格式化。
总结
本地视觉模型做产线 OCR 的路线已经跑通:Ollama 部署 + /api/generate 传 base64 + 提示词约束 JSON 输出 + 置信度兜底人工。相比上云方案,换来的是数据不出厂和断网可用;代价是显卡预算和并发上限。对中小产线来说,一张 8G 显存的显卡换掉人工抄码,这笔账怎么算都划算。