墨享 AI 4 维评分怎么做的?
OpenCV 端侧推理的技术实现
用 OpenCV 4.9.0 + 离线 OCR 在手机端给手写笔记打分,每个用户的图片从头到尾不上传服务器。
为什么做这件事
手写笔记是最难被"算法看见"的内容形态。它不像选择题有标准答案,也不像代码可以编译检查。一张手写笔记好不好,取决于笔画工不工整、纸面整不整洁、行距留白合不合理、信息密度够不够——这 4 个维度,每一个都需要视觉理解能力。
我们最初尝试过调用云端 OCR API 拿坐标,效果不错但代价是用户的图片要上传到第三方服务器。这对学生用户、笔记隐私敏感的用户、还有离网环境下使用的用户都不友好。于是决定走一条更难的路:全部在手机端做。
4 个评分维度的定义
我们用 4 个独立的评分维度(每个 0-25 分,总分 0-100):
- C1 文字(笔画工整度):用 OpenCV 的轮廓检测提取笔迹,分析笔画的横平竖直、转折圆润度、笔锋连贯性。OCR 模块同时给出字符识别置信度,作为辅助信号。
- C2 物理(纸面整洁度):检测涂改痕迹、污渍、折角、噪点。通过形态学运算和连通域分析,量化"非文字像素"占比。
- C3 排版(行距留白):投影分析得到行间距方差,检测段落留白比例,识别是否对齐(左右边距是否整齐)。
- C4 密度(信息量):单位面积内的有效信息字符数。避免极端值——太稀疏(白本)和太密集(挤成一团)都扣分。
技术栈与流程
Android 端,Java/Kotlin + OpenCV 4.9.0 Android SDK + Tesseract OCR(本地训练数据,chi_sim + eng)。完整流程:
- 图像预处理:灰度化 → 自适应阈值二值化 → 倾斜校正(霍夫变换)
- 版面分析:连通域 + 投影得到文字行区域
- 行内分析:得到单个字符的 bbox
- OCR 识别:每个字符走 Tesseract,拿到文本 + 置信度
- 4 维评分:上述独立模块各自输出 0-25 分
- 加权汇总:总分 = Σ 维度分;可配置权重(v1 默认均权)
全流程在 Android Worker Thread 跑,从不联网。一张 A5 笔记(约 1500×2000 像素)端到端耗时约 1.2-2.5 秒(中端机型,骁龙 7 系)。
踩过的坑
坑 1:彩色笔记会失败。二值化对纯黑墨水很稳,但遇到荧光笔、彩色水笔、彩铅就直接乱套。第一次跑出来有人用马克笔画彩虹笔记,OCR 字符全识别错。后来加了"前景色统一到深色"预处理,对纯文字场景不影响,对色彩场景就提示用户换笔记。
坑 2:网格纸和田字格干扰排版评分。原版 C3 排版评分会把网格线当成"内容",导致网格纸笔记分虚高。修复:先用形态学闭运算去掉细网格线再评分。
坑 3:低分辨率照片评分波动大。手机拍屏幕 500 万像素以下,笔画细节丢失,C1 分数不稳定。修复:检测照片分辨率,低于阈值时引导用户重拍或裁切。
坑 4:竖排文字与英文混排。Tesseract 对竖排不友好,对中英混排识别率也会掉。修复:先用投影判断是横排还是竖排,分情况走不同的 OCR 参数。
为什么坚持端侧
这是个反复被挑战的决策。每次有人提"云端大模型评分更准",我们都顶回去了。原因有 3 个:
- 隐私:学生笔记可能包含个人信息、考试内容、家长对话引用。这不是"数据敏感",是"绝对不能离开用户手机"。
- 成本:云端推理按调用次数计费,日活过 1 万就烧得离谱。学生付费能力有限,必须把成本压在免费档。
- 体验:离线可用是核心场景——图书馆、地铁、教室 WiFi 不稳定。端侧推理完全不受网络影响。
代价是评分精度比云端大模型差一截。我们接受这个 trade-off,把端侧作为底线,把云端作为未来可选增强(用户主动开启、明确授权后再上传)。
我们学到的
端侧 AI 评分不是"次优解",是"另一类解"。它牺牲了绝对精度,换来隐私、离线、成本三个硬优势。对学生这个用户群体,这套 trade-off 是更合适的选择。
未来方向:把 4 维评分变成可解释的——每张笔记打分时附带"哪几个区域被扣分、为什么扣分",让用户能照着改进。这比"AI 给你一个总分"有用得多。
我们也在实验用更小的端侧模型做风格分类("印刷体 / 行书 / 草书"),给 C1 评分加一个"书写风格稳定性"维度。这是下一个迭代要做的事。
关于本文:作者 Eric Wang,云汉科技创始人。本文为技术随笔,方法与数字均来自墨享 InkShare v1.2 实际实现。