蚂蚁雄兵,码农的第一次战役
2004年,政府无纸化办公推进得如火如荼,电子公文替代传统公文,尤其是替代传输通道变得非常迫切。数字化的便利和网络跨时空的特性,利于提升行政管理能力和管理效率。电子公文要具备唯一性、完整性,不可篡改、不可否认,此外它的权威性也需要得到确认。无疑,在IT环境下文件的传播路径和访问审计很容易追踪访问者的身份。但是,如果电子公文打印出来,纸质红头文件泄露出去,标记信息复印中被遮挡,怎样追查纸质文件的来源?
不仅政府机关,就连企业也经常碰到类似问题,尤其一些大型企业,如果合同泄露,设计图纸泄露,往往造成不可预估的损失。这一年,我们收到了来自政府核心机构的需求,希望我们能够解决对分发出去的纸质文件的溯源追踪问题,从分发出去的几十份甚至上千份文件中确定泄露源头。那时候,我任职公司开发一部经理,管着公司最核心的代码,没有什么悬念,这个任务老板拍在了我的头上。
一筹莫展,怎么开展呢?
经过内部一番头脑风暴,大家提出了三个方案。
方案一:文档背景中嵌入稀疏点阵,点阵不招人眼,甚至肉眼看上去很难注意,取得泄露样本后对纸张点阵进行识别。由于点阵数量可以很多,这样就可以对特征值进行较多的重复信息的嵌入,更有利于识别。
方案二:使用二维码做标记,将分发标志或者收件人加密后嵌入其中,获得样本后识别解密。
方案三:利用行间距或者字间距的微小差别,隐藏分发标志或者收件人信息。
讨论完就开始行动,我们立即对方案的可行性进行验证开发,经过一系列的分析和技术验证发现方案一和方案三看起来可行,但是复印后对嵌入信息破坏很大。方案一复印红头文件后不光点阵没了,还多了一堆麻点,尤其对于旧式复印机,复印后直接“蒙娜丽莎”了——颗粒和条纹较多。方案三复印时如果纸张放斜了一点,有折痕或者揉搓之后,行间距和字间距则一片大乱,尤其行间距,因为一页里面没有几行,能够编码的信息太少,更谈不上冗余。方案二太容易实现,也太容易被遮挡。这可怎么办?
我突然想起之前在做纸质文件数字化过程中,需要对识别文字进行编改校对,识别出来的文字一般都会提供10个,相似度最高的排在前面,识别引擎不会明示具体的某个字。如果我们对文字的关键笔画做些修改,把原始的字放到样本库中,让识别引擎去比较,是不是就可以达到我们的目标?我把讨论结果和新的想法向老板汇报。老板当即回复:“这个方案靠谱,我马上帮你联系清华的老师。”他接着又联系了中科院自动化所,也是做模式识别的团队。
2000年前后,有不少做图像文字识别软件的识别引擎来自清华。刘长松老师热情地接待了我,了解了我们的需求后,他说:“从文字识别的角度来看,识别率要保持一定的水准。第一,特征要明显;第二,样本要丰富、足够多。所谓样本就是识别文字的各种变形后的状态图案。这个方案没有做过,可以试试,前提是你们必须提交样本文字用来训练,然后提供要识别的纸质文件,测试之后才能评估。”
这说明方案具有可行性。时间紧急,回公司后我立即组织部门会议,把清华老师的要求介绍给大家。现在需要解决的是变形哪些文字,这些文字怎么变形,怎样制作样本,以什么形式提供给清华老师。
讨论后就进行了分工,有的同事从网上下载文章,筛选出1000个最常用的汉字,针对这1000个汉字进行局部修改。我们要寻找工具解读字体文件,或者我们自己写个程序能解读字体文件,然后对1000个汉字进行笔画上的微调。因为不能影响视觉和打印效果,我们就想办法用变形后的文字编写文档并打印出来。首先,我们将实验阶段的汉字字数缩小到10个,必须验证效果后再大规模推进。另外,有同事找到了字库文字编辑软件,这解决了我们修改字库文字的问题,不用耗费精力读取字库,只需要写个交互界面进行编辑调整。字库被修改后,我们把操作系统中的字库文件替换掉,这样无论使用哪个文档撰写工具都可以直接修改成变形文字文件,我们使用4台不同型号的打印机分别打印了样本文件。赶紧送到清华进行评估,刘长松老师说第二天给我结果。
等待的时间是漫长的,内心是忐忑的,因为我们不知道结果怎样,这个方案行不通的话,还有什么思路?
第二天上午9点多,刘老师给我打来电话:“通过样本训练后,对样本的识别率大于99%,方案应该可行。”
非常感谢上天的眷顾!我们团队听后非常兴奋,赶紧去跟老板汇报,并沟通下一步的工作。老板脸上带着自信的微笑,好像早就料到了一样,他说:“清华老师也跟我说了,就按这个方案开始干吧!需要什么资源,你直接给公司部门领导打电话,我一会儿给管理层群发邮件,要求他们无条件地配合你的工作。我还给你找了一个书法家,他也是某字库公司的字体专家。另外,需要跟清华大学实验室沟通商务,识别引擎和后台数据库我们需要,训练工具我们也需要,要做到结果可控,随时可以测试验证。”
这是我在2004年之前接受的最复杂的一个项目,回到部门后我赶紧开会布置任务。
第一,确定两种最常用的字体,拷贝出来进行编辑和变形。
第二,对公文系统进行改造,能够通过变形文字嵌入信息,并可以进行冗余编码,打印时将计算机标志信息和时间隐藏其中。
第三,开发识别工具。对于发现的泄露文件,能够识别其中的隐藏信息,直接报告显示电脑标志和时间信息。电脑标志信息用CPU编码、网卡编码还是硬盘编码,自行决定。
第四,联系数字化生产部,借调10名文字校对人员对字库文件的文字进行修改;怎么修改,我们培训,教会他们使用字体修改工具。
第五,寻找更多不同款的打印机,至少10种;寻找周边复印店、打印店,准备复印。
第六,准备样本制作环境,水泡、可乐泡、酱油泡,手工揉搓。
第七,准备4种不同型号的扫描仪,用来扫描样本图像,然后进行识别训练。
第八,准备训练环境。扫描后的图像怎么进行自动化训练,提供什么输入等问题需要搞清楚。
第九,跟清华沟通商务问题,例如,识别引擎是否涉及定制开发。此外,我们还需要针对识别的训练软件,对同一个字的多种样本进行学习训练。
任务分派完,我们就开始行动了。跟清华大学实验室的沟通由我亲自上阵,我还和老板联系了中科院自动化所、汉王公司,确保万无一失。中午书法家赶过来后也给我们提供了有效的帮助。他说对于电脑,如果变化特征识别是一样的,从视觉上看不应该修改关键笔画,而是修改那些不起眼的笔画,避免视觉上造成影响。我们及时采纳了他的意见。
系统改造,测试验证,10种打印机、10种复印机、4款扫描仪、4种破坏方式,从改程序到改字数有10个环节,样本用复印机二次交叉复印,最后每个样本数达到上千个。任何一个环节出错,都会对结果造成致命影响。我们分工仔细,每个环节都有专人盯紧执行结果,最后用变形字体嵌入信息识别率平均可以达到95.6%,按清华刘长松老师的话,结果可用。我们用4天完成了这个任务,全程各项工作无缝衔接,高速运转。
向政府核心部门技术领导做展示时,我们的技术方案获得了高度认可。同时我们也得知,他们用另外一家业内知名企业也推进了同样的项目,这家公司走了另外一条技术路线。这也让我们学到了一点:关键项目或者技术攻关,在条件允许的情况下,应该开辟两条路径,确保目标达成和路径最优。
如果要让我数数自己工作上最引以为豪的事迹,这肯定算其中一个。组织工作复杂,需要大量调度(七八个部门参与,还有外部3家公司),工序繁多且每一个都容不得闪失(细数下来,超过20个环节);对外有依赖性和一定的不确定性;在总目标不变的情况下,工作过程中需要调整策略时,就及时处理。
“凡事预则立,不预则废。”这是我码农史第一次跨部门组织大规模的团队作战。