因为自己维护了一个公开图床,但是由于发现有人大批量上传色情图片用来卖片,遂开始寻找方便且高性能的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)