利用人工智能检测色情图片 - CSDN博客

标签: | 发表时间:2018-05-12 15:48 | 作者:
出处:https://blog.csdn.net

色情内容在中国一直处于严格的监管,即使这样,互联网上还是很容易就能访问到色情内容。还记得曾经的“绿坝-花季护航”软件么?由于其识别效果差、软件不稳定,最后不了了之,浪费了大量的人力和金钱。

随着计算机视觉和深度学习的发展,算法已经成熟,利用人工智能,我们能够更加精确的识别色情内容。现在有很多云服务商提供鉴黄服务,通过集成鉴黄API到产品中,就可以给产品增加色情过滤功能。这种模式对于大多数互联网产品非常有效,可以极大的降低运营风险(对于博客、图床、直播等服务提供商而言,过滤色情、暴力等内容是重中之重)。但对于一部分产品而言,这种模式存在一些不足:

  1. 鉴别图片、视频内容等必须通过网络服务进行,响应速度难以保证;
  2. 通常鉴黄服务按次或者按照流量计费,对于个人开发者而言,有成本负担;

open_nsfw

现在有个好消息,雅虎开源了其深度学习色情图片检测模型open_nsfw,项目地址: http://github.com/yahoo/open_nsfw,这里的NSFW代表Not Suitable for Work。项目提供了基于caffe的深度神经网络模型和一个python脚本,可以供测试:

      python ./classify_nsfw.py \
--model_def nsfw_model/deploy.prototxt \--pretrained_model nsfw_model/resnet_50_1by2_nsfw.caffemodel \test_image.jpg

定义NSFW内容是非常主观的,在某个国家或地区会引起反感的内容可能在另一个地方完全没问题。所以,open_nsfw模型只关注一种类型的NSFW内容:色情图片。但需要注意的是,该模型不能解决草图、漫画、文本等内容的识别。

色情图片的判别也是非常主观的,所以该模型并不会直接给出某个图片是否色情的结果,而是给出一个概率(0-1之间的分数)。一般而言,得分小于0.2表示图像很可能是安全的,评分大于0.8则基本可判定图片属于色情图片。如果得分介于这两个值之间,则需要程序员根据需求来设定一个阀值。如果需要比较严格的过滤,设一个比较低的阀值,反之设一个比较高的阀值。

集成open_nsfw到C++程序

open_nsfw提供了一个python脚本,google了一圈,也没有找到有人将open_nsfw集成到C++代码中。好在classify_nsfw.py这个脚本比较简单,而caffe提供了C++的例子cpp_classification,结合这两部分的代码,我编写了一个C++的鉴黄程序,源码参考: https://gitee.com/mogoweb/dpexamples

当然看似简单的代码翻译工作,遇到的坑也不少,下面就总结一下C++代码中需要注意的地方。

图片预处理

在classify_nsfw.py中,编写了一个resize_image函数来处理图片缩放,没有采用caffe内置的图片缩放程序。代码注释中解释是因为训练时使用了这个缩放算法,所以为了达到最好的效果,测试中也需要采用该缩放算法。随后又对图片进行了一次裁剪,因为调用resize_image缩放为256x256大小,而模型接受的size为224x224。

      img_data_rs = resize_image(pimg, sz=(256,256))image= caffe.io.load_image(StringIO(img_data_rs))

H, W, _ =image.shape
_, _, h, w = caffe_net.blobs['data'].data.shape
h_off =max((H - h) /2,0)
w_off =max((W - w) /2,0)
crop =image[h_off:h_off + h, w_off:w_off + w, :]

在C++代码中,我使用了caffe中提供的opencv方法处理这个步骤:

      cv::Mat img = ReadImageToCVMat(file,256,256);
...// crop imagecv::Sizesize= sample.size();intH =size.height;intW =size.width;inth = input_geometry_.height;intw = input_geometry_.width;inth_off = std::max((H - h) /2,0);intw_off = std::max((W - w) /2,0);
sample(cv::Rect(w_off, h_off, w, h)).copyTo(sample_resized);

数据预处理

在classify_nsfw.py中,我们可以看到这样一段代码:

      caffe_transformer= caffe.io.Transformer({'data': nsfw_net.blobs['data'].data.shape})# move image channels to outermostcaffe_transformer.set_transpose('data',(2, 0, 1))# subtract the dataset-mean value in each channelcaffe_transformer.set_mean('data', np.array([104, 117, 123]))# rescale from [0, 1] to [0, 255]caffe_transformer.set_raw_scale('data', 255)# swap channels from RGB to BGRcaffe_transformer.set_channel_swap('data',(2, 1, 0))

这段代码其实是对数据做某种变换,将读入的数据转换为caffe模型能够接受的格式。

      caffe_transformer.set_transpose('data',(2, 0, 1))

该语句困扰了我好长时间,不知道在C++程序中该如何处理。后查网络资料,才了解到因为caffe.io读取的图像为HWC(H:高,W:宽,C:颜色)矩阵,而caffe模型需要(CHW)格式,所以需要对矩阵做一个变换,将颜色值维度提前到最前面。(2, 0, 1)的含义就是将原来数据的第2, 0, 1列按照新的顺序重新排列。

      caffe_transformer.set_raw_scale('data', 255)

这个处理是因为使用caffe.io读取的颜色值归一化为0~1之间的数,而caffe模型接受的是一个字节的整数,范围0~255,所以需要进行一个放大。

在C++代码中,由于采用了opencv进行图像处理,不需要上面两步的变换处理。

      caffe_transformer.set_mean('data', np.array([104, 117, 123]))

在很多示例中,均值通常从均值文件中加载,这里直接给了一个固定值。所谓均值,可以理解为数据的算术平均值。通常输入数据减去均值,是为了减少奇异值(异常的值,比平均值大很多或小很多的值)的影响。这里是一个三元组,分别代表RGB通道上的均值。

对应的C++代码如下:

      cv::Matsample_normalized;cv::subtract(sample_float, mean_, sample_normalized);

接下来的代码是RGB转BGR,这个比较容易理解。

      caffe_transformer.set_channel_swap('data',(2, 1, 0))

查看了一些caffe的C++例子,均没有这个步骤,可能cv::Mat中已经能够正确判断出RGB和BGR,所以代码中没有增加这一步骤。

对比测试

这个程序是否能够如愿工作呢?让我们找一些图片测试一下。考虑到内容审查,这里进行测试的图片均不是严格意义上的色情图片,只是裸露程度不同。下面使用C++程序和open_nsfw python脚本测试的结果进行对比。

image

C++ : 0.6122

python: 0.875480949879

image

C++ : 0.2536

python: 0.0773676931858

image

C++ : 0.6319

python: 0.782215833664

image

C++ : 0.0914

python: 0.0774072110653

image

C++ : 0.0073

python: 3.04092318402e-05

从结果可以看出,使用C++程序进行测试,结果基本符合预期,但是和python版本还是有一些差距,猜测问题可能在于对图片进行缩放采用的算法不同,如果要获得好的结果,训练和测试阶段对数据的预处理需要一致。另外一个可能是没有RGB到BGR的转换,这个还需要再验证。

如果你有兴趣,可以找一些尺度更大的图片测试,看看是不是能够正确的识别出来。


相关 [利用 人工智能 色情] 推荐:

利用人工智能检测色情图片 - CSDN博客

- -
色情内容在中国一直处于严格的监管,即使这样,互联网上还是很容易就能访问到色情内容. 还记得曾经的“绿坝-花季护航”软件么. 由于其识别效果差、软件不稳定,最后不了了之,浪费了大量的人力和金钱. 随着计算机视觉和深度学习的发展,算法已经成熟,利用人工智能,我们能够更加精确的识别色情内容. 现在有很多云服务商提供鉴黄服务,通过集成鉴黄API到产品中,就可以给产品增加色情过滤功能.

人工智能技术新进展

- - 生命奥秘
新的计算机人脑模型可以模拟更加复杂的人类行为. 人类的大脑是一个高度复杂的器官,在众多对人类大脑的研究工作当中就包括了从分子水平到人类行为活动水平等多个层面采集大脑相关信息的工作. 这种超大范围的研究方式很有可能会让大脑研究走向专业不断细化的发展方向,这种趋势虽然有利于大脑研究的不断深化,可是同时也会带来知识碎片化的结果.

由人工智能管理的港铁

- - Solidot
港铁公司运营香港地铁跻身全世界最出色地铁系统之列,它的准时抵达记录高达99.9%,超过了伦敦和纽约地铁. 数百公里长的繁忙地铁系统需要大量人力维护,港铁公司平均每周有多达1万人执行2600项维护工作,工人们工作都是提前规划好的,由人工智能进行管理. 港铁公司计划将人工智能推广到它在其它城市运营的地铁系统,其中北京有可能第一个采用.

[微言]人工智能有多可怕?

- - 海德沙龙(HeadSalon)
@whigzhou: 花了两个多小时思考强人工智能引出的问题,得出的结论是:相信陪审团. 然后发现,这不就是 我去年得出过的结论嘛~哈. 不过,其间经历的逻辑链条那是相当漫长,而且有了一些新想法,容我慢慢道来. @whigzhou: 1)强人工智能很快(也就是几十年内)会出现;2)强AI的出现会让世界很不一样,但并不像有些人所想象的#那么#不一样;3)其实,“只有一小撮人(或组织)有能力做一些绝大多数人做不到、甚至完全无法理解的事情”——这早就不是什么新鲜事了.

注意:人工智能非你所想!

- - 译言最新精选
译者: 果果向前冲 原文地址: gizmodo.com. 艾萨克·阿西莫夫的机器人三定律还不足以控制人工智能. 上图是幻想插画家之父迈克尔·蕙兰为《曙光中的机器人》设计的封面. 近20年前“深蓝”与盖里·卡斯帕罗夫对战象棋获胜一事被誉为史上最具意义的机器智能测试. 时至今日,谷歌的“阿法狗”与国手李世石在围棋锦标赛中决一胜负,对决前三局两次告捷,表明多年来人工智能经历了显著进化.

恰到好处的人工智能

- - 可能吧
技术不应该给用户带来使用难度,而是提高效率,并恰到好处地提供帮助. 这是我在使用 Google 智能音箱 Google Home 之后的总结. 智能、AI,是今年创投圈的关键词. 如果你在京东、淘宝上搜索各种家电,多多少少这些产品都会说自己是「智能」的,到底什么是智能. 把安卓系统塞到硬件里,这个硬件是不是就是智能了.

2017年人工智能研究报告

- - 互联网数据中心-199IT
81%的IT公司正在或者计划投资人工智能(AI). Cowen预测人工智能将会将人类的生产力提升到一个新的水平,而微软会冲在最前面. 数字化市场或市场自动化、Salesforce自动化(CRM)和数据分析将成为人工智能最为成熟的三大应用领域. 据angel.co的数据显示,目前有2200多家人工智能初创公司,其中超过50%的初创公司是在最近两年成立的.

我第一次谈人工智能

- - IT瘾-dev
不知道谁这么坏,给起了一个人工智能这个词,让通过科幻片才了解啥叫智能的普罗大众老误解人工智能,就像现在我仍然对智能手机这个词有微言,这怎么就智能了呢. 从现在表现出来的人工智能规模应用来说,本质上就是个概率统计的事,和智能根本不沾边,倒是和人工挺沾边,需要人工做大量的数据标准化加工、数据标注,再喂给算法.

ChatGPT背后人工智能算法

- - 今日话题 - 雪球
ChatGPT背后人工智能算法,关键的原创技术,其实全部都是国外公司发明的. 这里做一点简单的科普,人工智能原创性研究,中国还有很大进步空间,ChatGPT也不是普通的公司能够复刻的出来的. 深度残差网络(ResNet)由微软(亚洲)研究院发明. 在此之前,研究员们发现深度神经网络的效果要比浅层神经网络要好得多,这也就是所谓的深度学习.

人工智能碰上人工智能:两个机器人的爆笑对话

- 地安门城管 - cnBeta.COM
大家都听说过判断人工智能(AI)的图灵测试吧. 或者都和一些聊天机器人说过话吧. 不过那只是人与机器人之间的故事. 如果两个机器人放在一起会发生什么事呢. 其实这是一个名为Cleverbot(聪明机器人)的两份复制品,彼此是完全相同的,为了便于识别而分别做成女性和男性,但依然显示了不同的“人格”,其中男性比较单纯,女性则有些狡猾.