写点什么

腾讯冯牮:基于卷积神经网络在手机端实现文档检测

  • 2017-10-10
  • 本文字数:2303 字

    阅读完需:约 8 分钟

2017 年 10 月 17 日至 19 日,有 InfoQ 举办的全球软件开发大会QCon 将在上海举办。大会吸引了来自世界各地的技术专家及开发者。本文采访了QCon 大会的参会讲师,来自腾讯的的iOS 高级开发工程师冯牮,本次大会他的演讲题目为《基于卷积神经网络在手机端实现文档检测》。

在手机端运行模型并不容易,手机端计算能力有限,在技术方案中还需要权衡考虑多种因素,比如 TensorFlow 静态库的裁剪,模型大小的控制。首先,冯牮老师为我们介绍了利用卷积神经网络在手机端实现文档检测的流程。

在用神经网络技术解决实际业务问题的时候,通常要做的事情都是准备样本数据,选择网络结构,网络参数调优,这几件事情很有可能都是需要重复很多遍的,会经历各种失败,也正是因为有这些失败,才会促使开发者去进一步的思考,去寻找能取得更好结果的最优方案。

冯牮表示,在做这套文件检测方案的时候,也是符合这种基本的套路的,只不过在完整的技术方案里面,还包含了一部分用OpenCV 实现的算法,这部分算法也是配合着神经网络部分一步一步优化出来的。有一些比较关键的技术节点,按照时间先后顺序,简单记录一下,大致如下:

A:初始版本 HED + 公开通用样本集 + findContours API

B:公开样本图片集是通用意义上的边缘检测线,效果不够好,所以采用人工合成的思路,分别收集前景图和背景图,用 OpenCV 粘贴合成,模拟旋转、平移和透视变换

C:HED 网络的输入图片的尺寸是 224 * 224, 提升到 256 * 256 有助于得到更高精度的边缘检测线,但是训练难度大增,检测效果不升反降,为了改善这一点,先使用少量样本图片训练网络,当 HED 网络开始收敛,并且每一个尺度的输出 image 都开始对最终结果产生贡献后,才使用完整的训练样本集合继续训练网络

D:findContours 过于理想化,针对 HED 的边缘检测效果,把边缘线段延长到整个图片区域,在此基础上寻找四边形的顶点

E:OpenCV 并没有图层的概念,在旋转和透视变换等需要插值的时候,会在边缘区域直接用黑色像素进行插值,为了降低这种黑色像素干扰,只能使用精读最低的插值算法,这就使得合成的样本图片的清晰度也很低,为了改善这一点,把 OpenCV 替换成了 iOS 上的 UIView,也就是利用 OpenGL 来合成训练样本,提高了图片的清晰度

F:改进了 cost 函数,得到了更细的边缘检测线,降低了整体误差

G:在训练样本集中添加了 1200 张人工标注的真实图片

H:结合测试和体验用户的反馈信息,对一些识别率低的场景进行分析,刻意合成了一批这类场景的样本图片,比如杂乱背景、A4 纸白色背景等,最终总共合成了 80000 多张训练样本图片

I:在对低识别率场景的分析过程中发现,之前 D 步骤中设计的数学模型对其中一种场景很容易误判,所以重新设计了这部分的数学模型,不再把边缘线段延长到整个图片区域,另外在对四边形进行合理性判断的时候,重新设计了一组过滤策略

这其中的 B、C、E、G、H,是对训练样本的优化,C 和 F 是对 HED 网络的优化,D 和 I 是对数学模型的优化,从这里也能看出来,训练样本的重要性是很高的。

VGG 与 HED 神经网络算法 在冯牮的训练过程中,主要使用了两种神经网络算法:VGG 与 HED。

这两个神经网络算法,冯牮觉得是很难可以『简单』介绍清楚的:“我并不是说 VGG 和 HED 网络很难,其实正好相反,这两个网络结构,在卷积神经网络大家族里面其实反而是两个最简单最基础的网络结构了。”

冯牮解释说:比如 VGG,作为一个分类网络,和 ResNet、Inception model 这些新的分类网络相比,它的结构就是很简单的,因为它的层和层之间的关系很简洁,前一层的输出就是后一层的输入,HED 网络就是以 VGG 为基础,把其中一些卷积层的输出单独取了出来,再通过某些策略融合到一起,就得到了最终的输出。想学习 VGG 和 HED 的话,最好的资料还是第一手的论文和认可度比较高的参考代码。

然而一开始的时候,冯牮是想要仿照 face alignment 的思路,用一个端到端的神经网络结构直接拟合得到 4 个点的坐标,训练网络的时候虽然可以收敛,但是得到的结果是不可用的,网络计算出来的 4 个点的坐标是趋向于四个固定位置的。后来他也尝试用 YOLO 网络做过对象检测,用 FCN 网络做过图像切割,但是结果都很不理想,要么就是检测精度太低,要么就是计算量太大做不到实时检测。最终冯牮选用了 HED 网络,其实也就是前面提到的这几个原因,既要保证一定的精度也要保证实时计算的运行速度。

如何选择深度学习框架 在选择深度学习框架这一点上,冯牮有自己的一些想法,他认为:对于初学者来说,在挑选框架的时候,不需要纠结太多问题,选一个工业界主流的框架就可以了,TensorFlow、MXNet、Caffe2 这些都是可以的,这些主流的框架,配套的开发文档、demo 程序等等都是比较齐全的。而且,重点要学习的还是神经网络的各种算法,框架只是实现这些算法的一种手段。

“当然,TensorFlow 官方就支持手机端,这是我选择 TensorFlow 的原因之一。”冯牮补充说。

苹果于今年推出了自家的移动端深度学习框架 CoreML,冯牮表示,虽然没有尝试使用过 CoreML,但是就他看来,这是一种技术趋势,框架只是工具,只是一种实现手段,工具之间可能会多少有一些差异,但是神经网络结构与工具无关,同一个算法,用不同的框架也是都可以实现出来的。

CoreML 和 TensorFlow 相比,最明显的优势就是它是 iOS 平台原生支持的,有硬件加速,运算速度快,系统整合度高。但是 CoreML 只是做前向运算的工具,冯牮表示,在用反向传播算法训练网络的时候,还是要用 TensorFlow 或其他框架的。

除了 TensorFlow 之外,冯牮还给希望尝试移动端深度学习训练的开发者们推荐了一些其他框架,MXNet 和 Caffe2 都是官方支持 mobile 端的,有兴趣的同学也可以从这两个框架入门学习。

2017-10-10 19:002849
用户头像
陈思 InfoQ编辑

发布了 584 篇内容, 共 308.6 次阅读, 收获喜欢 1306 次。

关注

评论

发布
暂无评论
发现更多内容

面试官:说说React-SSR的原理

beifeng1996

React

深度分析React源码中的合成事件

goClient1992

React

react源码分析:深度理解React.Context

flyzz177

React

面试官:能用JavaScript手写一个bind函数吗

helloworld1024fd

JavaScript

自己手写一个redux

helloworld1024fd

JavaScript

长安链源码分析共识机制1

学术加油站|FLAT,一个轻量且高效的基数估计模型

OceanBase 数据库

查看Spark任务的详细信息

程序员欣宸

大数据 spark 10月月更

腾讯前端一面必会面试题(边面边更)

loveX001

JavaScript

华为云从入门到实战 | 云服务概述与华为云搭建Web应用

TiAmo

华为 华为云 10月月更

三年经验前端vue面试记录

bb_xiaxia1998

Vue

react源码分析:组件的创建和更新

flyzz177

React

week3 - 作业

in9

程”风破浪的开发者|python学习之注释

魏铁锤

学习方法 “程”风破浪的开发者

经常会采坑的javascript原型应试题

loveX001

JavaScript

极客时间运维进阶训练营第二周作业

chenmin

第九期 - 模块四

wuli洋

关于前端面试你需要知道的知识点

beifeng1996

React

面试官:你是怎样进行react组件代码复用的

beifeng1996

React

前端常考手写面试题汇总

helloworld1024fd

JavaScript

数据湖(十六):Structured Streaming实时写入Iceberg

Lansonli

数据湖 10月月更

深入React源码揭开渲染更新流程的面纱

goClient1992

React

面试官:vue2和vue3的区别有哪些?

bb_xiaxia1998

Vue

SAP | 来了解一下事件吧

暮春零贰

SAP 事件 10月月更

OMS 3.4.0 发布,打造更安全易用的数据迁移体验

OceanBase 数据库

谈谈前端性能优化-面试版

loveX001

JavaScript

说说你对Vue的keep-alive的理解

bb_xiaxia1998

Vue

腾讯冯牮:基于卷积神经网络在手机端实现文档检测_Android/iOS_陈思_InfoQ精选文章