caffe+鉴黄︱yahoo+open_nsfw 中resnet_50_1by2、遇到问题

2023-12-21 03:32

本文主要是介绍caffe+鉴黄︱yahoo+open_nsfw 中resnet_50_1by2、遇到问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

NSFW:Not Suitable for Work; SFW:Suitable for Work
github:https://github.com/yahoo/open_nsfw
这里写图片描述
同样参考机器之心的文章:《雅虎开源首个色情图像检测深度学习解决方案》
.


公众号“素质云笔记”定期更新博客内容:

这里写图片描述


一、NSFW来历

1、模型来历

finetuned来源于ImageNet 1000 class dataset。使用的框架是:resnet 50 1by2
其中将每个网络的最后一层(FC1000)更换为 2 节点的全连接层。然后我们精调 NSFW 数据集中的权重。注意我们让与最后的 FC 层相乘的学习率是精调后的其他层的 5 倍。我们还调整了超参数(hyper parameters)(步长、基本学习率)以优化性能。

2、色情指数

雅虎公开的此算法为概率0-1值,二分类。
分数<0.2代表大致安全;分数>0.8代表很高可能性不适合办公环境观看。
当然,这个阈值根据实际情况确定。
.
.


二、caffe的实践

.

1、GPU报错

参考来源:ResNet-50 Testing

 Check failed: target_blobs.size() == source_layer.blobs_size() (5 vs. 3) Incompatible number of blobs for layer bn_conv1

笔者在实践GPU时候遇到这个问题,那么网上的说法为:

It looks like that Batchnorm layer and adjacent Scale layer are
integrated in single Batchnorm layer in NVIDIA caffe. However original
BVLC/caffe doesn’t integrate them. That means any networks and
pretrained models using batchnorm and scale layers with original Caffe
cannot use in NVIDIA caffe and DIGITS.

original Caffe包含:Batchnorm层和adjacent Scale层分开的;
NVIDIA Caffe/DIGITS包含:Batchnorm层和adjacent Scale层合并在一个BN层中;
所以在预测过程中不能使用NVIDIA Caffe,也就是GPU。

那么之后,调用了CPU就可以了,但是比较慢,一张图12s左右(K80).当然,他们还使用了CaffeOnSpark,后者是一个用于分布式学习的强大开源框架,令你可以在 Hadoop 和 Spark 模型训练集群中使用 Caffe 深度学习。
.

2、框架的选择与数据操作

没有公开的数据集(你懂得…),在训练过程中,图像被重新调整到256x256像素,水平翻转进行数据增强,并被随机裁剪为224x224像素,然后送入网络。在训练残差网络时,我们使用了 ResNet 论文中所描述的规模增大(scale augmentation)来避免过度拟合。
模型的选择:考察了以下几类框架MS_CTC(微软限制时间成本的那篇论文提出。它在卷积层和全连接层相结合的速度和精度方面秒杀了 AlexNet)、Squeezenet(架构提出了 fire 模块——包含层挤压,然后扩大输入数据团。这有助于节省参数数量,使 Imagenet 的精度与 AlexNet 的一样好,尽管内存需求仅为6MB)、VGG(常规的,这种架构有13层卷积层和 3层 FC 层)、GoogLeNet(GoogLeNet 提出了 Inception 模块并拥有 20 个卷积层阶段。它还在中间层中使用 hanging loss functions 来解决深度网络中的梯度递减问题)、ResNet(ResNet 使用快捷连接来解决梯度递减问题)

最后发布的是: thin ResNet 50 模型,因为它在准确度方面做了很好的折中,并且该模型在运行时间(CPU 上运行时间 < 0.5 秒)和内存(~ 23 MB)方面体量轻巧。

.

3、resnet-50_1by2中:BN层中的use_global_stats

(参考博客:caffe Resnet-50 finetune 所有代码+需要注意的地方)
1.在训练时所有BN层要设置use_global_stats: false(也可以不写,caffe默认是false)
2.在测试时所有BN层要设置use_global_stats: true
影响:
1.训练如果不设为false,会导致模型不收敛
2.测试如果不设置为true,会导致准确率极低
区别:
use_global_stats: false是使用了每个Batch里的数据的均值和方差;
use_global_stats: true是使用了caffe内部的均值和方差。

其中:resnet_50_1by2,resnet_50,resnet68_1by2等这些框架的caffemodel+deploy可见github:https://github.com/jay-mahadeokar/pynetbuilder/tree/master/models/imagenet
.

4、命令行调用SNFW

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

.


延伸一:生成网络-利用open_nsfw模型生成情 色图片

脑洞太大,有人尝试了用开源的nsfw来生成图像,博客链接。
像google的deep dream一样,最大化激活某些特定的分类神经元,不同的是通过生成网络的G函数优化激活过程,同时进行下面的梯度优化,获得了一些有意义的图像生成:
这里写图片描述
贴一些SFW的图像:
这里写图片描述

.

延伸二:雅虎源代码运行时报错

IOError:cannot identify image file <StringIO.stringIO instance at xxxxxxxxxxx>

不知道为什么老是不能用stringIO??
后面笔者自己就直接抛弃stringIO,网上有人用opencv改过这部分,cv2.imwrite,可见博客

.

延伸三:利用YCbCr理论的肤色检测简单鉴定

YCbCr 色彩空间
Y’为颜色的亮度(luma)成分、而CB和CR则为蓝色和红色的浓度偏移量成份

def Nsfw_YCbCr(path):img = Image.open(path).convert('YCbCr')  w, h = img.sizedata = img.getdata()cnt = 0  for i, ycbcr in enumerate(data): y, cb, cr = ycbcrif 86 <= cb <= 117 and 140 <= cr <= 168:cnt += 1 print '%s %s a porn image.'%(path, 'is' if cnt > w * h * 0.3 else 'is not') 

参考来源:(已加马赛克)10 行代码判定色图片——Python 也可以系列之二
.

延伸四:一些灵感

来源知乎:小密圈的反黄策略该怎么做?
现在的问题是,我发布的一些图片,没有涉黄,只露臀但不暴露敏感部位,被误判为黄图,而其他圈子的有些图片,暴露了敏感部位,而通过了机器的审核。这么看来,这个黄图的缺点在于,对是否暴露敏感部位的识别功能不够!一种可能是,标注样本中,模棱两可的图片不够充分,模型学不到真正的Decision Boundary。一方面,可以补充多点这种图片往模型训练。另外一方面,分别对敏感部位进行图像识别建模,比如敏感部位是两个,那么再增加两个模型,当然这两个模型不能对原图直接判别,已经超越了图像识别,而是属于图像检测。
优化方案:
1 模型1的概率:CNN黄图识别模型

2 模型2的概率:敏感部位1的检测模型

3 模型3的概率:敏感部位2的检测模型

4 用户近1天,7天,30天,90天上传黄图的次数

5 圈子近1天,7天,30天,90天上传黄图的次数

.

延伸五:肤色像素检测与皮肤区域划分算法

本程序根据颜色(肤色)找出图片中皮肤的区域,然后通过一些条件判断是否为色情图片。
详细可参考实验楼code:https://www.shiyanlou.com/courses/589/labs/1964/document

程序的关键步骤如下

  • 遍历每个像素,检测像素颜色是否为肤色
  • 将相邻的肤色像素归为一个皮肤区域,得到若干个皮肤区域
  • 剔除像素数量极少的皮肤区域

我们定义非色情图片的判定规则如下(满足任意一个判定为真):

  • 皮肤区域的个数小于 3 个
  • 皮肤区域的像素与图像所有像素的比值小于 15%
  • 最大皮肤区域小于总皮肤面积的 45%
  • 皮肤区域数量超过60个

这些规则你可以尝试更改,直到程序效果让你满意为止

关于像素肤色判定这方面,公式可以在网上找到很多,但世界上不可能有正确率 100% 的公式

你可以用自己找到的公式,在程序完成后慢慢调试

  • RGB 颜色模式

第一种:r > 95 and g > 40 and g < 100 and b > 20 and max([r, g, b]) - min([r, g, b]) > 15 and abs(r - g) > 15 and r > g and r > b

第二种:nr = r / (r + g + b), ng = g / (r + g + b), nb = b / (r +g + b), nr / ng > 1.185 and r * b / (r + g + b) * 2 > 0.107 and r g / (r + g + b) ** 2 > 0.112

  • HSV 颜色模式

h > 0 and h < 35 and s > 0.23 and s < 0.68

  • YCbCr 颜色模式

97.5 <= cb <= 142.5 and 134 <= cr <= 176

一幅图像有零个到多个的皮肤区域,程序按发现顺序给它们编号,第一个发现的区域编号为 0,第 n 个发现的区域编号为 n-1

我们用一种类型来表示像素,我们给这个类型取名为 Skin,包含了像素的一些信息:唯一的 编号(id),是/否肤色(skin),皮肤区域号(region),横坐标(x),纵坐标(y)

遍历所有像素时,我们为每个像素创建一个与之对应的 Skin 对象,并设置对象的所有属性

其中 region 属性即为像素所在的皮肤区域编号,创建对象时初始化为无意义的 None

关于每个像素的 id 值,左上角为原点,像素的 id 值按像素坐标排布,那么看起来如下图

这里写图片描述

其实 id 的顺序也即遍历的顺序

遍历所有像素时,创建 Skin 对象后,如果当前像素为肤色,且相邻的像素有肤色的,那么我们把这些肤色像素归到一个皮肤区域

相邻像素的定义:通常都能想到是当前像素周围的 8 个像素,然而实际上只需要定义 4 个就可以了,位置分别在当前像素的左方,左上方,正上方,右上方;因为另外四个像素都在当前像素后面,我们还未给这4个像素创建对应的 Skin 对象

这里写图片描述

延伸六:Clarifai公司推出识别成人内容的模型和API
【图像识别】著名人工智能、视频分析、深度学习公司Clarifai公司官网,前天推出了一项新的服务,即用于识别成人内容的模型和API,据说模型很准确能识别含有裸体和半裸的图片和视频具体参见:http://blog.clarifai.com/moderate-filter-or-curate-adult-content-with-clarifais-nsfw-model/#.Vw9I3bEis_8[

昨天他们发布一篇技术方面的博文,深度学习是如何“看”裸体的。从1996的论文“Finding Naked People”说起,当时只有60%的准确性,经常和近似皮肤颜色的图片混淆,例如动物皮肤、木材、面包、白色墙壁,然后分析2014年他们的Paper,并给出些代码和结果。
详细地址见:http://blog.clarifai.com/what-convolutional-neural-networks-see-at-when-they-see-nudity/#.VxbLgLEis_9
这里写图片描述

.

延伸六:视频鉴黄大家都听过,那音频审核的技术你知道多少呢?

来源雷锋网

基于图像识别得视频涉黄检测准确率可以达到99%以上,可以为视频直播平台节省70%以上的工作量。

还有一些是语音为主的直播节目,比如谈话聊天、脱口秀、在线广播等。视频检测所使用到的图像技术就很难在这些应用场景发挥作用,所以音频检测需要有针对性的技术手段。
语音识别的关键技术——声学模型

语音识别的声学模型主要有以下两种:混合声学模型和端到端的声学模型。

混合声学模型通常是隐马尔科夫模型结合混合高斯、深度神经网络、深度循环神经网络以及深度卷积神经网络的一个模型。
端到端声学模型目前有两大类,一是连接时序分类—长短时记忆模型,二是注意力模型。

.

延伸七:成人网站PornHub爬虫,一天可爬取500万以上的视频

GitHub资源:https://github.com/xiyouMc/WebHubBot

开发语言: Python2.7
开发环境: MacOS系统、4G内存
数据库: MongoDB:

主要使用 scrapy 爬虫框架
从Cookie池和UA池中随机抽取一个加入到Spider
start_requests 根据 PorbHub 的分类,启动了5个Request,同时对五个分类进行爬取。
并支持分页爬取数据,并加入到待爬队列。

这篇关于caffe+鉴黄︱yahoo+open_nsfw 中resnet_50_1by2、遇到问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/518503

相关文章

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

【VUE】跨域问题的概念,以及解决方法。

目录 1.跨域概念 2.解决方法 2.1 配置网络请求代理 2.2 使用@CrossOrigin 注解 2.3 通过配置文件实现跨域 2.4 添加 CorsWebFilter 来解决跨域问题 1.跨域概念 跨域问题是由于浏览器实施了同源策略,该策略要求请求的域名、协议和端口必须与提供资源的服务相同。如果不相同,则需要服务器显式地允许这种跨域请求。一般在springbo

题目1254:N皇后问题

题目1254:N皇后问题 时间限制:1 秒 内存限制:128 兆 特殊判题:否 题目描述: N皇后问题,即在N*N的方格棋盘内放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在同一斜线上。因为皇后可以直走,横走和斜走如下图)。 你的任务是,对于给定的N,求出有多少种合法的放置方法。输出N皇后问题所有不同的摆放情况个数。 输入

vscode中文乱码问题,注释,终端,调试乱码一劳永逸版

忘记咋回事突然出现了乱码问题,很多方法都试了,注释乱码解决了,终端又乱码,调试窗口也乱码,最后经过本人不懈努力,终于全部解决了,现在分享给大家我的方法。 乱码的原因是各个地方用的编码格式不统一,所以把他们设成统一的utf8. 1.电脑的编码格式 开始-设置-时间和语言-语言和区域 管理语言设置-更改系统区域设置-勾选Bata版:使用utf8-确定-然后按指示重启 2.vscode

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

form表单提交编码的问题

浏览器在form提交后,会生成一个HTTP的头部信息"content-type",标准规定其形式为Content-type: application/x-www-form-urlencoded; charset=UTF-8        那么我们如果需要修改编码,不使用默认的,那么可以如下这样操作修改编码,来满足需求: hmtl代码:   <meta http-equiv="Conte