nsfw指“Not Suitable For Work”,就是含蓄的表达不宜浏览的内容。最近需要做一小部分关于色情图片识别的工作,就把最基础的工作内容记录下来。
用于鉴别色情图片的现有方法基本有3种思路:
利用python的nonude模块直接识别
这个思路是我看一篇博客中的介绍:用 Python 鉴别色色的图片。这篇博客介绍的还是很详细的,这个模块的原理是根据计算暴露皮肤的百分比来判断的,超过15%就认为是。实现过程简单,直接导入模块就能使用,但是该模块已经有3年没有更新过了,识别结果只有“真”“假”两种情况,准确率比较低。
统计人体皮肤的面积占比
这种方法的思路就是找出皮肤区域,然后通过一定的统计特征,判断是否为色情图片。原作者给出了不同色彩空间下的皮肤判断公式,包括RGB,HSV,YCbCr三种空间。这种方法的参数可以自行调整,看了下,作者给出的效果还不错,但是结果也是只能判断出真假两种情况。
利用yahoo提供的open_nsfw模型及其拓展模型识别
yahoo提供了一个open_nsfw开源程序,链接:http://github.com/yahoo/open_nsfw,这个程序是用深度学习模型做的,主要是vgg,我没有深究里面的模型结构,看了下效果,对图片采用打分的方式,分数大于0.8就说明很有可能是了。目前来说,这个模型的效果和可移植性都非常高,因此我主要考虑这种方法。
当然,yahoo公布的这个模型是2年前做的了,到现在为止,已有很多人对此进行了拓展衍生。
上面也提到了yahoo这个开源程序的问题,就是版本不对应。于是我就找基于tensorflow的模型,还好找到了。附上链接:https://github.com/mdietrichstein/tensorflow-open_nsfw
https://gitee.com/zhangshengfu/NSFW-Python.git
使用第二个程序:
测试可以直接使用,下面直接上测试结果:
结果为:
Python–>>result:[0.43040982 0.5695902 ],path:D:/PythonProject/NSFW-Python/testImages\timg.jfif
使用tf模型,适宜观看指数0.43,不适宜观看指数0.57
TFLite–>>result:[0.64222586 0.3577741 ],path:D:/PythonProject/NSFW-Python/testImages\timg.jfif
使用TFLITE模型,适宜观看指数0.64,不适宜观看指数0.35
目前来看,只是识别是否色情图片这方面,已经做的挺好的了,但是个人感觉如果想提高识别效果,一方面需要人体关键点检测,另一方面,一些人体动作和眼神,表情识别也有助于做进一步的判断。
如果想要自己重头训练的话,github上倒是有一些开源数据集。。。。。。。。先给出两个链接地址:
https://github.com/EBazarov/nsfw_data_source_urls
https://github.com/alexkimxyz/nsfw_data_scraper
(目前)前者总计159种不同类别的色情图片,约158万张图片链接,后者总计6类,约22万张。可以考虑自己写脚本把这些图片爬出来。需要注意的就是很多图片的链接是来自reddit,tumblr的,需要。
04630835/article/details/87178385