深夜吐血训练了100万小黄图撸了一个鉴黄图床

收藏
点击▲关注 “爪哇笔记”   给公众号标星置顶
更多精彩 第一时间直达

一、前言

最近在做一款图床服务,关注公号的小伙伴一定记得小柒曾说过,会在周末放出的,不好意思放大家鸽子了。之所以一直没敢放出,是因为鉴黄接口一直没调试好,虽然我对公号的小伙伴百分之百信任,奈何互联网鱼龙混杂,万一上传了什么不雅的图片,然后不巧被某部门发现了,我包括我的服务器域名可就彻底玩完了!

二、架构

如图,先聊一下图床的架构:
  • Nginx代理那是必备神器了。

  • lua限流是一定的了,虽然前期没啥子流量,后期可能也没有。

  • 限量限制大小也是必须的了,不然带宽受不了。

  • 接入鉴黄,毕竟咱是合法备案网站。

  • 文件多重备份,OSS,分布式文件,本地文件各一份,防止走丢。

  • 为了查询方便,最后落库。

三、工具

  • SpringBoot,一个简化Spring开发的框架。

  • WebUploader,一个简单的以HTML5为主,FLASH为辅的现代文件上传组件。

  • Python,加持各种开源第三方库处理图片。

  • nsfw_data_scraper,近一个1w星标的珍藏东京热、欧美资源。

  • docker_nsfw_data_scraper,用于收集训练数据。

  • TensorFlow,开源机器学习库。

  • ResNet,图像分类的预训练模型。

  • TensorFlow-serving,部署tensorflow模型,并提供服务。

四、训练模型

训练之前,先介绍一个名词NSFW,之前我也不知道啥意思,毕竟是村里来的,什么泷泽萝拉,松岛枫,小泽玛利亚,吉泽明步,波多野结衣,天海翼,樱井莉亚,饭岛爱,苍井空,麻生希,橘梨纱,武藤兰,泽井芽衣.....是一概不知道的。
NSFW:不适合在工作场合出现的内容(英语:不适合工作的安全性,简称:NSFW)是一个网络用语,多指裸露,暴力,色情或冒犯等不适合公众场合的内容。上述内容的超链接旁标注NSFW,用于警告观看者。
nsfw_data_scraper上传存放了成千上万张图片地址,并对图片进行了分类,以供训练:
  • 绘画(Drawing),无害的艺术,或艺术绘画;

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

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

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

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

同时,官方也提供了收集方法:
  1. $ docker build . -t docker_nsfw_data_scraper

  2. Sending build context to Docker daemon 426.3MB

  3. Step 1/3 : FROM ubuntu:18.04

  4. ---> 775349758637

  5. Step 2/3 : RUN apt update && apt upgrade -y && apt install wget rsync imagemagick default-jre -y

  6. ---> Using cache

  7. ---> b2129908e7e2

  8. Step 3/3 : ENTRYPOINT ["/bin/bash"]

  9. ---> Using cache

  10. ---> d32c5ae5235b

  11. Successfully built d32c5ae5235b

  12. Successfully tagged docker_nsfw_data_scraper:latest

  13. $ # Next command might run for several hours. It is recommended to leave it overnight

  14. $ docker run -v $(pwd):/root docker_nsfw_data_scraper /root/scripts/runall.sh

  15. Getting images for class: neutral

  16. ...

  17. ...

  18. $ ls data

  19. test train

  20. $ ls data/train/

  21. drawings hentai neutral porn sexy

  22. $ ls data/test/

  23. drawings hentai neutral porn sexy

如何训练模型,后面也很贴心的附上了训练方法,不过这里借用了TensorFlowResNet的模型,稍作修改。训练过程太过煎熬、痛苦,已经被湮灭在有限的带宽和无尽的小黄图中。

五、鉴黄服务

模型数据训练好以后就是搭建服务了,这里我们直接使用TensorFlow 的 TensorFlow-serving 对外提供服务,为了安装方便,我们使用Docker安装部署。
  1. NSFWDATA="/home/nsfw"

  2. docker run -d --rm -p 8501:8501 \

  3. --name nsfw \

  4. -v "$NSFWDATA/models:/models/nsfw" \

  5. -e MODEL_NAME=nsfw \

  6. tensorflow/serving

serving 镜像提供了两种调用方式:gRPCHTTP请求。gRPC默认端口是8500HTTP请求的默认端口是8501,serving镜像中的程序会自动加载镜像内/models下的模型,通过MODEL_NAME指定/models下的哪个模型。
HTTP调用API地址:http://ip:port/v1/models/nsfw:predict
接口返回参数,识别率还是蛮准确的:
  1. {

  2. "classes": "porn",

  3. "probabilities": {

  4. "drawings": 0.0000170060648,

  5. "hentai": 0.00108581863,

  6. "neutral": 0.000101140722,

  7. "porn": 0.816358209,

  8. "sexy": 0.182437778

  9. }

  10. }

六、图床服务

万事俱备,只欠图床,恰好,最近新域名也备案成功了,那就赶紧上线吧。麻溜的开始公号小范围内测,内测期间各位小伙伴可以多多踢出宝贵意见,2019年12月31日内测结束将清空所有数据,请悉知!

▲群内附演示地址,一起学习一起进步

七、题外话

这篇案例酝酿了许久,还差点导致其难产,其实各种云上都有鉴黄服务,比如阿里云,50w次请求,810RMB,一年有效期,算下来也就不到2分钱。但是肉疼啊,如果省钱的同时又能学习知识,何乐而不为呢?

八、福利

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

▲一个有温度的小黄号,期待与你一起进步
回复