OpenCV实践之路——雅虎色情图片检测神经网络试用报告

Posted 冰不语

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV实践之路——雅虎色情图片检测神经网络试用报告相关的知识,希望对你有一定的参考价值。

本文由@星沉阁冰不语出品,转载请注明作者和出处。

文章链接:http://blog.csdn.net/xingchenbingbuyu/article/details/52821497

微博:http://weibo.com/xingchenbing 


十一的时候,老司机再次发车,雅虎开源了其色情图片检测神经网络。老司机们得到消息第一时间就搭建了自己的检测平台。大家纷纷表示根本找不到数据测试的同时不忘言不由衷地抱怨以前写代码累脑袋,现在写代码累腰。

有人说的好:一个爬虫+色情图片检测神经网络=一个会发车的程序猿。




然而我一直等到现在才有开始试用,难道还不能说明问题吗!

话不多说,开始我的试用之旅。首先找到雅虎开源项目的GitHub网址,也就是这里:yahoo/open_nsfw。打开之后我们看到开源页面是这样的:



可以看到雅虎称那些图片为Not Suitable For Work,不适合工作时间看的图片。果然比色情图片这个称呼文雅多了。而且预测结果为0-1之间的数字,这个值越小,说明不是nsfw的可能性越高,值越大,说明是nsfw,也就是是色情图片的可能性越高。这个0-1之间的值,我称之为一张图片的“色情度”!

再往下可以看到开源的文件:主要就是classify_nsfw.py和nsfw_model文件夹。

另外一个是协议一个是readme文件。如果想要详细了解的话可以顺着readme文件里面的链接到雅虎的blog里面看更多的细节。

我们想要搭建自己的平台运行的话,首先要把这些文件clone或者download到本地。在上面的图片的右上角可以看到有一个非常显眼的绿色按钮:Clone or download。

点开之后是这样:


我电脑上安装的有Git,所以我可以打开Git bash,点击上图框1,复制项目地址之后,输入命令:

git clone https://github.com/yahoo/open_nsfw.git

当然,也可以用更直接的方式,直接点击红框2,Download ZIP。直接下载压缩包。

不论哪种方式,现在我们在本地得到下面这么一个文件夹,里面内容与github上面的内容一模一样:


其中,classify_nsfw.py,就是我们要运行的程序。文件夹nsfw_model里面是雅虎训练好的神经网络模型resnet_50_1by2_nsfw.caffemodel和模型的配置信息deploy.prototxt。打开classify_nsfw.py就能看到程序用到的库:



大部分库都是很常见很容易安装的,直接pip install之。推荐安装Anaconda,这些库就都自动安装了。有难度的只有一个(如果顺利的话,不像我一样出意外)——caffe。但是网上教程很多,找一个适合自己的,虽然会费一番功夫,但是也不是不可能完成的任务。这里给出一个链接仅供参考: 在Windows下编译Caffe与其Python接口

如果上面的依赖都安装成功的话,就可以开始测试了。首先在我们的与*.py相同的文件夹下放一张我们测试用的图片,我起名叫test.jpg。


如果是直接通过Python配置的,就打开windows自带的命令提示符,如果是安装的Anaconda,就打开Anaconda带的Anaconda Prompt。首先用cd命令进入程序所在的文件夹,比如我的程序路径是C:\\Users\\bingbuyu\\Downloads\\open_nsfw-master\\open_nsfw-master,所以我输入以下命令:

cd C:\\Users\\bingbuyu\\Downloads\\open_nsfw-master\\open_nsfw-master

之后按照官方指示输入以下命令

python ./classify_nsfw.py --model_def nsfw_model/deploy.prototxt --pretrained_model nsfw_model/resnet_50_1by2_nsfw.caffemodel test.jpg
由于命令太长,所以可以新建一个文本文档保存起来,这样就可以复制粘贴然后只需要改一下测试图片的名称就行了。

如果一切顺利的话,命令行黑框就会刷刷刷出很多内容,最后给出一个结果:




最后红框给出的就是测试的分数。雅虎给出的一个标准是低于0.2有很大可能不是色情图片,高于0.8有很大可能是色情图片,中间分数越高越有可能,也即,色情度越高。这次用的测试图片是下面这一张,得分0.3也算是恰当。




到这里,一般来说就该结束了。如果一切顺利的话,本篇博客也就不能放在OpenCV实践之路的专栏里了,因为直到现在,前面的一切跟OpenCV并没有半毛钱的关系!

然而!!!出现了然而!!!上面说的是一切顺利的结果,然而我的过程并不顺利。运行程序的时候出现了Bug,就是下面这个:




而且我限于水平,用Google百度了一下还解决不了。这就尴尬了。但是可以看出来问题是大概在StringIO模块。看一下代码中出现StringIO的地方一共有三个:




在定义的resize_image()函数里面的第31行和35行,大概是用来存储图片路径的。顾名思义,resize_image()函数是用来改变图片的大小,改成256x256。

出现StringIO的地方还有下面这个地方:


第63行,作用也是保存图片路径,而且这一行上面就是对resize_image()函数的调用。既然是读取图片的时候的问题,而且我还不熟悉怎么改StringIO,所以全部改成我熟悉的OpenCV吧,而且OpenCV里面resize()函数用来改变图片大小,前面那个定义的resize_image()函数也可以不要了。

既然上了opencv,那么PIL模块也没有存在的必要了,功能重复,而且需要改动的代码还不多。于是改完的代码就变成了opencv版本的。

首先当然是引入opencv模块,Python里面叫cv2。配置这个就简单多了,也给个参考链接吧:Python下使用OpenCV


注释掉定义的resize_image()之后,在第三处出现StringIO的地方修改成下面这个样子:


这里用了一个临时图片temp.jpg来进行opencv和caffe的交互。这样就完全不需要StringIO了。上面结果正是这一切做完之后的才得到的。修改后的代码在GitHub上。

这个时候就可以尽情测试图片的色情度了。只需要复制方才的命令,改一下图片名称,然后Enter就行了。

“然而,我根本找不到测试数据样本!”









以上是关于OpenCV实践之路——雅虎色情图片检测神经网络试用报告的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV实践之路——人脸检测(C++/Python)

OpenCV实践之路——人脸检测(C++/Python)

OpenCV实践之路——使用imread()函数读取图片的六种正确姿势

openCV实践项目:图片文本检测

OpenCV实践之路——人脸识别之一数据收集和预处理

opencv学习之路(36)运动物体检测