陈颂光
全栈工程师,能够独立开发从解释器到网站和桌面/移动端应用的各类软件。
关注我的 GitHub

从CROHME 2023看手写数学公式识别在过去四年的发展

文档分析

联机手写数学公式识别竞赛(Competition on Recognition of Handwritten Mathematical Expressions,CROHME)一直是公式识别领域认受性最高的评测平台。作为文档分析与识别国际会议(International Conference on Document Analysis and Recognition,ICDAR)的一部分,2023年这个竞赛继2011-2014、2016和2019年后再度举办。作为本届的其中一个参赛者,我有幸在全部三个任务上夺冠,现在是时候总结一下本次参赛的经验,并展望手写公式识别领域的前景。

联机手写文档分析的现状与未来

文档分析

随着触摸屏和笔式输入设备的普及,人们可以用电子设备代替传统的纸张作为书写的介质,从而更便于共享。不过,仅仅记录书写的轨迹并未充分体现电子化的优势,为了更好地支持编辑、搜索和各种自动化处理,还需要把手写的内容转换为更结构化的形式。与通过扫描或拍照等方式获取的手写文档图片相比,轨迹不但提供了时间、坐标和其它信息(如压感、倾斜角),而且夹杂了更少的的背景噪声,这就使得联机手写文档分析有比脱机手写文档分析做得更好的可能性。然而,做到完美仍然不太可能,所以如何利用不准确的结果就成为实用化的关键。

基于笔划提取的脱机手写数学公式识别

图像处理 文档分析

手写体识别传统上被分为联机识别和脱机识别,前者识别动态的笔迹而后者识别静态的图片。与联机识别相比,由于缺乏动态信息和存在背景噪声,脱机识别的准确度通常较低,同时往往占用更多资源。于是,把脱机识别问题转化为联机识别问题是一个有吸引力的想法。本文以由于具有紧凑的二维结构而极具挑战性的数学公式识别问题为例,探讨了基于笔划提取的脱机手写识别的可行性和实用性,这方法夺得了国际性权威竞赛CROHME 2019中有关任务的季军。

局部自适应二值化方法的内存高效快速实现

图像处理 文档分析

二值化被广泛用作识别前从背景分离出文本等对象的预处理步骤。通过逐个像素计算阀值,局部自适应二值化方法能较好地分割光照不均或带噪声的受损文档图片。由于阀值往往依赖于矩形窗口中灰度值的一些基于矩的统计量如均值和方差,过往人们常用积分图像去加速计算,代价则是需要额外占用大量内存空间。注意到按行主序,矩形窗口中矩和直方图都可以增量地计算,进而容易得到局部平均、标准差以至分位数,积分图像实际上是不必要的。特别地,这个想法导致Bernsen方法和Niblack型方法如Sauvola方法的新串行实现,它们的时间复杂度与输入图像的大小成正比且与窗口大小无关,而辅助空间关于输入图像大小次线性。

如何在保障隐私的同时跟踪传染病传播

信息安全

新冠肺炎(SARS-CoV-2)于2020年在全球范围的爆发引起了广泛关注,为了快速而有效地减慢病毒的传播,群体免疫以外的另一种可能有效的策略就是找出与感染者有密切接触的人士并让他们自我隔离。由于手机等移动电子通信设备的普及,部分国家强迫人民安装的某种称为“健康码”的应用程序,用以评估用户带病的风险。然而,这类程序往往被指为政府收集过多信息,这种大规模监控严重侵犯了公民的隐私权,并可能被用于其它不可告人的目的。其实,精准的传染病链跟踪不需要以牺牲人民的隐私为代价,泛欧保隐私接触追踪(Pan-European Privacy-Preserving Proximity Tracing,PEPP-PT)去中心化保隐私接触跟踪(Decentralized Privacy-Preserving Proximity Tracing,DP-3T)就让用户匿名且完全不收集任何定位信息。

用OpenLayers设计地理信息网站

web

在网页上提供地理信息是一个常见的需求,例如连锁店的网站需要展示各门店的位置和前往路线。OpenLayers就是其中一个经常用于显示地图的Javascript库,可以让用户交互式地与各种地理信息打交道。

Deeplearning4j深度学习框架初探

人工智能 java

人工神经网络近年在机器学习算法中可谓一枝独秀,对自然语言处理(如机器翻译)和计算机视觉(如图像识别)等领域的进步起了重大作用。受惠于JVM久经考验的丰富生态,Deeplearning4j(DL4J)深度学习库不但容易在各种平台上使用,而且性能优异(特别是方便借助Hadoop和Spark处理大数据),适合用于开发各类模式识别软件产品。

用ANTLR解析领域特定语言

java

在开发各种软件的过程中难免要与各式各样的小语言打交道,例如要读取不同格式的数据(特别是配置)文件。虽然我们可以从头开始自己写程序去解析它们,但这样往往过于耗时且难以维护。ANTLR是Lex(或Flex)与YACC(或Bison)在Java世界的一个代用品,可以根据词法和语法自动生成解析器。

编写浏览器插件:适用于Chrome、Firefox、Edge和Opera

web

浏览器插件(或称扩展)可以修改浏览器的行为,比如可以屏蔽广告、防止跟踪、下载视频、翻译网页、增加搜索引擎等等。在过往不同浏览器有互不兼容的插件机制,但现在包括Chrome、Firefox、Edge和Opera在内的主流浏览器都在某程度上支持了WebExtensions API,因而我们能轻松地编写同时适用于多个浏览器的插件。

善用Wikidata语义网

人工智能

人们用他们熟悉的自然语言如中文在网上编辑了海量的信息,但自然语言固有的极端复杂性使这些文本难以为机器所理解,于是人们因为找不到已有的信息而重复劳动,这个恶性循环的结果是互联网上文章泛滥但质量普遍低下,特别是过时信息得不到清理。相反,语义网提倡用更规范的方式表达知识,并把它们连接起来。维基基金会的Wikidata就是一个人人可编辑和利用的知识库,有大量志愿者持续扩展和修正它,这使它的数据无论在数量上还是质量上都处于领先地位,维基百科中条目右上方卡片的信息就来自Wikidata。值得一提的是Wikidata的数据位于公众领域,可以(接近)无条件地合法使用。

Freemarker模板引擎速查

java

Apache Freemarker是JVM平台上一个比较流行的通用模板引擎,适合用于生成网页、 邮件、 配置文件等代码。

机器学习怎样做预测

人工智能

对于比较明确的需求如排序和计税,我们通常会直接编写满足要求的“函数”。但对于一些更多地涉及人文背景的问题如翻译和人脸识别,准确地转化为计算机术语可以认为是不可能的。在过往,为了解决这些问题,我们往往要为每个问题单独设计非常专门的解法,但人手设计的启发式规则很快会变得难以维护,又因重复劳动不利于总结提高而难以达到理想的效果。近年,随着收集大量数据变得容易,基于(有监督)机器学习的方法取得了主导地位,它的思想是用统一的框架解决不同的问题:给定一些键值对然后设法自动找出一个(近似)包含这些键值对的映射。

自然语言处理浅谈

人工智能

由于人们之间普遍以自然语言的形式交流,互联网和各种数据库中的这些非结构化数据中蕴藏了价值连城的大量信息。然而,对于计算机而言,理解自然语言相当困难,实际上这可能正是人工智能的核心。然而,我们仍然能让计算机不懂装懂并做不少事情。

Android开发概览

java

Android是目前在手机等移动设备上最流行的操作系统,其中的应用主要用Java语言写成,因此对于Java程序员,转型手机开发相对容易。

用OSGi打造可热拔插的插件系统

java

OSGi是Java平台上一个始于1999年的动态模块化系统,已经用于包括Eclipse在内的各种规模的软件。以下我们演示如何用OSGi框架的一个实现Apache felix来构建一个文件查看器,它用插件的方式支持各种文件类型。

Spring框架初探

java web

Spring已经从在Java EE做依赖注入的框架发展为包罗AOP、MVC、数据持久化、消息传递、安全的Spring全家桶生态,甚至已经把魔掌伸向命令行程序和手机应用开发。以下我们就来说明一下怎么用Spring做点简单的事情。

常见软件许可证导读

法律

在软件开发中难免要用到其它人拥有版权的软件,没有几家公司能够从操作系统和驱动程序到浏览的所有网页上脚本全部都自主知识产权。一般来说,即使你拿到软件的一个副本,你仍然无权运行它,更不要说复制、出售、修改或研究它,只有版权持有人明确授予相应权限才行。权利与义务是对等的,授予通常也是有条件,只有你同意版权持有人的条件你才能使用软件,关于使用软件的权利与义务的协议称为许可证。要使用软件,必须仔细阅读并同意严格遵守许可证。幸运的是,众多自由软件和开源软件都使用少数几种许可证,因此我们有必要了解它们的条款,以免误堕法网。

用Solr打造定制的搜索引擎

java web

在数据分析、站内搜索等应用中,我们往往需要有自己的搜索服务。Apache Solr(用户包括Instagram、Netflix和Digg)和ElasticSearch(用户包括GitHub、Quora和eBay)就是目前最流行的开源搜索服务器软件,无独有偶,它们都基于用Java语言编写的搜索引擎Apache Lucene

用FontForge设计字体

排版

在各种排版任务(包括网页设计、应用程序界面设计)中都需要选择字体,有时在字体缺字时还需要造字或是微调笔划细节。我们就以FontForge为例说明如何设计字体,并回顾一些关于字体的常识。当然,我们只能从技术层面作简要的介绍,让你有足够能力实现你的想法,至于品味之类的问题不好说。虽然技术上的焦点更多在于如何制作各个字形,但更重要的是确保字体中不同字形应该有高度的风格一致性,因此在设计字体过程中要始终关注重复的性质。

图解GIMP滤镜

图像处理

《GIMP图像处理入门》中介绍了GIMP的基本用法,这里我们再介绍GIMP以插件形式提供的各种滤镜,可以通过应用算法对图层进行修改来实现各种各样的效果。