七夕“加餐”:深度学习图像算法在内容安全领域的应用实践和优化
作者介绍:李雨珂博士,网易易盾资深算法专家,毕业于浙江大学信息与电子工程学系,研究方向包括数据挖掘、机器学习以及计算机视觉,目前在网易易盾主导内容安全领域多媒体信息相关人工智能算法研发。
深度学习图像算法近年来在学术领域经历了爆发式的发展,目前已经在工业界多个实际场景取得了较完整的应用落地,例如安防、营销、娱乐、金融等场景。其中内容安全也是非常典型的落地案例,深度学习图像算法在鉴黄鉴暴、广告识别、违禁拦截、敏感人物过滤等方向都取得了不错的应用效果。
算法自动识别一方面可以全面减轻人工审核投入,另一方面可以更有效率、更快速地对信息进行判断。本篇分享将会介绍如何快速搭建深度学习图像算法服务以及易盾在图像算法优化方面的经验。
一、内容安全难点
内容安全领域是一个相对特殊的场景,我们面对的问题往往目标定义不明确,数据种类繁杂多变、图像质量差距大,还会经常面临对抗攻击,这一场景对算法能力的要求较高。
相比较而言,在2C营销场景中,例如手机扫描商品/图标,对用户来说召回能力相对重要一些,误判在使用过程中不容易被发现;在门禁考勤场景中,由于摄像头采集到的图像质量较高,算法需要解决的是限定图片质量范围内的效果问题。
而在内容安全领域,由于线上数据正常比例较高,且图像类型众多,误判问题非常容易集中体现;另一方面,由于UGC图像质量参差不齐,图像敏感特征往往不够明显,小目标、模糊、形变等问题较常出现。
伴随易盾内容安全业务的发展,我们深入探索了深度学习图像算法在这个领域内的应用,在实际场景中取得了预期效果。
二、小试牛刀:教你快速搭建深度学习图像算法服务
深度学习算法已经成为图像算法中的重要组成部分,深度学习相关公开资源已经非常丰富,针对图像任务创建一个简单模型是十分容易上手的,这里将会展示如何快速搭建一个深度学习图像分类服务。
我们以场景识别为例子,即根据图像全局信息判断拍摄场景,例如泳池、车内、公寓等。我们可以选取公开数据集places365用于模型训练、数据说明和下载链接参见[1],通过tensorflow-slim接口进行图像分类模型训练[2],最终使用常见服务框架将算法服务进行透出。
其中数据方面仅以公开数据为例,实际应用中需要以业务数据为主。模型训练采用的框架可以选择TensorflowKeras、MxnetGluon、Pytorch、Chainer等。随着深度学习框架的逐步发展,训练便捷性越来越高,相比较而言Tensorflow-slim也不算特别友好,但其代码组织思路和拓展性还是很值得借鉴的。这里我们将以Tensorflow-slim为例分几个步骤完成这项工作。
2.1 数据处理
原始PLACES365数据集的标签类别较多,为了快速验证代码我们仅挑选了其中小部分类别,用作示例。数据按如下进行组织,一个文件夹存储一类数据,文件夹为标签名。
参考源码中flowers数据集处理脚本download_and_convert_flowers.py,创建图像数据到tfrecord文件转换的脚本,原始项目中似乎没有一个通用的数据文件转换工具,建议可以自己简单写一个,将可变参数做成脚本入参,转换数据即可用命令方式执行,便于后续处理其他数据集。
脚本处理结束后,目标图像数据将转换成tfrecord文件,同时标签描述文件label.txt会自动生成。参考源码中flowers数据集描述脚本flowers.py,构建一个对应于场景数据的描述脚本,这里会对数据集的一些基本信息进行定义,如下所示:
通过上面一系列操作,数据准备层面的工作基本完成。
2.2 模型训练和测试
完成数据处理后,我们将挑选一个模型进行训练,我们以inception-v3为例,实际工作中模型挑选主要考虑的是性能和效果的平衡,需要通过一定量的实验来评估。
首先我们根据开源项目中提供的链接将IMAGENET预训练模型下载到本地。tensorflow-slim项目已经对训练功能进行了非常棒的上层包装,我们在实际使用过程中直接调用train_image_classifier.py脚本即可。我们首先以较大的学习率训练最后一层全连接参数,其他参数保持不动,然后以较小的学习率对所有参数进行调整。
训练脚本train_image_classifier.py对数据读取、预处理选择、模型选择、参数配置等都有较好的支持,建议详细阅读其中的代码和组织形式。完成训练后,我们通过测试脚本eval_image_classifier.py完成效果评估,如果在测试集上取得比较好的效果,我们就可以进入下一步。
2.3 服务透出
完成训练和评估后,我们可以简单写一个转换脚本将原始模型文件处理成pb文件,这会带来一系列好处,不但可以只保留inference所需的网络结构,砍掉一些训练辅助结构,将网络参数值进行freeze,减小模型文件大小,而且由于pb文件和框架关联性不大,可以脱离tensorflow进行使用和部署。tensorflow-slim已经提供了pb文件转换支持,但个人建议可以参考其他方式进行编写[3],使用上更加直观和简便。
接下来是算法模型服务化的工作,这一部分可以选择的方案也比较多,可以使用基于tensorflow的tf-serving进行完整的服务管理,也可以只通过Flask、Tornado等通用框架创建HTTP服务,还可以选择跨语言RPC框架构建服务。其中Flask方案可以参考[3]。我们需要写一个服务脚本来启动服务,同时需要创建客户调用脚本对服务进行调用测试。如果有服务并发评估需求,建议可以通过Locust,使用上非常便捷[4]。
以上工作完成后,我们就基本上完成深度学习图像服务的简单构建,如果有移动端方面的部署需求可以参考tensorflow官方iOS的例子[5]。以上内容以场景识别为例子进行简单说明,实际上模型使用框架、服务使用框架选择的空间都是比较大的,个人比较建议算法模型部分可以按需求灵活挑选,服务部署部分需要有统一的规范进行约束。
三、重装上阵:易盾实际优化经验分享
以上工作非常容易实现,也仅仅是算法工作的小开端,离算法应用到实际场景还有非常遥远的距离。
哪怕经历了业务数据扩充、负样本收集、参数调优、模型结构改造等大量工作之后,算法应用到线上数据后的实际效果仍会非常糟糕,不但会出现大量解释性较差的误判,而且存在困难样例不能召回的困境。
在实际工作中,网易易盾往往会从以下几个角度着手来提升算法真实效果:
- 标签定义:明确识别范围,建议先缩小识别范围,再逐步增强召回能力,按照这种方式,效果测试相对容易进行。在场景识别中,总结出全局特征相似、具有分类意义的标签是非常关键的;
- 数据有效收集:随着数据量的不断累积,数据收集的重点往往不是数量,而是收集效率和质量。我们在实际工作过程中采取了一些主动学习机制,既能保证数据有效性,又能尽可能减小标注成本。在场景识别中,我们利用初始数据训练一个简单模型后,就可以用于业务数据的过滤,挑选有效数据进行扩充。
- 测试集定义:挑选足够代表线上实际情况的测试集,主要关注数据量和覆盖范围两个方面,并且针对特殊问题收集特定类型测试集,测试的有效性对线上算法效果起决定性作用。
- 算法方案:结合多模型融合、目标检测和判定策略,扩充算法方案。场景识别相对来说使用全局特征为主,但如果遇到小目标、多尺度、模糊等问题,FPN、Attention等结构就可能发挥一定的作用。
- 线上闭环:服务上线后回流数据,形成闭环迭代,对模型能力不断进行矫正。
尝试新算法、学习新知识往往是非常愉快的,但上述这部分的工作却是枯燥和痛苦的。真正对线上优化起到最直接帮助的往往不是模型调参,而是枯燥乏味的事前数据工作,以及不遗余力的事后测试工作。
基于明确定义、重视大规模测试、形成数据闭环的算法优化思路,易盾图像算法在业务算法上取得了一定的突破,核心算法模块效果在过去的几年中持续稳步提升,基础能力越来越厚重,定向优化也取得进展,不断提升识别精准度,并逐渐扩大识别范围。
四、未来展望
易盾内容安全图像算法服务经过多年发展,已经形成了一系列服务,形式多、范围广,维护成本也会逐渐增加。我们在这些项目经验的基础上凝练出最佳实践方案(平台方向),为快速搭建服务满足客户新需求提供了条件。当然,由于内容安全场景效果要求相对苛刻,解决特定业务问题往往需要通过特殊路径(定制方向),进行长期投入,平台化和定制化之间需要做到一定平衡。
另一方面,随着业务量不断增加,易盾团队在性能和效果平衡方面也做了非常多的尝试,通过网络剪枝量化、图像预处理优化、模型级联等方法不断减小服务响应时间,算法吞吐能力也会是我们长期追求的重点目标。
以上分享是网易易盾算法团队在深度图像领域落地探索方面的一些初浅分享,实际上网易易盾在背后做了很多的工作,比如网易易盾人工智能实验室方正研究员在2018年研发出了一种对多视角多模态特征信息进行有效融合的自编码器神经网络,在准确率、NMI、Purity、ARI等各项性能指标上,较当下多项国际先进的多视角多模态信息融合技术有显著性的领先。再比如今年,网易易盾人工智能工程师姚益武在全球计算机多媒体顶级会议ICME 2019展示int8量化新算法,有助于构建端到端的纯整数运算通路,且统一表示层的设计简化了网络结构的拓扑设计,应用于易盾内容安全图像识别上,则在确保业务模型推理精度的前提下,其服务的响应时间能得到显著降低。
展望未来,网易易盾算法团队还将不断研究、创造和创新,持续提升易盾在内容安全服务上的效果,帮助合作伙伴和客户解决其遇到的内容安全问题。
文中资源汇总:
[1].PLACES365数据集说明和下载:http://places2.csail.mit.edu/...
[2].tensorflow-slim官方地址:https://github.com/tensorflow...
[3].模型转换和Flask服务编写:https://blog.metaflow.fr/tens...
[4].压力测试:https://locust.io/
[5].IOS端部署:https://github.com/tensorflow...