1. demo

地址:http://www.huchengchun.com:8127/porn_classification

接口说明:

1. http://www.huchengchun.com:8127/porn_classification 提供了一个简易的网页工具,用户可以上传若干张图片,服务端会传回每一张图片是否是色情图片的判定,结果的形式是json格式。截图如下:

返回结果的说明:

  • 返回结果整体是一个json,key是加上时间戳后缀的上传图片名称,value是上传图片的色情的判定,其中:  hentai 表示变态图片;drawings 表示普通的绘画图片;porn表示色情图片(可能会漏点),sexy 表示性感图片,neutral 表示中性图片。
  • status 字段表示本次判定的结果是否正常。status = 'normal' 表示正常;status = 'error'表示异常。

2. 还支持了http get 对网页图片进行判定,请求的格式为: http://www.huchengchun.com:8127/porn_classification?img_url=xxx

其中 xxx 是网络图片的地址,目前只支持以jpg 和png结尾的格式。比如如下的请求返回的结果

http://www.huchengchun.com:8127/porn_classification?img_url=https://pic2.zhimg.com/v2-2cfee04b86d10256be2d98458f45bb4e_1200x500.jpg

{
"status": "normal",
"v2-2cfee04b86d10256be2d98458f45bb4e_1200x500_1569511599.jpg": {
"hentai": "0.0064989934",
"drawings": "0.0012943572",
"porn": "0.1919955",
"neutral": "0.0314714",
"sexy": "0.76873976"
}
}

嗯,确实是性感美女,可以看到判定的结果还是比较准确的。

2. 原理

1. 色情图片分类模型。

这一部分主要是参考 github nsfw 的 keras 的开源实验。nsfw 是 Not Suitable for Work 的缩写,是yahho 最先提出一个一个基于深度学习的色情图片判定模型,地址: https://github.com/yahoo/open_nsfw.原始的模型是使用 caffe搭建的,但是显然,现在都已经是9102年了,早已经是tf/keras/pytorch 横行的时代了,caffe几乎已经过时了,所以我也懒得去再搭建一个caffe的深度学习环境了。在万能的github上搜索 nsfw 就可以发现很多其他框架移植的nsfw,这里我选择了一个相对比较简单的基于keras 的nsfw的实现,地址是:https://github.com/GantMan/nsfw_model.

作者提供了基于几十G嘿嘿嘿图片预训练的keras h5模型,开箱即用。当然,原始语料那是不可能提供的。如何加载模型,作者已经替你写好了脚本。几行代码就可以实现。

2. web 后端。

  • 内网穿透

我自己有一个花了100多软妹币买的垃圾腾讯云服务器。还花了几十块钱买了俩域名:www.huchengchun.com ,www.huchengchun.top. 域名是在花生壳买的。这个服务器的配置是4G内存+40G存储+1M带宽,搭建换一个个人网站,写写博客倒是没啥问题,但是用作跑深度学习模型显然是痴心妄想。不过还好,我手里还有一个个人的GPU主机,RTX2080TI, i7 cpu,16G 内存 + 256G SSD,11G 显存。 显然如果用它来跑深度学习的服务是再合适不过了。

但,可惜,我这个服务器是连的家里的内网wifi,没有公网ip,咋通过域名访问呢?

当然是有办法的,我们可以使用内网穿透嘛。即我们需要一个有公网ip的机器做反向代理,中间做一个桥梁,对用户的http请求做转发,转发到内网服务器,然后再将内网服务器的响应转发给用户。

关于内网穿透这里简单介绍两种方法:

1.花生壳客户端提供的内网穿透功能

2. 开源的frp工具。

具体说明可以参考我自己的这个简单总结: http://note.youdao.com/noteshare?id=22a62ce23805c456419a865e78ea4ff4

  • web 服务

这里的web 服务是使用的flask 框架搭建的。之所以使用flask 搭建主要基于如下的几个理由:

1. flask 是一个基于python的轻量级web 框架,支持众多插件,可以快速搭建一个web服务。

2. 因为我们的绝大多数深度学习模型基本前端语言都是python,所以web服务基于python自然可以无缝衔接 深度学习模型了。

关于 flask 的学习,这里我不想展开了,想学习的,可以去官网学习:flask

3.  前端环境

  • 因为我本身接触后端比较多,所以对于前端搭建不是很熟悉。其实我这个demo的需求很简单:

1. 提供一个界面,用户可以上传图片到服务器

2. 服务器接收到图片,使用nsfw模型处理,返回response

3. 前端接收server的response,并解析展示出来。

上传图片的 html + js + css 代码我参考了网上别人的demo,见:  https://github.com/fozero/frontcode/blob/master/src/02/index.html

其中用到了一点点 jquery + ajax 功能,其他的一些细节还有 flask + ajax 的跨域请求,json 的 pretty 展示等,见参考文献。

3. 总结 & 其他

通过这个小项目,你可以初步学习:

  • 如何使用frp快速进行内网穿透
  • flask快速搭建一个web server
  • jquery + ajax 快速搭建一个用户上传多图到服务器
  • 基于 keras + nsfw 的 色情图片识别模型(这个模型其实背后基于InceptionV3)

最后类似地,之前我发布过一篇博文:如何训练一个诗歌生成器,我基于和上面类似的思路,现在也提供了一个http接口,大家可以调用这个接口随便生成一些诗歌玩玩,地址是:http://www.huchengchun.com:8126/poem_generation

接口说明如下:

服务名称
服务类型
端口号
启动脚本位置
绑定公网服务器ip
绑定公网服务器端口
说明

poem_prediction
python
keras
训练了一个lstm模型,用于写诗
8126
/home/work/server/poem_prediction_8126.sh
45.40.207.39
8126
请求方式:get/post
请求参数:
pr:可以传入任意非控值,表示随机预测一个五言绝句
ps:传入一个长度为6的字符串,返回一个长度为24的句子
pf:传入一个单个字符,返回一个以该字开头的五言绝句
ph:传入四个字,返回以这四个字开头的五言藏头诗

请求实例
返回实例
curl -G --data-urlencode "type=text" --data-urlencode "pf=胡" http://www.huchengchun.com:8126/poem_generation
{"extra": "", "status": "normal", "response": "胡室金同生,知人古新山。气虚中一事,主前千水同。"}

还有一个 bert_as_service开源项目,基于flask + bert 搭建一个 web server,可以任意文本编码为固定长度的向量,原文提供了python调用、http调用等多种方式,挺有意思的。我也把这个服务部署在我自己的服务器上了,并且提供了http post 接口,地址:

http://www.huchengchun.com:8125,调用实例以及返回实例:

curl -X POST http://www.huchengchun.com:8125/encode \
-H 'content-type: application/json' \
-d '{"id": 123,"texts": ["我爱中国"], "is_tokenized": false}'
{"id":123,"result":[[0.043742578476667404,...-0.06586530804634094]],"status":200}

最后,以后也许会探索更多好玩的机器学习/深度学习项目,提供接口给大家。

Have Fun!

参考文献:

1.基于keras 的nsfw: https://github.com/GantMan/nsfw_model.

2.用户上传多图片前端demo:https://github.com/fozero/frontcode/blob/master/src/02/index.html

3.flask 引用templates:https://stackoverflow.com/questions/31002890/how-to-reference-a-html-template-from-a-different-directory-in-python-flask/31003097

4.flask 解决 ajax 跨域请求错误的问题: https://stackoverflow.com/questions/26980713/solve-cross-origin-resource-sharing-with-flask

jquery+flask+keras+nsfw快速搭建一个简易鉴黄工具的更多相关文章

  1. 快速搭建一个简易的KMS 服务

    xu言: 之前,闹的沸沸扬扬的KMS激活工具自身都存在问题的事.让我们对以前的什么小马激活.kms激活.各种激活工具都去打了一个深深的“?”,到底哪些能用.哪些不能用.有些还注明的里面必须要关闭杀毒软 ...

  2. Angularjs,WebAPI 搭建一个简易权限管理系统

    Angularjs,WebAPI 搭建一个简易权限管理系统 Angularjs名词与概念(一)   1. 目录 前言 Angularjs名词与概念 权限系统原型 权限系统业务 数据库设计和实现 Web ...

  3. 快速搭建一个Spring Boot + MyBatis的开发框架

    前言:Spring Boot的自动化配置确实非常强大,为了方便大家把项目迁移到Spring Boot,特意总结了一下如何快速搭建一个Spring Boot + MyBatis的简易文档,下面是简单的步 ...

  4. 快速搭建一个直播Demo

    缘由 最近帮朋友看一个直播网站的源码,发现这份直播源码借助 阿里云 .腾讯云这些大公司提供的SDK 可以非常方便的搭建一个直播网站.下面我们来给大家讲解下如何借助 腾讯云 我们搭建一个简易的 直播示例 ...

  5. 如何搭建一个简易的 Web Terminal(一)

    前言 在介绍本篇文章的时候,先说一下本篇文章的一些背景.笔者是基于公司的基础建设哆啦 A 梦(Doraemon)一些功能背景写的这篇文章,不了解.有兴趣的同学可以去 袋鼠云 的 github 下面了解 ...

  6. NodeJS 最快速搭建一个HttpServer

    最快速搭建一个HttpServer 在目录里放一个index.html cd D:\Web\InternalWeb start http-server -i -p 8081

  7. vuejsLearn---通过手脚架快速搭建一个vuejs项目

    开始快速搭建一个项目 通过Webpack + vue-loader 手脚架 https://github.com/vuejs-templates/webpack 按照它的步骤一步一步来 $ npm i ...

  8. [原创] zabbix学习之旅五:如何快速搭建一个报警系统

    通过之前的文章,我们已搭建好zabbix server.agent和mail客户端,现在万事俱备,只差在server的界面中进行相应配置,即可快速搭建一个报警系统.总的来说,快速搭建一个报警系统的顺序 ...

  9. 快速搭建一个本地的FTP服务器

    快速搭建一个本地的FTP服务器   如果需要开发FTP文件上传下载功能,那么需要在本机上搭建一个本地FTP服务器,方便调试. 第一步:配置IIS Web服务器 1.1 控制面板中找到"程序& ...

随机推荐

  1. linux实操_shell判断语句

    常用判断条件: (1)两个数的比较 = 字符串的比较 -lt 小于 -le 小于等于 -eq 等于 -gt 大于 -ge 大于等于 -ne 不等于 (2)按照文件权限进行判断 -r 有读的权限 -w ...

  2. iar8.32版本关于cmsis的说明

    平台是cubemx5.3 keil5.26 带freertos,使用iar8.32,在上图中的use cmsis 打勾与否都能编译通过.

  3. 【模板】A*B Problem升级版(FFT快速傅里叶)

    题目描述 给出两个 $n$ 位10进制数x和y,求x*y(详见 洛谷P1919) 分析 假设已经学会了FFT/NTT. 高精度乘法只是多项式乘法的特殊情况,相当于$x=10$ 时. 例如n=3,求12 ...

  4. 富文本编辑器复制word

    这种方法是servlet,编写好在web.xml里配置servlet-class和servlet-mapping即可使用 后台(服务端)java服务代码:(上传至ROOT/lqxcPics文件夹下) ...

  5. wamp大文件上传

    为什么上传大文件总是失败,但是上传小文件就没有问题.小编也不得其解,网上搜其原因,整理了一篇关于php上传大文件失败的原因和解决办法的文章,分享给大家. 下面分别是各种原因以及解决办法:第1种情况:文 ...

  6. ueditor自动上传Word中的图片

    如何做到 ueditor批量自动上传word图片? 1.前端引用代码 <!DOCTYPEhtmlPUBLIC"-//W3C//DTD XHTML 1.0 Transitional//E ...

  7. redis数据存储--C++连接redis

    一.下载的是Redis Windows版本:下载地址:https://github.com/microsoftarchive/redis:解压到:E:\Software\redis-3.0: 二.用V ...

  8. leetcode解题报告(11):Search Insert Position

    描述 Given a sorted array and a target value, return the index if the target is found. If not, return ...

  9. 【概率论】3-6:条件分布(Conditional Distributions Part II)

    title: [概率论]3-6:条件分布(Conditional Distributions Part II) categories: Mathematic Probability keywords: ...

  10. pytesseract.pytesseract.TesseractNotFoundError: tesseract is not installed or it's not in your path && FileNotFoundError: [WinError 2] 系统找不到指定的文件。

    C:\Users\k\Desktop\test>python test.py Traceback (most recent call last): File , in run_tesseract ...