一个人开发扫描王之技术篇之图像切边

📅 2026/7/11 11:44:49
一个人开发扫描王之技术篇之图像切边
对于检测同一张“缺角”的并处在杂乱背景中的文档。从左到右分别是3亿人都在用的扫某王的效果阿里高P带队的夸克的效果最后是你们不知道的《扫描仙人》的效果所有扫描类的软件第一个要解决的问题就是从照片中识别出文档的位置。虽然目前物体检测算法已经比较成熟了但我在开发过程中仍然踩了一些坑今天一并分享出来。我是在2024年开发的这个功能我认为首先需要排除的方法就是“完全基于轮廓检测的图形学方法”和“完全基于大模型的端到端方法”。“完全基于轮廓检测的图形学方法”只能用于边缘清晰背景是纯色的简单情况像下图这种稍微带点杂物的情况就不行了。此类方法虽然局限性很大但仍然有必要了解原理即便现在都用”基于神经网络“的方式去做物体检测了但后处理中仍然需要用到传统的轮廓检测霍夫变换等步骤。论效果“完全基于大模型的端到端方法”肯定是最好的但弊端是需要的训练部署和使用成本都高我一个人肯定是无法承担的更无法满足有隐私需求的用户属于杀鸡用了牛刀。因此我最先使用的方法是先基于类似yolo分割模型大致得到图片中“文档”的位置然后再基于图形学的方法进行后处理。yolo模型可能是现在最容易“训练”的模型被董袭莹小姐的博士论文科普后更是无人不知。为了达到生产效果我自己一共标注了500张图片用blender脚本生成了2000张左右。500张自行标注的数据中涵盖了各类书籍练习册画册试卷医疗单据小票海报等按照形状划分大致包含200张标准的和带有明显透视的边缘清晰的矩形文档。200张书籍尤其是较厚的书籍带有曲面的页面100张精心构造的“疑难杂症”标注比如复杂背景上的文档一张照片中多个文档被遮挡的文档缺角的文档和背景色接近的文档等。用blender渲染的文档主要都是上述第一类情况但背景光照会更为复杂和多样。我试过其实有100多张标注yolo模型就基本可以工作了。但要达到行业一流水平至少得标注500张以上。区区几百张标注就可以工作的奥秘是yolo的数据增强我认为yolo的数据增强比模型要精彩我也借鉴了其中的方法用到了后续模型的训练中。聪明的你应该已经发现了yolo模型得到的只是分割图并不包含“文档”的4个顶点坐标。YOLO-OBB模型虽然可以输出顶点但准确性较差。所以我采用最开始提到的“完全基于轮廓检测的图形学方法”在分割图上计算文档的顶点。yolo官方的分割图边缘非常清晰但实际上文档和背景复杂多样分割的边缘并不会如此完美让我很郁闷的是yolo分割模型得到的结果很可能无法得到近似的四边形也就得不到4个顶点坐标或者文档图像本来就不完整角落被遮挡部分位置在照片外等等。直到我开始开发文档“去扭曲”模型时我才意识到其实根本不必纠结于“精确的文档顶点坐标”得到“精确的文档顶点坐标”不就是为了“反透视”将透视视角下的文档恢复为平面变化嘛。而“去扭曲”模型其实就是AI化的“反透视”变化。因此在《扫描仙人》中文档的4个顶点坐标仅用来框选文档的大致位置并不是精确的。对于文章刚开头“缺角”文档的例子中《扫描仙人》推测的顶点是这样的虽然不准确但这并不影响“去扭曲”的效果既然后面要靠“去扭曲”模型进一步调整所以第一步到底是用分割模型还是用检测模型也就无所谓了。最后在工程上文档检测最复杂的部分应该要属 yolo模型的预处理和后处理改写成手机的native代码了。我在写这一部分代码时deepseek还没出现chatgpt的能力也远不及现在所以开发android native c代码还是花费了点时间的。用这个例子对比了《扫描全能王》和《夸克扫描王》的结果虽然在这个case上侥幸取胜但并不代表《扫描仙人》已经超越了头部玩家。我把《扫描仙人》定位成一款便宜好用的让低频扫描用户不用再承担高额的订阅费。