前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >精炼鉴黄师背后的故事

精炼鉴黄师背后的故事

作者头像
代码医生工作室
发布2019-07-05 18:31:23
2.4K0
发布2019-07-05 18:31:23
举报
文章被收录于专栏:相约机器人相约机器人

精炼鉴黄师背后的故事

——大蛇智能鉴黄师版正式发布

用AI来鉴别黄色图片,已经不是什么新鲜的事情。然而能够训练出一个可用的图像识别模型,其中所需要的细节知识还是值得学习的。

本文就来从鉴黄师的训练细节说起,为大家介绍一下训练出高质量的可用模型所需要的具体步骤。可以帮助大家举一反三,在其它领域训练出高质量的商用模型。

一、数据集的选取

在GitHub上有一个20万张图片的原始鉴黄数据集,直接使用该数据集可以使我们节约很多时间。这份资源的贡献者是一位名叫Alexander Kim的数据科学家。

1.1原始数据集介绍

数据集中,一共有227995张图片。并将内容分为5类,分别是: hentai、sexy、neutral、drawings、porn。

其中,hentai类别中有45228张;sexy类别19554张;neutral有20960张、drawings有25732张;porn类别最多,有116521张。

这些图片,是以链接的方式呈现的。以sexy类别为例:

具体地址如下:

https://github.com/alexkimxyz/nsfw_data_scrapper

据作者说,这些数据集可以用来训练图像分类器,使用CNN做出来的分类器,分辨上述的5种图像准确度可以达到91%。

1.2 数据清洗

显然91%的效果无法满足我们的需求。而在实际使用过程中,发现数据集中动画与真人之间图片混淆:动画的黄色图片分类里有动画图片、真人的黄色图片。同时,真人的黄色图片分类里又有sexy图片与普通图片。总之,直接拿这个数据集训练,得到的loss会在30%左右震荡。很难得到可用的模型。

我们需要按照这个基线数据集,做更深层次的加工,清洗。

1.2.1 黄色图片的判定规则

什么样的图片叫做黄色图片?这涉及到一个技术以外的问题。但在训练模型之前也是必须要要解决的问题,如果我们自己都无法分清规则,那么如何让模型去区分?

在清洗之前,需要为黄色图片做一个人为的定义,直接简单粗暴的定义!——以是否暴漏隐私部位为判定规则。

1.2.2 人肉清洗

人肉清洗,指的就是由人眼来一个一个的分类图片。

在AI工程的样本的处理环节,最不愿提及的便是人工处理样本。然而,这个环节也确实是无法避免的。当然,也听说过一些非监督模型能够处理这个问题,至少到目前为止,我们还没有在这个方向上找到高效可用的方法。

例如:

我们公众号上的一篇文章:8亿参数,刷新ImageNet纪录:何恺明团队开源最强ResNeXt预训练模型中介绍的facebook通过弱监督预训练用Instagram上面的9.4亿张图训练ResNeXt模型。这种并不适合我们每个研发团队。尤其是在算力没有人家富裕的情况下。

所以,还要老老实实的进行人肉清洗。

在人肉清洗环节,也是有一定方法的,可以利用现有的AI模型来降低工作量。例如:

直接使用nsfw_data_scrapper数据集训练出来的模型,对该数据集中的单一类别样本进行预测。在预测结果中进行人肉清洗。这种方法可以快速的跳出来一批准确的样本。

以这批数据为种子,重新训练模型,接着用这个初级模型从原始数据中找到同类的数据。

1.3 寻找更多的有效样本

虽然AI模型讲究的是样本越多越好,但样本的内容细节却是个不可忽视的环节。在多个类别的样本集合中,如何去权衡每个类别的样本数量、在单类别样本中,如何保证每个样本个体的特征分布合理,这才是样本关键所在。

我们要做的就是,要让样本在多个类别的分布中尽量均衡,并且在单个类别的中的样本分布也要最大化的均匀覆盖。

在得到第一批小具规模的数据后,使用了雅可比矩阵来寻找模型的分类边界。同时,将边界特征作为索引,从海量杂乱的数据集中找到匹配的样本。这样可以保证使用少量的数据也可以训练出更好的模型。最主要的是降低了人工。(相关技术均在《深度学习之TensorFlow:工程化项目实战》一书的黑箱攻击部分可以找到原理及代码)

最终,基于nsfw_data_scrapper数据集提炼出了3万张图片,该样本训练后的模型,在原有20张人肉分离好的nsfw_data_scrapper数据集上可以达到准确率97%以上的效果。

二、模型的选取与训练

深度学习技术发展到今天,在图片识别方面已经有很多模型可以直接拿来使用了。并不需要额外再进行设计。例如,优秀的模型有ResNeXt、PNASNet、EfficientNet、DenseNet、Inception系列等。

当然,如果想将其效果达到更加,也可以去尝试一些细节的改进。如果手里的算力有限,还可以要考虑降低批次、使用NASNetMobile之类的小模型等方式。

下面就来聊聊使用现有模型微调过程的细节技术。

2.1 算力不足的训练方案

对于一些大公司来讲,算力的获取像拧开水龙头一样简单(因为有钱!土豪!)。对于一些小公司或个人的学习机,不得不在算力面前折腰。在算力受限的情况下,要保证模型的精度和训练的速度,尽量要选取输入尺寸较小的预训练模型。例如ResNet就比PNASNet的输入尺寸小,所占的显存也小。同时还要考虑模型的参数,(直接比较预训练模型的大小即可)。

在训练过程中,一旦使用了小批次进行训练时,一定要考虑批量正则化的问题。因为批量正则化在批次很小的情况下(为1)也就失去了批次的意义。反而影响了模型的精度。

2.2 数据增强

数据增强是指在训练过程中,对原始样本进行扭曲、变形、调节对比度等变化处理。

对于有过AI经验的读者,数据增强已经没什么可说的。对于初次接触AI的读者,需要注意,一定要将训练数据进行增强处理。它是扩充样本的捷径。

需要注意的细节是,数据增强在模型的搭建、和样本构建环节最好不要使用,它会干扰你对已有样本、模型的原始判断。

当一切工作做好之后,才可以使用数据增强做最后的模型能力提升。

具体实现,可以在《深度学习之TensorFlow:工程化项目实战》一书中,找到相关代码。

2.3 模型的搭建

说到技术的核心部分了,也就是写代码将模型搭建起来支持训练。这部分不会做聊啥都没用。毕竟还是要通过代码来实现的。

搭建模型的代码主要是分为3步骤:

  • 加载预训练模型
  • 进行微调训练
  • 进行全局联调训练

具体的实现还要看使用哪种框架。在《深度学习之TensorFlow:工程化项目实战》一书中,有4种框架的实现方法,基于slim的、基于tf.keras的、基于tf-Hub的、基于T2T的。都有相关的代码和实例演示。读者可以参考实现。其中:

  • slim框架适用与TensorFlow2.0以下版本
  • Tf.keras框架适用与TensorFlow的全部版本
  • tf-Hub和T2T框架更为高级,几乎不用写一行代码。直接在命令行里运行即可

如果没有书的小伙伴,还可以参考:

基于微调模型文章“连载二:PyCon2018|用slim微调PNASNet模型(附源码)”的代码

编写代码虽然是工程的核心,但不是本文的重点。这里就介绍这么多吧。

三、模型的优化方法

当你完成了上述的操作后,觉得还不过瘾。这里再介绍些其他的方法,可以让模型更上一层楼。

3.1 混合优化器

一般训练过程中都是使用Adam优化器。再训练最后,还可以将优化器换做SGD,进行微调。根据大量的经验证明,当换作SGD,并用很小的学习率时,还会使Adam瓶颈后的精度继续上升。

在手动微调时,要注意,将保存模型设为“只保存最优的模型”,这样才不会错过优化过程中的最佳结果。

3.2 多模型集成

如果你是土豪,可以使用多模型集成的方法,联合训练,并将最后的结果加权综合。可以使模型的精度更上一层。

3.3 尝试用更多的技术来修改模型

虽然已有的那些大名鼎鼎的模型广为使用。但难免无法掩盖时间的印记。AI技术日新月异的今天,我们可以借鉴很多新的技术细节,并将其优化到原有的成熟模型中去。往往会得到更好的结果(当然还需要实际的实验比对)。例如:

  • 基于卷积网络的多种归一化操作
  • 带有剪枝的dropout等

具体实现,同样可以在《深度学习之TensorFlow:工程化项目实战》一书中,找到相关代码。

3.4 制作对抗样本来提升模型精度

该方法是从样本角度提升模型能力,即,对已经训练好的模型进行攻击.得到一批对抗样本,用该样本进行训练模型,提升模型的识别精度.

该过程是个循环操作.通过若干次的循环之后,不仅可以提高模型的精度,还可以增加模型的抗攻击能力.

对抗样本的制作方法有很多种,在《深度学习之TensorFlow:工程化项目实战》一书中,也提供了一套制作对抗样本的方法及对应的代码。

另外在丰富样本方面,还有更多其它的技术手段,可以看后文在发布正式版本过程中的介绍。

四、鉴黄师产品的迭代实战

鉴黄师产品被部署到了lab.aianaconda.com网站上,同时也在公众号“相约机器人”下面的“AI实验室”菜单中,以小程序的形式对外开放。该产品一共迭代了两次,alpha版本和正式版本。

AI鉴黄师界面

其背后使用的是tf-serving技术,有关tf-serving的方法,也可以在《深度学习之TensorFlow:工程化项目实战》一书中找到教程和对应的代码实例。

下面聊点轻松的话题,讲讲鉴黄师产品的迭代故事。

4.1 发布alpha版本

在发布alpha之前,我们对模型进行了海量数据的测试.发现了很多有趣的现象,从这些图片中,可以看出模型还是有很多样本盲区的。它确实是学到了些东西,只不过它还需要学习更多的图片。

4.1.1 样本盲区

例如,模型对于非正常图片识别不准。比如图片特别小,特别大。或是某种图形很像黄色图片。下图就是mnist数据集中的一个样本。模型会认为这是个黄色图片。

Minst中的1

同样的问题还有如下:

4.1.2 修复模型

这个工作已经跟深度学习的知识无关了。需要通过编写爬虫程序,从网上爬取大量的图片进行测试。最终搜集到了大概多500M的样本盲区数据集,将这些数据放到模型中,再次训练,使模型具有更大的泛化能力。之后,便有了鉴黄师alpha版的正式发布。

4.1.3 模型能力

随机爬取135922张图片,其中正常图片52634张,卡通黄色图片11066张,真人黄色图片72222张。识别结果:

  • 正常图片误判成黄色图片:1973张 (1973/52634= 0.037)
  • 漏判的卡通黄色图片:217 张( 217/11066=0.019)
  • 漏判的真人黄色图片:770张 (770 /72222= 0.010)

4.2 发布正式版本

在alpha版本的发布之后,陆续搜到了很多建议和测试样本。这些宝贵的交互信息在正式版本的发布中发挥了很大的作用。

4.2.1 仍然存在的样本盲区

鉴黄师alpha版上线之后,与我们预期的一样,收到了好多测试模型的图片。其中不乏比较刁钻的样本,也是我们实实在在发现模型的问题。具体如下:

上面的4副图,很好的表达了模型自身的特点与所暴漏的问题。在一些具有相似黄色图片上,仍然会识别错误。

4.2.2 用模型能力可视化分析样本盲区

再次发现样本盲区后,引起了我们的深度思考。要想深入的样本的特征与模型识别的关系,就得先从模型所能够识别的特征入手,沿着这个思路,我们将模型的识别能力进行了可视化。试图将模型的识别能力清晰的识别出来,并从中发现原因。

为了让模型能力可视化,将模型的特征处理部分提取出来,并与分类处理部分的权重相乘,可以还原出最终分类结果对应的特征数据。接着再将特征数据还原到原始输入图片的尺寸,并用热力图显示出来。叠加到原始图片上。这样就可以看到模型在特征处理过程中所识别的敏感区域了。

按照这种方法,进行编码实现之后,便可以找到模型识别错误的原因。如下图所示:

对于上图这种情况,可以看出,模型还是对隐私部位有一定识别能力的。只不过精度稍微差了些。这说明模型还是需要大量的样本。

4.2.3 利用可视化结果,进一步强化样本

有了模型可视化的方法,寻找有价值的样本将不再困难。继续沿着这个思路,将模型所发现的黄色图片上的敏感区域抹去。用修改后的图片进行二次训练,可以使模型对特征的识别更加精确。

例如:下图中有两个漏点的地方,而模型只识别出来一个,可以用程序将模型识别的敏感区域,用高斯噪声进行混淆。这样当前模型会识别它是个正常图片。

这便是个有价值的样本,将其放到模型里二次训练,便可以使模型发现的敏感区域跟为精准。经过训练后的模型,用热力图显示如下:

同时,还会发现,模型关注了错误的敏感区域. 例如下图,模型将膝盖部分当成了敏感区域.这种情况也可以将其做成样本.二次训练.

经过训练之后,我们清晰的可以看出模型识别盲区样本的判定依据,例如下图,模型成功的观察到了小白鼠的两只耳朵,而认为它不是黄色图片。

4.2.4 打码模型的产生

利用这种技术,可以对所有的黄色图片进行分析,并将其敏感区域进行抹去.于是该模型便有了另一个作用,自动添加马赛克.

4.2.5 模型能力

与alpha版本的评估能力不同,正式版本的能力不再对真人黄色图片和卡通黄色图片的细节能力进行评估。而是只对正常图片的错判率和黄色图片的漏判率进行评估。具体如下:

在原有alpha版本所使用的13万张测试图片的基础上,进一步将测试数据扩大到21多万张,其中正常图片17万张,黄色图片5万张。识别结果:

  • 正常图片误判成黄色图片:150张 (150/170000= 0.0008,小于千分之一)
  • 漏判的黄色图片:400 张( 400/50000=0.008,小于百分之一)

从模型的指标来看,更侧重于对正常图片的误判率方面的精度。这也是来自真实场景中的一个实际需求,在鉴黄师的应用环境中,最终的结果还需要由人来审核。在流量特别大的网络场景下,误判率升高一个百分点,对于人工的额外工作都是巨大的。

能够商用的模型,必须要根据真实的环境需求做出变化。这也是为什么将模型训练成误判率精度优先的原因。

4.2.6 批量测试工具

在发布产品的同时,也提供了批量测试工具。方便用户对自己本地的图片进行批量测试。

下载地址:

https://www.aianaconda.com/index/DownloadCode

点击如下链接即可下载.

批量测试工具的实用非常简单,具体步骤如下:

1 将测试的图片文件放到test目录下

2 在windows 的cmd 命令行下来到改目录

执行该exe文件:

F:\dszn\web\backweb\dabao\dist\webrest_test>webrest_test.exe

3 在目录下找到识别结果进行查看

打开识别结果.csv后,内容如下:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 相约机器人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档