原创

深度学习图像算法在内容安全领域的应用实践和优化

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://csdnnews.blog.csdn.net/article/details/99506939

640?wx_fmt=gif

640?wx_fmt=jpeg

作者 | 李雨珂

责编 | 屠敏

深度学习图像算法近年来在学术领域经历了爆发式的发展,目前已经在工业界多个实际场景取得了较完整的应用落地,例如安防、营销、娱乐、金融等场景。其中内容安全也是非常典型的落地案例,深度学习图像算法在鉴黄鉴暴、广告识别、违禁拦截、敏感人物过滤等方向都取得了不错的应用效果。

算法自动识别一方面可以全面减轻人工审核投入,另一方面可以更有效率、更快速地对信息进行判断。本篇分享将会介绍如何快速搭建深度学习图像算法服务以及易盾在图像算法优化方面的经验。

 

640?wx_fmt=png

内容安全难点

 

内容安全领域是一个相对特殊的场景,我们面对的问题往往目标定义不明确,数据种类繁杂多变、图像质量差距大,还会经常面临对抗攻击,这一场景对算法能力的要求较高。

相比较而言,在2C营销场景中,例如手机扫描商品/图标,对用户来说召回能力相对重要一些,误判在使用过程中不容易被发现;在门禁考勤场景中,由于摄像头采集到的图像质量较高,算法需要解决的是限定图片质量范围内的效果问题。

而在内容安全领域,由于线上数据正常比例较高,且图像类型众多,误判问题非常容易集中体现;另一方面,由于UGC图像质量参差不齐,图像敏感特征往往不够明显,小目标、模糊、形变等问题较常出现。

伴随易盾内容安全业务的发展,我们深入探索了深度学习图像算法在这个领域内的应用,在实际场景中取得了预期效果。

 

640?wx_fmt=png

小试牛刀:教你快速搭建深度学习图像算法服务

 

深度学习算法已经成为图像算法中的重要组成部分,深度学习相关公开资源已经非常丰富,针对图像任务创建一个简单模型是十分容易上手的,这里将会展示如何快速搭建一个深度学习图像分类服务。

我们以场景识别为例子,即根据图像全局信息判断拍摄场景,例如泳池、车内、公寓等。我们可以选取公开数据集places365用于模型训练、数据说明和下载链接参见[1],通过tensorflow-slim接口进行图像分类模型训练[2],最终使用常见服务框架将算法服务进行透出。

其中数据方面仅以公开数据为例,实际应用中需要以业务数据为主。模型训练采用的框架可以选择Tensorflow\Keras、Mxnet\Gluon、Pytorch、Chainer等。随着深度学习框架的逐步发展,训练便捷性越来越高,相比较而言Tensorflow-slim也不算特别友好,但其代码组织思路和拓展性还是很值得借鉴的。这里我们将以Tensorflow-slim为例分几个步骤完成这项工作。

数据处理

原始PLACES365数据集的标签类别较多,为了快速验证代码我们仅挑选了其中小部分类别,用作示例。数据按如下进行组织,一个文件夹存储一类数据,文件夹为标签名。

640?wx_fmt=png

参考源码中flowers数据集处理脚本download_and_convert_flowers.py,创建图像数据到tfrecord文件转换的脚本,原始项目中似乎没有一个通用的数据文件转换工具,建议可以自己简单写一个,将可变参数做成脚本入参,转换数据即可用命令方式执行,便于后续处理其他数据集。

640?wx_fmt=png

脚本处理结束后,目标图像数据将转换成tfrecord文件,同时标签描述文件label.txt会自动生成。参考源码中flowers数据集描述脚本flowers.py,构建一个对应于场景数据的描述脚本,这里会对数据集的一些基本信息进行定义,如下所示:

640?wx_fmt=png

通过上面一系列操作,数据准备层面的工作基本完成。

模型训练和测试

完成数据处理后,我们将挑选一个模型进行训练,我们以inception-v3为例,实际工作中模型挑选主要考虑的是性能和效果的平衡,需要通过一定量的实验来评估。

首先我们根据开源项目中提供的链接将IMAGENET预训练模型下载到本地。tensorflow-slim项目已经对训练功能进行了非常棒的上层包装,我们在实际使用过程中直接调用train_image_classifier.py脚本即可。我们首先以较大的学习率训练最后一层全连接参数,其他参数保持不动,然后以较小的学习率对所有参数进行调整。

640?wx_fmt=png

训练脚本train_image_classifier.py对数据读取、预处理选择、模型选择、参数配置等都有较好的支持,建议详细阅读其中的代码和组织形式。完成训练后,我们通过测试脚本eval_image_classifier.py完成效果评估,如果在测试集上取得比较好的效果,我们就可以进入下一步。

640?wx_fmt=png

服务透出

完成训练和评估后,我们可以简单写一个转换脚本将原始模型文件处理成pb文件,这会带来一系列好处,不但可以只保留inference所需的网络结构,砍掉一些训练辅助结构,将网络参数值进行freeze,减小模型文件大小,而且由于pb文件和框架关联性不大,可以脱离tensorflow进行使用和部署。tensorflow-slim已经提供了pb文件转换支持,但个人建议可以参考其他方式进行编写[3],使用上更加直观和简便。

接下来是算法模型服务化的工作,这一部分可以选择的方案也比较多,可以使用基于tensorflow的tf-serving进行完整的服务管理,也可以只通过Flask、Tornado等通用框架创建HTTP服务,还可以选择跨语言RPC框架构建服务。其中Flask方案可以参考[3]。我们需要写一个服务脚本来启动服务,同时需要创建客户调用脚本对服务进行调用测试。如果有服务并发评估需求,建议可以通过Locust,使用上非常便捷[4]。

以上工作完成后,我们就基本上完成深度学习图像服务的简单构建,如果有移动端方面的部署需求可以参考tensorflow官方iOS的例子[5]。以上内容以场景识别为例子进行简单说明,实际上模型使用框架、服务使用框架选择的空间都是比较大的,个人比较建议算法模型部分可以按需求灵活挑选,服务部署部分需要有统一的规范进行约束。

 

640?wx_fmt=png

重装上阵:实践优化经验分享

 

以上工作非常容易实现,也仅仅是算法工作的小开端,离算法应用到实际场景还有非常遥远的距离。

哪怕经历了业务数据扩充、负样本收集、参数调优、模型结构改造等大量工作之后,算法应用到线上数据后的实际效果仍会非常糟糕,不但会出现大量解释性较差的误判,而且存在困难样例不能召回的困境。

在实际工作中,笔者往往会从以下几个角度着手来提升算法真实效果:

  • 标签定义:明确识别范围,建议先缩小识别范围,再逐步增强召回能力,按照这种方式,效果测试相对容易进行。在场景识别中,总结出全局特征相似、具有分类意义的标签是非常关键的;

  • 数据有效收集:随着数据量的不断累积,数据收集的重点往往不是数量,而是收集效率和质量。我们在实际工作过程中采取了一些主动学习机制,既能保证数据有效性,又能尽可能减小标注成本。在场景识别中,我们利用初始数据训练一个简单模型后,就可以用于业务数据的过滤,挑选有效数据进行扩充。

  • 测试集定义:挑选足够代表线上实际情况的测试集,主要关注数据量和覆盖范围两个方面,并且针对特殊问题收集特定类型测试集,测试的有效性对线上算法效果起决定性作用。

  • 算法方案:结合多模型融合、目标检测和判定策略,扩充算法方案。场景识别相对来说使用全局特征为主,但如果遇到小目标、多尺度、模糊等问题,FPN、Attention等结构就可能发挥一定的作用。

  • 线上闭环:服务上线后回流数据,形成闭环迭代,对模型能力不断进行矫正。

640?wx_fmt=png

尝试新算法、学习新知识往往是非常愉快的,但上述这部分的工作却是枯燥和痛苦的。真正对线上优化起到最直接帮助的往往不是模型调参,而是枯燥乏味的事前数据工作,以及不遗余力的事后测试工作。

 

文中资源汇总:

[1]. PLACES365数据集说明和下载:http://places2.csail.mit.edu/download.html

[2]. tensorflow-slim官方地址:https://github.com/tensorflow/models/tree/master/research/slim

[3]. 模型转换和Flask服务编写:https://blog.metaflow.fr/tensorflow-how-to-freeze-a-model-and-serve-it-with-a-python-api-d4f3596b3adc

[4]. 压力测试:https://locust.io/

[5]. IOS端部署:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/ios

作者介绍:李雨珂博士,网易易盾资深算法专家,毕业于浙江大学信息与电子工程学系,研究方向包括数据挖掘、机器学习以及计算机视觉,目前在网易易盾主导内容安全领域多媒体信息相关人工智能算法研发。

【END】

服吗!Python身家50亿,是java和C++总和!

https://edu.csdn.net/topic/python115?utm_source=csdn_bw

640?wx_fmt=jpeg

 热 文 推 荐 

☞ 60 岁的人工智能,会是“人类历史最后的事件”吗?

Java 服务端乱象大盘点

☞ 如何战胜软件开发的复杂性?

Python爬取B站5000条视频,揭秘为何千万人为它流泪

☞主链100强榜单出炉, XRP竟与比特币比肩; 以太坊每周产生1248种新代币 | 数据周榜

Docker,一个傲娇的男人

AI“生死”落地:谁有资格入选AI Top 30+案例?

最前沿:堪比E=mc2,Al-GA才是实现AGI的指标性方法论?

边看边用!这本 Python 3.6 的书火爆了 IT 圈!

640?wx_fmt=gif点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。

 

 

 

 

 

640?wx_fmt=png

你点的每个“在看”,我都认真当成了喜欢640?wx_fmt=png

文章最后发布于: 2019-08-13 09:26:28
展开阅读全文
0 个人打赏
私信求帮助

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 代码科技 设计师: Amelia_0503

分享到微信朋友圈

×

扫一扫,手机浏览