一、背景

nsfw指“Not Suitable For Work”,就是含蓄的表达不宜浏览的内容。最近需要做一小部分关于色情图片识别的工作,就把最基础的工作内容记录下来。

二、现有方法

用于鉴别色情图片的现有方法基本有3种思路:

1. 利用python的nonude模块直接识别

这个思路是我看一篇博客中的介绍:用 Python 鉴别色色的图片。这篇博客介绍的还是很详细的,这个模块的原理是根据计算暴露皮肤的百分比来判断的,超过15%就认为是。

实现过程简单,直接导入模块就能使用,但是该模块已经有3年没有更新过了,识别结果只有“真”“假”两种情况,准确率比较低。

2. 统计人体皮肤的面积占比

这个思路还是比较好理解的,可以先参考两篇博客:

[1]Python3 色情图片识别

[2]Python 3 色情图片识别  (这篇文章包含了代码部分)

这种方法的思路就是找出皮肤区域,然后通过一定的统计特征,判断是否为色情图片。原作者给出了不同色彩空间下的皮肤判断公式,包括RGB,HSV,YCbCr三种空间。这种方法的参数可以自行调整,看了下,作者给出的效果还不错,但是结果也是只能判断出真假两种情况。

3. 利用yahoo提供的open_nsfw模型及其拓展模型识别

yahoo提供了一个open_nsfw开源程序,链接:http://github.com/yahoo/open_nsfw,这个程序是用深度学习模型做的,主要是vgg,我没有深究里面的模型结构,看了下效果,对图片采用打分的方式,分数大于0.8就说明很有可能是了。目前来说,这个模型的效果和可移植性都非常高,因此我主要考虑这种方法。

当然,yahoo公布的这个模型是2年前做的了,到现在为止,已有很多人对此进行了拓展衍生,推荐下面几篇:

[3]Resnet改进的色情图片检测-nsfw (作者是用C++复现的原程序)

[4]利用人工智能检测色情图片 (作者对原代码中数据预处理部分进行了解读,并将程序用C++复现)

[5]OpenCV实践之路——雅虎色情图片检测神经网络试用报告 (作者的试用历程)

[6]【严肃脸】使用caffe实现色情图片的识别 (作者对原程序进行修改以用于视频的鉴别)

三、利用yahoo的open_nsfw识别色情图片(基于caffe)

提前注:该方法在做到一半的时候放弃了,所以这节内容是半成品。。。。

这里使用的是雅虎官网的代码:https://github.com/yahoo/open_nsfw,可以打开里面的classify_nsfw.py文件进行查看,可以看到该程序使用了caffe,而且是用python2.7做的。因此我们如果要使用open_nsfw还需要做一些工作。这里列出一些关键问题:

1. 安装caffe模块

在python中安装caffe,网上有挺多教程,不过看起来都非常复杂,而且很多都是在ubuntu系统下安装的,我自己是用win10系统处理,所以一直再想有没有更简单的方法,后来想到了用anaconda prompt,一个类似于cmd的命令提示符程序,只需要1行代码,还挺方便的。

找到anaconda prompt程序,打开,然后输入:

conda install caffe

剩下的就只管程序自己运行完就好了。运行过程中会自动更新需要安装的模块。

出现下面这种情况就是caffe安装好了:

安装好caffe之后,可以测试一下classify_nsfw.py程序,不过出了问题:

我做到这里就没有继续往下做了,因为觉得太麻烦了。。。。当然,如果继续做下去应该也是能成功的。

2. 修改classify.py文件

前面提到了,yahoo开源的这个程序是拿python2.7写的,而我用的是python3.6,这其中还是有一些语法不一样的地方。主要修改的地方的有两个,一个是IO模块,另一个是print函数:

# classify_nsfw.py文件中的第15行
from StringIO import StringIO
# 修改为:
from io import StringIO

另外一个是print函数:

# python2.7中的print函数是不带(),但是python3.6中是带()的,这里需要修改
print "NSFW score:  ", scores[1]
# 类似的print函数全部修改为:
print("NSFW score:  ", scores[1])

由于我的版本和这个开源的版本差的比较多,而且caffe的配置又有些麻烦,所以后来就放弃了这个程序。

四、利用yahoo的open_nsfw识别色情图片(基于tensorflow)

上面也提到了yahoo这个开源程序的问题,就是版本不对应。于是我就找基于tensorflow的模型,还好找到了。附上链接:https://github.com/mdietrichstein/tensorflow-open_nsfw

打开看了一下,这个程序用的是tensorflow1.12,为了放置不必要的麻烦,我把我的tensorflow降到了1.2.1版本,然后改了一下部分参数:

测试可以直接使用,下面直接上测试结果:

第一张得分0.63,打开看看确实只是艺术照而已。

第二张风景人像照,得分0.001:

第三张得分0.038,其实露出的皮肤面积比较多,但是得分并不高,说明这个算法相对比较智能一些:

第四张得分0.01:

第五张得分0.99,不过这张图已经很明显了,确实not suitable for work,下图打码了以防屏蔽:

五、分析

1. 目前来看,只是识别是否色情图片这方面,已经做的挺好的了,但是个人感觉如果想提高识别效果,一方面需要人体关键点检测,另一方面,一些人体动作和眼神,表情识别也有助于做进一步的判断。

2. 如果想要自己重头训练的话,github上倒是有一些开源数据集。。。。。。。。先给出两个链接地址:

https://github.com/EBazarov/nsfw_data_source_urls

https://github.com/alexkimxyz/nsfw_data_scraper

(目前)前者总计159种不同类别的色情图片,约158万张图片链接,后者总计6类,约22万张。可以考虑自己写脚本把这些图片爬出来。需要注意的就是很多图片的链接是来自reddit,tumblr的,需要翻墙。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐