NSFW检测公共API

因为自己维护了一个公开图床,但是由于发现有人大批量上传色情图片用来卖片,遂开始寻找方便且高性能的NSFW检测服务,现在使用Python实现了高性能的NSFW检测服务。

图床地址 https://imgimg.cc/

NSFW检测API地址 https://nsfw-api.imgimg.cc/image

参数名:img
一次只能提交一张图片,限定格式:jpg png webp

下方是检测API判断标准,只要符合NSFW判断标准则会返回结果,porn的值越大表示含有NSFW可能性越大,结果为0并不表示不含有NSFW内容,检测算法相对宽松,也可能存在没有识别到的,如果需要非常严格的检测,建议使用商业API。
本API使用了项目 https://github.com/notAI-tech/NudeNet

检测到NSFW内容
{
    "porn": 0.6853373050689697
}
检测到二维码(固定值0.9)
{
    "porn": 0.9
}
未检测到NSFW内容
{
    "porn": 0
}
类别是否为NSFW
FEMALE_GENITALIA_COVERED
FACE_FEMALE
BUTTOCKS_EXPOSED
FEMALE_BREAST_EXPOSED
FEMALE_GENITALIA_EXPOSED
MALE_BREAST_EXPOSED
ANUS_EXPOSED
FEET_EXPOSED
BELLY_COVERED
FEET_COVERED
ARMPITS_COVERED
ARMPITS_EXPOSED
FACE_MALE
BELLY_EXPOSED
MALE_GENITALIA_EXPOSED
ANUS_COVERED
FEMALE_BREAST_COVERED
BUTTOCKS_COVERED

下面是完整的Python代码:

在使用之前先安装所需依赖

pip install Flask pyzbar Pillow nudenet
from flask import Flask, request, jsonify
from nudenet import NudeDetector
from pyzbar.pyzbar import decode
from PIL import Image
import imghdr
import tempfile

app = Flask(__name__)
nude_detector = NudeDetector()


@app.route('/image', methods=['POST'])
def upload_file():
    file = request.files.get('img')

    # 检查是否存在文件或文件名为空
    if not file or file.filename == '':
        return jsonify({'porn': 0}), 200

    # 使用临时文件处理
    with tempfile.NamedTemporaryFile(delete=False) as temp_file:
        file.save(temp_file.name)
        file_format = imghdr.what(temp_file.name)

        if file_format not in ['jpeg', 'png', 'webp']:
            return jsonify({'porn': 0}), 200

        # 如果不需要检测二维码,可以删除下面的检查
        image = Image.open(temp_file.name)
        if decode(image):
            return jsonify({'porn': 0.9}), 200

        detections = nude_detector.detect(temp_file.name)
        nsfw_classes = {'BUTTOCKS_EXPOSED', 'FEMALE_BREAST_EXPOSED', 'FEMALE_GENITALIA_EXPOSED', 'ANUS_EXPOSED',
                        'MALE_GENITALIA_EXPOSED'}
        max_score = max((detection['score'] for detection in detections if detection['class'] in nsfw_classes),
                        default=0)

    # 临时文件在退出with块时自动删除
    return jsonify({'porn': max_score}), 200


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=1106)
暂无评论

发送评论 编辑评论


上一篇
下一篇