前言
伴随社会数字化的进程,似乎很多传统实体渐渐淡出我们的视野甚至已经消亡。关于读书方式,关于笔记方式,一遍又一遍地被科技进步颠覆。依稀记得求学生涯搬家时,多次不堪书籍之重负;十几年前,花重金购入了 Kindle Voyage,以为掌握了读书的终极神器;再到后来,渐渐抛弃了 Kindle,拥抱了手机和平板阅读。时至今日,我仍然怀念纸质书籍,它真实的触感和气味,给人一种空间感、沉浸感和亲切感。这种阅读记忆是立体的,深刻的,是我在电子化阅读中一直没有找到的感觉。
不可否认,数字化的便利是无可替代的。虽然我把早年的手写笔记做成了扫描件,更是随着我的电子笔记系统辗转迁移,但最终还是由于难以检索而躺在了「最近访问」的最下层。
我在思考,现在有没有能兼具纸质阅读和数字化笔记的方法呢。我找到了一些朋友们实践,比如:
- 阅读时,直接在书本上做标记,读完后再统一摘抄出来,使用键盘输入摘抄,或语音输入摘抄;
- 边阅读边使用手机 app OCR,如自带相机、白描、Office Lens、Readwise 等应用识别并手动拾取文字;
- 使用智能硬件进行文字摘抄,如扫描笔。
似乎一切方案都不那么完美,要么有点打扰阅读,要么读后的整理工作太繁琐,要么没法摘抄图片。有没有方法可以克服这些问题呢?经过搜索调研,我初步设想了一种使用机器视觉的方法来辅助阅读摘抄。既然是机器视觉,当然还是使用 OCR,但现在的 OCR 方法需要我们「拿起」手机—「端正」手机—手动拾取,目的是提高 OCR 的成功率。所以关键是如何简化该流程,尽可能地实现自动化,最好只需要「随手一拍」,最完美的是「不要拿起手机」。
成果预览——
我现在的目标是解决碎片化的原文摘录问题,关于笔记书写和录入,能在更集中的时间和版面内完成,方法也更简单,暂时不在本文讨论范围。
又,本文不讨论读书方法论,不讨论摘录是否有价值的问题。
问题的关键——扭曲矫正
要提取书摘,首先要提高 OCR 的成功率,但书籍表面往往不是平面,且书籍方向不正,大大降低了 OCR 成功率,后续的文字提取也无从谈起了。即使是白描这样优秀的 OCR 软件,在这样苛刻的工况下,不进行扭曲矫正也难以做到很高的 OCR 正确率。
文档图像的变形有扭曲、褶皱、透视等多种情况,这阻碍了形变图像的信息提取,对下游任务如 OCR 识别、版面分析等任务增加难度。为解决文档弯曲矫正问题,学界业界已有多种方案:
- 利用多目相机,结构光或者激光雷达等专用硬件对文档进行扫描,获得文档表面的 3D 结构信息,进而对文档校正展平。这类方法一般可以得到比较好的校正效果,但依赖专用设备的特点限制了其使用场景,一般应用在高拍仪上。
- 利用显式的几何模型以适应形变文档曲面,依靠图像信息以及文档形变的先验知识对图像进行校正。一般需要进行文字行或者表格线的检测,并假设曲面符合特定的几何约束,如曲面是柱面。其校正效果受文字行检测准确度的限制,对文档版式比较敏感,无法处理存在大量图表的文档,且误检的文字行有可能会对校正造成严重干扰。
- 基于优化的方法,利用损失函数缓慢迭代优化以获得形变矫正结果。
- 数据驱动的方法。训练形变矫正神经网络,学习形变场,得到类似扫描的结果。
总结下来,扭曲矫正解决方案可分为参数化方法及非参数化方法。参数化方法构建了低维数学模型,只能处理简单场景;非参数化方法一般需要建立成对数据集。在2024年,我们当然首先要尝试一下基于深度学习的方案,包括了 DewarpNet、DocGeoNet、DocTr、DocTr++ 等等,这些工作多关注于通用文档校正,但对于我们这个应用场景,实际效果都不太好,且大多项目由于商业因素,没有开源。实测下来,合合的文档图像切边矫正效果是最好的,但有时也会出现很怪的大畸变,合合方案调用 API 使用,按量付费。
书籍具有相对固定的形态、比例,且表面是连续平滑的,这些约束极大降低了问题的复杂度。针对书籍的扭曲矫正,比较有名的是 mzucker/page_dewarp 开源项目,通过样条拟合书表面的形状,通过迭代优化,减少重投影误差。该方法中,书表面尽可能垂直于相机光轴,否则容易产生透视畸变,还要求相机尽可能少的横滚角,以免文本行提取失败。page_dewarp 处理图片耗时较长,20 秒左右,大部分耗时在迭代计算环节。
最后,找到了 Document dewarping via text-line based optimization 这篇文章,最适合解决我的需求。通过文本行估计表面形状,构建损失函数,通过牛顿迭代法找到最优的变换参数,这个方法假设了:1. 文本是水平的;2. 在同一个文本块中,两个相邻文本行之间的行距应该是恒定的;3. 大多数文本块是左对齐、右对齐或两端对齐的。这些假设也限定了我们的应用范围:书籍内容以横排文本为主。这个方法运行速度很快,耗时秒级,且成功率非常高。具体的处理流程我们放在下节说明。
还有很多桌面/移动应用也提供了扭曲矫正的功能,具代表性的有 ABBYY FineReader、ScanTailor-Experimental、ComicEnhancerPro、VFlat 以及扫描全能王等。这些应用的处理速度很快,但对拍摄偏角大的图片往往就失效了,一般还是应用在扫描质量高的图片中,进行后期微校正。
以下是上述方法的测试情况。仅定性比较,非严谨对比,部分输入和输出图片有裁切,ComicEnhancerPro 为手动调整控制点。对于拍摄角度正的图片,大多软件都有可观的结果,对于拍摄角度大的图片,只有合合方案和 Kim 的方法有较好的效果。虽然有时参数化方法不一定得到最佳效果,校正后的图片总体还是平滑的;而基于深度学习的方法有时结果扭曲得厉害,翻看论文,感觉这类方法还是更擅长处理褶皱的文档,可能是数据集的原因,也可能图片需要预处理。
如何实现
为了稳定地实现书摘的提取,我设计了一个流程,由「分割」——扭曲矫正——光照校正——标记提取与 OCR」组成。对待提取的文本和图片,我们预设了两种标记:下划线用于提取文字,拇指食指指尖位置用于标记提取段落或图片。
分割
为了提高系统在自动运行时的可靠性,需要尽可能排除环境干扰。我们直接使用 Yolo 对书籍目标进行分割,我们对分割的效果要求不高,只需粗略将书籍分离出来,即使是 small 模型也可以满足要求。
在扭曲矫正的环节中需要提取文本行特征,一般来说通过文本行特征可以完成书籍「左页」和「右页」的分离,但在书本旋转角度过大或左右页文字相隔太近时,该方法就失效了。因此我们加了一个分离书籍「左页」和「右页」的模块。该模块以 Yolo 的分割结果作为输入,通过掩膜缩放、二值化处理、轮廓识别、形态学操作等步骤,首先尝试寻找书籍的中缝,以中缝为界分离「左页」和「右页」;如果光照比较均匀且书籍较薄时,中缝寻找失败,则遍历旋转角度 -45° ~ -45°,估计中缝和旋转角度。
结合 Yolo 的分割结果和中缝数据,我们就可以将书籍「左页」和「右页」干净地分离出来了。
扭曲矫正
我们基于优化的方法对书本进行形变矫正。详细的过程可以参考论文和代码 rebook。由于本人水平有限,没有完全按照原文构建 pipeline,但实际测试下来,校正结果尚可,在此基础上,我做了二阶段处理:根据文本行重新校正纵向的偏差,根据文本行左右边界校正水平倾斜。结果也是基本满足我们强力约束的:文本水平、行距恒定、两端对齐。
光照校正
对扭曲矫正的图像进行切边和光照的校正,我们就得到了一张等待 OCR 的图片啦。光照校正分两种情况,一种是文本类,我们采用类似扫描类 app 中的「背景去除」功能,将背景设置为纯白,根据前景/背景比值重新映射前景值,这种方法也可以去除大面积的阴影,代价是损失一些对比度;一种是图像类,「背景去除」会将图片中的大色块清除,因此,对于图像类,我们仅进行白平衡和亮度的调整。
标记提取与OCR
对目标文本和图片,我们预设了两种标记,即下划线和指尖位置。代码中,我在扭曲矫正校正环节,已经将指尖坐标点也做了映射,并在提取文本行时将下划线提取出来了,因此在该环节,我们只需根据该标记选择性地进行文本 OCR 或图片处理。
下划线标记的提取原则很简单,即提取线上的文本,并根据缩进和段落,对每行文本重新组织段落。
指尖标记。若只有一个有效指尖坐标,则提取其指向的文本行,提取结果为整行文字。若有两个有效指尖坐标,分析这两个坐标的 y 值间的内容,若文字密度大于预设的阈值,则提取两个 y 值间的所有文本;若文字密度小于预设的阈值,则判定为插图,仅裁切而不进行 OCR。
同时,通过分析首尾三段文本行,提取出页码。将原图、校正图、OCR 文本、插图、页码按照 markdown 格式保存,我们就获得了该页的电子书摘。
离线与在线运行
离线运行程序代码托管在 Github上:https://github.com/osnsyc/Excerptor。
离线运行适合任何阅读场景。只需要将待摘抄的书页拍摄下来,运行程序,程序对图片进行统一处理,输出为 Markdown 格式的文档。拍照时,程序自动选取更靠近图像中心的那一页进行处理。在该场景下,我们可以选择用彩色标签标记段落,最后统一拍摄、处理;也可以阅读时随时拍摄,最后统一处理。批量处理图片,平均每张耗时低于 10 秒。
在线运行,我们需要利用边缘设备,搭建一个「读书场景」。我将程序部署在 Orangepi 5 pro 上,摄像头采用 CMOS 尺寸 1/2’ 的 5000 万像素 USB 摄像头。该场景下,我们可以“实时”地做书摘。我在之前的文章《在家做一个魔法师,智能家居也可以动「手」不动口》中, 演示了如何在 Orangepi 上做一个手势控制智能家居的控制器,我将该控制器也融合进了这个项目中,使用预编程的手势触发信号,控制器收到信号后,在固定的延时(5 秒)后拍摄图片,并进行书摘的提取, 输出为 markdown 格式的文档。为了极致的自动化,我们也可以将 markdown 文档直接保存在 Obsidian 库中,或着通过 API 调用同步至在线笔记中。
结尾
本文是我在探索读书笔记数字化过程中的粗浅实践,还有很多不完善之处,比如,最终的 OCR 结果不是 100% 正确,手指拾取文本只能做到整行提取。未来可能进行的优化工作有:
- 结合电子书文件对 OCR 结果进行校正;
- 手指拾取文本行后的智能断句;
- 复杂排版书籍的扭曲校正;
- 手写注释的提取。
值得一提的是,在本文成文时,我发现微信读书有个「连接纸书」功能也可以对书本内容进行匹配和对下划文本进行识别。或许可以把微信读书也融入到自动化流程中。最后,贴一些图书数字化的图以飨读者,并附上我在实践中看到的好文好物。
附录
Digitalize notes
- How do you efficiently take notes from physical books? : r/ObsidianMD
- Digitalize notes from books : r/ObsidianMD
- Highlighting a physical book - Mickey Mellen
- Best way to capture physical book notes into Obsidian? : r/ObsidianMD
- 原创|纸质书笔记电子化-简单高效版 - 小红书
Methods
- Page dewarping
- Extract Highlighted Text from a Book using Python - DEV Community
- ComicEnhancerPro 系列教程 附录七:CEP处理之弯曲页面自动展平 - strnghrs - 博客园
- 15 Tools for Document Deskewing and Dewarping
- 弯曲矫正技术概述 - 哔哩哔哩
- Dewarp 文件恢复技术& ROP 阅读顺序预测-CSDN博客
- Text-line based Document Dewarping via Direct surface Reconstruction
- 文本图形处理(扭曲变形、增强等)的源代码列表-2_revisiting document image dewarping by grid regula-CSDN博客
- GitHub - FelixHertlein/contour-based-image-rectification: A small library to rectify masked images based on the mask contour
- Methods To Sense The 3D Surface/Structure Of A Book - DIY Book Scanner
- 文档布局分析 & 扭曲文档图像恢复 --- Document Layout Analysis & Document Image Dewarping | S1NH
- Dewarping Documents with AI - Fritz ai
- 仿照“全能扫描王”的图像增强-由原理到实现 - jsxyhelu - 博客园
- GitHub - sbrunner/deskew: Library used to deskew a scanned document
- unpaper/doc/image-processing.md at main · unpaper/unpaper · GitHub
App
- PDF Scanner | vFlat Scan
- 白描App
- GitHub - Scan Tailor Experimental
- ComicEnhancerPro
- FineReader PDF
- 扫描全能王
- Readwise importing highlights
- Highlighted: Book Highlights on the App Store
Online demo
- 图像矫正-图片倾斜矫正-图片自动校正-TextIn
- TextIn - 在线免费体验中心 - 文档图像切边矫正
- DocGeoNet - a Hugging Face Space by HaoFeng2019
- DocTr-Plus
- DocScanner
Hardware
> 下载少数派 客户端、关注 少数派公众号,了解更多的新玩意 🆒
> 特惠、好用的硬件产品,尽在 少数派 sspai 官方店铺 🛒