为了账号安全,请及时绑定邮箱和手机立即绑定

真香,我把百万鉴黄服务源码开源了

前言

最近某云审查的比较严,图床上的内容也无奈关闭了,有兴趣的小伙伴可以使用炒鸡工具箱自行搭建。今儿跟大家分享一下之前自建鉴黄服务的这个流程顺便分享一下相关源码。

图床架构

鉴黄流程

代码案例

建议有一定的Linux、Java、Python、TensorFlow、Docker基础。

使用Java调用Python脚本,当然你也可以自己搭建一个基于PythonWeb服务:

// yellowPath 脚本存放位置,后面会讲到
@Value("${yellow.path}")
private String yellowPath;

/**
 * 自家库鉴黄
 * @param imagePath 作为参数供Python脚本使用
 * @return
 */
public String check(String imagePath) {
    String[] arguments = new String[] {"python3",yellowPath,imagePath};
    String classes = "";
    try {
        String line = null;
        Process process = Runtime.getRuntime().exec(arguments);
        BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));
        while ((line = in.readLine()) != null) {
            System.out.println(line);
            classes = line;
        }
        in.close();
        int re = process.waitFor();
        System.out.println(re);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return classes;
}

处理图片的Python脚本,请自行安装各种依赖库:

import sys
import json
import requests

from PIL import Image
import numpy as np

_IMAGE_SIZE = 64
# TensorFlow-serving 调用地址,这里要替换成自己的,后面会讲到如何安装
SERVER_URL = 'http://172.17.0.2:8501/v1/models/image:predict'
_LABEL_MAP = {0: 'drawings', 1: 'hentai', 2: 'neutral', 3: 'porn', 4: 'sexy'}

def standardize(img):
    mean = np.mean(img)
    std = np.std(img)
    img = (img - mean) / std
    return img

# 导入
def load_image(image_path):
    img = Image.open(image_path)
    img = img.resize((_IMAGE_SIZE, _IMAGE_SIZE))
    img.load()
    data = np.asarray(img, dtype="float32")
    data = standardize(data)
    data = data.astype(np.float16, copy=False)
    return data

# 分析
def nsfw_predict(image_data):
    pay_load = json.dumps({"inputs": [image_data.tolist()]})
    response = requests.post(SERVER_URL, data=pay_load)
    data = response.json()
    outputs = data['outputs']
    predict_result = {"classes": _LABEL_MAP.get(outputs['classes'][0])}
    predict_result['probabilities'] = {_LABEL_MAP.get(i): l for i, l in enumerate(outputs['probabilities'][0])}
    return predict_result


if __name__ == '__main__':
    image_data = load_image(sys.argv[1])
    predict = nsfw_predict(image_data)
    print(predict)

这里我们直接使用TensorFlowTensorFlow-serving 对外提供服务,为了安装方便,我们使用Docker安装部署。

docker run -d --rm -p 8501:8501 \
   --name nsfw \
   -e MODEL_NAME=nsfw \
   tensorflow/serving

可以通过以下命令查看容器IP地址:

docker inspect nsfw

复制模型数据(阅读原文获取)到容器:

docker cp /home/nsfw/data/models/  nsfw:/models/image

进入容器:

docker exec -it nsfw  /bin/bash

启动服务:

tensorflow_model_server --port=8500 --rest_api_port=8501  --model_name=image --model_base_path=/models/image

随便找一张图片,执行脚本,如出现以下内容说明配置成功:

[root@VM_0_5_centos python]# python3 yellow.py /home/python/6.jpg
{'classes': 'sexy', 'probabilities': {'drawings': 0.0134889195, 'hentai': 0.00636488385, 'neutral': 0.0619314834, 'porn': 0.20824486, 'sexy': 0.709969819}}

小结

自己搭建的香归香,但还是觉得UCloud免费的鉴黄接口更香!!!

源码

点击查看更多内容
2人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
1.7万
获赞与收藏
2434

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消