当前位置: 首页 > 编程日记 > 正文

拯救尴尬:鉴黄神器NSFW JS开源了!

近日,GitHub上开源了一款鉴定不雅内容的js库NSFW JS,你可以使用NSFW JS识别不雅内容,所有操作都只在客户端进行,甚至都不需要让文件离开用户的电脑。

演示地址:https://nsfwjs.com/

项目地址:https://github.com/infinitered/nsfwjs

你有没有过这样的经历,在睡觉之前看了一些东西,然后在闭上眼睛时那些东西仍然历历在目?我说的可不是那种甜蜜的美梦,而是那种被你的老板看到后会让你卷铺盖走人的东西。

用户的输入可能会很恶心。我的一个朋友之前开了一家网店,居然可以允许用户输入负的数。一些恶意用户会购买一件50美元的衬衫,然后再加上负一件40美元的衬衫,从而达到打折的效果!纠正用户输入的数字是很容易的,但如果是图片呢?那是不可能的!

机器学习正在做着令人惊叹的事情,现在已经开始进入JavaScript领域,那些令人惊叹的事情无处不在。

NSFW JS NPM模块

我可以用一整章的内容来介绍NSFW JS内部原理,但还是让我们来关注它的功能吧。

给NSFW JS一张图片元素或画布,然后简单地调用classify,可能会得到如下5个分类结果。

  • 绘画(Drawing)——无害的艺术,或艺术绘画;

  • 变态(Hentai)——色情艺术,不适合大多数工作环境;

  • 中立(Neutral)——一般,无害的内容;

  • 色情(Porn)——不雅的内容和行为,通常涉及生殖器;

  • 性感(Sexy)——不合时宜的挑衅内容。

每个分类都有一个概率!基于这些数字和分类,你可以采取行动或者只是目瞪口呆。

\"\"

为什么要用它?

大公司一般都有专门的团队专注于消除令人反感的内容,但我们一般享受不到这种奢侈。就像客户端的表单验证可以减少服务器端的工作量一样,客户端的内容检查也可以减少团队的工作量。

场景1:

想象一下,当用户要上传淫秽图像时,他们会立即收到这样的消息:“抱歉!这张图片的一些内容已经触发了内容警告。你仍然可以上传图片,但不会立即可用,需要通过人工审核后才会生效”。用户看到这条消息后可能会放弃上传。

场景2:

它也可以用于用户到用户的保护。在从别人那里接收消息时,可能会收到警告,告知他们要查看的内容是不是适合。如果可以查看,它会在显示之前进行确认,而这些是在没有服务器处理的情况下完成的!

随着用户上传内容的合法性变得越来越重要,我们需要更大更好的工具来保证优质网站的畅通。

如何使用它?

这很简单,基本上包含三个步骤:

1.获取代码;

2.在客户端加载模型;

3.对图像进行分类。

1. 获取代码

我将向你展示Node风格的用法。首先,我们需要引入NSFW JS。如果项目中尚未包含TensorflowJS,请先获取它。

\"\"

现在,我们可以在JS文件中导入Node模块:

// Classic import styleimport * as nsfwjs from 'nsfwjs'// or just use require('nsfwjs')

2. 在客户端加载模型

接下来我们需要做的是加载模型。这个“模型”是用来评估图像的函数。可以在这里下载它们。这些文件是4MB大小的分片,便于在客户端进行缓存。在我的示例中,我将它们放在public/model/文件夹中。

\"\"

如果你的目录也一样,那么可以使用这个路径来加载模型。

// Load files from the server to the client!const model = await nsfwjs.load('/model/')

3. 对图像进行分类

现在,模型已经存在于客户端的内存中,我们可以对页面上的图像元素进行分类。

// Gimme that imageconst img = document.getElementById('questionable_img')// Classify the imageconst predictions = await model.classify(img)// Share resultsconsole.log('Predictions: ', predictions)

预测(默认情况下)将返回5个分类结果,按照最可能到最不可能的顺序排列!例如:

[  {className: “Drawing”, probability: 0.9195643663406372},  {className: “Hentai”, probability: 0.07729756087064743},  {className: “Porn”, probability: 0.0019258428364992142},  {className: “Neutral”, probability: 0.0011005623964592814},  {className: “Sexy”, probability: 0.00011146911856485531}]

所有概率的总和应该加起来等于1或100%。现在,你可以基于这些数据做你想做的事情!标记超过60%的东西,或者只用最前面那个,把其余的忽略掉。

误报

作为人类,你可能经过了几十年的图像识别训练。所以可以肯定地说,你肯定会遇到一些很明显的误报。虽然这些通常很有趣,但结果中也会出现少量的数据偏差。随着数据清洗技术的改进,这些偏差将被消除。这是一个缓慢的过程。

对于像NSFW这样的东西,我觉得出现误报总比出现漏网之鱼更好。

动手演示

需要注意的是,NSFW可能会发生误报,但这个模型每天都在不断改进。因为是开源的,所以我希望大家一起帮助改进它!

\"\"

英文原文:
https://shift.infinite.red/avoid-nightmares-nsfw-js-ab7b176978b1

更多内容,请关注前端之巅。

\"\"

相关文章:

Linux下用于查看系统当前登录用户信息的4种方法

作为系统管理员,你可能经常会(在某个时候)需要查看系统中有哪些用户正在活动。有些时候,你甚至需要知道他(她)们正在做什么。本文为我们总结了4种查看系统用户信息(通过编号(ID&…

三维重建【一】——————(深度学习方式)

经典的计算机视觉问题是3-D重建。 基本上可以分成两种路径:一是多视角重建,二是运动重建。前者有一个经典的方法是多视角立体视觉(MVS,multiple view stereo),就是多帧的立体匹配,这样采用CNN模…

【Codeforces】501B Misha and Changing Handles(map)

http://codeforces.com/problemset/problem/501/B map的应用,让新的名字作为key值,旧的名字作为value值,然后一一对应。如果这个旧名字不在map里,则添加进去;如果这个旧名字在map里,则需要进行替换&#x…

vue-cli3+typescript初体验

前言 气势汹涌,ts似乎已经在来的路上,随时可能敲门。2015年,三大前端框架开始火爆的时候,我还在抱着Backbone不放,一直觉得可以轻易转到其他框架去。后来换工作,现实把脸都打肿了,没做过vue、re…

三维重建【二】————3D reconstruction 较为实用的算法资料整理(传统方式)

本文结合一些pape并且将资源进行整合,以便于后期的学习。博客将这些资源一下,这里不得提到大名鼎鼎的KinectFusion以及他后面的一系列工作。KinectFusion单篇论文引用都已经超过3000次了,可以称得上是具有划时代意义的一篇巨著,如…

【Codeforces 738D】Sea Battle(贪心)

http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1  n grid. In this game a ships are placed on the grid. Each of the ships consists of bconsecutive cells. No cell can be part of two ships, however, the ships ca…

【POJ】3617 Best Cow Line (字典序 字符串)

http://poj.org/problem?id3617 给定长度为N(1≤N≤2000)的字符串S,要构造一个长度为N的字符串T。期初,T是一个空串,随后反复进行下列任意操作。 从S的头部删除一个字符,加到T的尾部 从S的尾部删除一个字符,加到T的…

python数据池连接PG

发现网上都是mysql,后面发现PG跟mysql差不多,记录下来,怕忘了 import psycopg2 from DBUtils.PooledDB import PooledDB import psycopg2.extraspool PooledDB(psycopg2, 10,database"boatdb", user"postgres",password…

ASP.NET WebAPi之断点续传下载(下)

前言 上一篇我们穿插了C#的内容,本篇我们继续来讲讲webapi中断点续传的其他情况以及利用webclient来实现断点续传,至此关于webapi断点续传下载以及上传内容都已经全部完结,一直嚷嚷着把SQL Server和Oracle数据库再重新过一遍,这篇…

Git学习记录(一)

git-book 全面资料 git 用树形查看 (git 命令代替gitk查看节点树part two 日常使用只要记住下图6个命令即可,但是学海无涯啊 ​ 常用 Git 命令清单。几个专用名词的译名如下。 Workspace:工作区Index / Stage:暂存区Reposito…

【牛客】CSL 的字符串 (stack map)

https://ac.nowcoder.com/acm/contest/551/D 这个题怎么说,data用来存储这个字母在字符串中最后一次出现的位置,vis则用来记录该字母是否在栈中。 当栈为空的时候,直接将s[i]放入栈中 如果不为空则需要比较栈顶元素和当前s[i]的那个元素&a…

Python:UTF-8编码转换成GBK编码

2019独角兽企业重金招聘Python工程师标准>>> #!/usr/bin/env python # -*- coding:utf-8 -*- #UTF-8转换成GBK编码 #temp #decode #encode #原理就是把UTF-8转换成万国码,再给万国码进行编码转换成GBK,在python 2.x里面这么用 ""&q…

三维重建【三】-------------------(三维重建资料收集)

Major学者的个人主页汇总: 1.陈宝权:http://web.siat.ac.cn/~baoquan/ 2.南亮亮:http://web.siat.ac.cn/~liangliang/ 3.mueller:http://people.ee.ethz.ch/~pascmu/publications.html 4.Yasutaka Furukawa:http://homes.cs.washi…

在 Linux 中查看时区

1.date date "%Z %z"或者 date -R2.timedatectl timedatectl|grep "Timezone"可以使用 timedatectl 来设置 Linux 时区 3.显示文件 /etc/timezone 的内容 cat /etc/timezone

【HDU】1237 简单计算器 (stack)

http://acm.hdu.edu.cn/showproblem.php?pid1237 题目很好理解,一开始想用优先队列,但好像有点难实现,用stack比较好实现,遇到“ * ” 或者" / " 就进行操作,遇到“ - ” 就把它的相反数加进stack&#xf…

关于 synchronizeOnSession

本文为[原创]文章,转载请标明出处。原文链接:https://weyunx.com/2019/01/22...原文出自微云的技术博客 最近在维护一个老项目,发现了一个问题。我们新增了一个耗时较久的复杂查询的功能,页面采用了 ajax 异步请求数据&#xff0c…

用python操作mysql数据库(之“更新”操作)

#!/usr/bin/env python # -*- coding: utf-8 -*-import MySQLdb#建立连接 conn MySQLdb.connect(host127.0.0.1,userroot,passwd1qaz#EDC,dbtest_db) cur conn.cursor()#对数据进行操作 sql "update user set name%s where id7" #定义sql语句,用于修改…

OpenCV【零】—————cv::Mat——Mat对象创建方法

OpenCV (一)——Mat对象创建方法 目录 OpenCV (一)——Mat对象创建方法 1. cv::Mat优点及原理(本质类) 2. Mat类拷贝及对象的创建方法 3. Mat 对象元素的高效访问 4. 存储方法 5. 显式创建Mat对象 6. 与其他语言对比的方式 7. Mat操作实例 1. c…

在Vmware中安装Ubuntu

转载自:https://blog.csdn.net/stpeace/article/details/78598333 不是每一个程序员都必须玩过linux,只是博主觉得现在的很多服务器都是linux系统的,而自己属于那种前端也搞,后台也搞,对框架搭建也感兴趣,…

C++回声服务器_5-多进程版本

服务器和客户端都是用多进程来接收和发送数据。 服务器代码 #include <cstdio> #include <cstdlib> #include <cstring> #include <unistd.h> #include <csignal> #include <sys/wait.h> #include <arpa/inet.h> #include <sys/s…

OpenCV 【一】—— OpenCV中数组指针、图像分块计算、指针取像素值与MatToEigen方法,内存对齐

{ Topic1: 高效开辟内存&#xff0c;使适用于大型数组。//开辟新数组&#xff0c;或者开辟新的0或者某一数值的数组/Mat或者Map直接使用memset //大数组操作效率较高 举例1&#xff1a;cv::Mat cv_ncc_temp(cv_input_32f.rows, cv_input_32f.cols, CV_8UC1);memset(cv_ncc_temp…

【Java】类与对象 - 参数传值

目录 面向过程语言简介 面向对象语言简介 面向对象编程的三个特性 参数传值 传值机制 基本数据类型的参数的传值 引用类型参数的传值 可变参数 面向过程语言简介 核心是编写解决问题某个问题的代码块&#xff0c;代码块是程序执行时产生的一种行为。面向过程语言缺少一…

新闻发布项目——业务逻辑层(newsTbService)

package bdqn.newsManageServlet.Service;import java.util.List;import bdqn.newsManageServlet.entity.newsTb;/*** 新闻业务逻辑层的接口* author Administrator**/ public interface newsTbService {//分页查询public List<newsTb>getPagingNews(int pagesize,int pa…

使用阿里云发布分布式网站,开发时候应该注意什么?

虽然之前写过关于负载均衡的文章&#xff0c;但是似乎大家都对负载均衡这个标题很陌生。今天就换个角度&#xff0c;从分布式网站发布角度说一下 首先&#xff0c;网站发布一定离不开服务器&#xff0c;就是阿里云的云服务器ECS。最近发现&#xff0c;老用户也有机会购买特价服…

【Java】类与对象 - 对象的组合

一个类的成员变量可以是Java允许的任何数据类型&#xff0c;因此&#xff0c;一个类可以把某个对象作为自己的成员变量&#xff0c;也就是说&#xff0c;该对象将其他对象作为自己的组成部分。 组合和复用 如果一个对象a组合了对象b&#xff0c;那么对象a就可以委托对象b调用…

CMakeLists.txt学习记录

一、Cmake 学习地址与作用 cmake详细见&#xff1a;https://gitlab.kitware.com/cmake/community/-/wikis/home 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。 二、常用命令 …

20145223《信息安全系统设计》 实验四 驱动程序设计

20145223杨梦云《信息安全系统设计》实验四实验报告 一、配置开发环境&#xff08;同实验一&#xff09; 二、阅读和理解源代码 进入/arm2410cl/exp/drivers/01_demo&#xff0c;使用vi编辑器或其他编辑器阅读理解源代码。 三、编译驱动模块及测试程序 上面介绍了在 Makefile 中…

Android屏幕适配框架-(今日头条终极适配方案)

2019独角兽企业重金招聘Python工程师标准>>> 在Android开发中,屏幕适配是一个非常头痛的问题,因而为了去进行屏幕适配,作为程序员,是呕心沥血,历经磨难,哈哈 我们之前做屏幕适配一般都会用到一下两种方式: 我们之前做屏幕适配一般都会用到一下两种方式: 第一种就是宽…

OpenCV 【三】————contours便利删除操作方法

int cmin 100;int cmax 1000;vector<vector<Point>>::const_iterator itc contours.begin();while (itc ! contours.end()){if (itc->size() < cmin || itc->size() > cmax)itc contours.erase(itc);elseitc;}

解决myeclipse中新建javaweb工程,无法使用Web App Libraries问题

在myeclipse中新建的java web工程&#xff0c;lib中的jar包无法自动加载工程&#xff0c;不能像eclipse那样使用Web App Libraries。即使添加了Web App Libraries这个libraries&#xff0c;jar包还是如法加入。解决方法&#xff1a;在.project文件中&#xff0c;修改<nature…