nsfw指“Not Suitable For Work”,就是含蓄的表达不宜浏览的内容。最近需要做一小部分关于色情图片识别的工作,就把最基础的工作内容记录下来。
用于鉴别色情图片的现有方法基本有3种思路:
这个思路是我看一篇博客中的介绍:用 Python 鉴别色色的图片。这篇博客介绍的还是很详细的,这个模块的原理是根据计算暴露皮肤的百分比来判断的,超过15%就认为是。
实现过程简单,直接导入模块就能使用,但是该模块已经有3年没有更新过了,识别结果只有“真”“假”两种情况,准确率比较低。
这个思路还是比较好理解的,可以先参考两篇博客:
[1]Python3 色情图片识别
[2]Python 3 色情图片识别 (这篇文章包含了代码部分)
这种方法的思路就是找出皮肤区域,然后通过一定的统计特征,判断是否为色情图片。原作者给出了不同色彩空间下的皮肤判断公式,包括RGB,HSV,YCbCr三种空间。这种方法的参数可以自行调整,看了下,作者给出的效果还不错,但是结果也是只能判断出真假两种情况。
yahoo提供了一个open_nsfw开源程序,链接:http://github.com/yahoo/open_nsfw,这个程序是用深度学习模型做的,主要是vgg,我没有深究里面的模型结构,看了下效果,对图片采用打分的方式,分数大于0.8就说明很有可能是了。目前来说,这个模型的效果和可移植性都非常高,因此我主要考虑这种方法。
当然,yahoo公布的这个模型是2年前做的了,到现在为止,已有很多人对此进行了拓展衍生,推荐下面几篇:
[3]Resnet改进的色情图片检测-nsfw (作者是用C++复现的原程序)
[4]利用人工智能检测色情图片 (作者对原代码中数据预处理部分进行了解读,并将程序用C++复现)
[5]OpenCV实践之路——雅虎色情图片检测神经网络试用报告 (作者的试用历程)
[6]【严肃脸】使用caffe实现色情图片的识别 (作者对原程序进行修改以用于视频的鉴别)
提前注:该方法在做到一半的时候放弃了,所以这节内容是半成品。。。。
这里使用的是雅虎官网的代码:https://github.com/yahoo/open_nsfw,可以打开里面的classify_nsfw.py文件进行查看,可以看到该程序使用了caffe,而且是用python2.7做的。因此我们如果要使用open_nsfw还需要做一些工作。这里列出一些关键问题:
在python中安装caffe,网上有挺多教程,不过看起来都非常复杂,而且很多都是在ubuntu系统下安装的,我自己是用win10系统处理,所以一直再想有没有更简单的方法,后来想到了用anaconda prompt,一个类似于cmd的命令提示符程序,只需要1行代码,还挺方便的。
找到anaconda prompt程序,打开,然后输入:
conda install caffe
剩下的就只管程序自己运行完就好了。运行过程中会自动更新需要安装的模块。
出现下面这种情况就是caffe安装好了:
安装好caffe之后,可以测试一下classify_nsfw.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这个开源程序的问题,就是版本不对应。于是我就找基于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的,需要。