推荐SFW 0.00 色情 NSFW 0.99 为色情图片
中文github代码下载 - 原文地址
所有代码都应该与Python 3.6and兼容Tensorflow 1.x(用 1.12 测试)。模型实现可以在 中找到model.py
Python 3.6.13 :: Anaconda, Inc.
absl-py==1.1.0
astor==0.8.1
cached-property==1.5.2
certifi==2021.5.30
cycler==0.11.0
dataclasses==0.8
decorator==4.4.2
gast==0.5.3
grpcio==1.46.3
h5py==3.1.0
imageio==2.15.0
importlib-metadata==4.8.3
Keras-Applications==1.0.8
Keras-Preprocessing==1.1.2
kiwisolver==1.3.1
Markdown==3.3.7
matplotlib==3.3.4
networkx==2.5.1
numpy==1.16.2
Pillow==8.4.0
protobuf==4.21.0
pyparsing==3.0.9
python-dateutil==2.8.2
PyWavelets==1.1.1
scikit-image==0.17.2
scipy==1.5.4
six==1.16.0
tensorboard==1.12.2
tensorflow==1.12.0
termcolor==1.1.0
tifffile==2020.9.3
typing_extensions==4.1.1
Werkzeug==2.0.3
wincertstore==0.2
zipp==3.6.0
方法 1.
pip install tensorflow== 1.12
pip installnumpy==1.16.2
pip install scikit-image==0.17.2
方法 2.
pip install -r requirements.txt
这里注意一下只支持.jpg类型图片
python classify_nsfw.py -m data/open_nsfw-weights.npy data/test.jpg
SFW score推荐比例 , NSFW score 不推荐比例
Results for 'test.jpg'
SFW score: 0.9355766177177429
NSFW score: 0.06442338228225708
python python http_nsfw.py
POST请求 http://127.0.0.1:2200/?token=aid.sd5@ns85
///图片格式///
{
"temp_path":"C:/Users/lijie/Desktop/新-短视频/视频分割检测/66/",
"type":"image",
"valve":0.8,
"src":[
"http://aliyuncs.com/image/2022-06/16/I1nfUPElFH6oz8ux.jpeg",
"http://aliyuncs.com/image/2022-06/16/OGCVPdDnV1wLdTn9.png"
]
}
//视频格式//
{
"temp_path":"C:/Users/lijie/Desktop/新-短视频/视频分割检测/66/",
"type":"video",
"valve":0.8,
"src":"http://aliyuncs.com/image/2022-06/16/OGCVPd.mp4"
}
返回信息
{
"isViolation": false, //是否涩情
"tNsfw": "0.07921311259269714",
"tsfw": "0.9207869172096252"
}
##http_nsfw.py 代码
#!/usr/bin/env python
import sys
import argparse
import tensorflow as tf
from model import OpenNsfwModel, InputType
from image_utils import create_tensorflow_image_loader
from image_utils import create_yahoo_image_loader
from pathlib import Path
import subprocess
import os
import numpy as np
from flask import request
from flask import jsonify
from flask import Flask
import json
from flask import jsonify
import urllib.request
class main(object):
def __init__(self):
self.model =''
self.sess =''
def test(self):
print(666)
def model_load(self, weights=""):
model = OpenNsfwModel()#创建加载NSF模型
input_type = InputType['TENSOR'] #模型类型 [InputType.TENSOR.name.lower(), InputType.BASE64_JPEG.name.lower()])
model.build(weights_path=weights, input_type=input_type)
self.model = model;
print('模型加载OK')
self.sess =tf.Session() #创建对象
self.sess.run(tf.global_variables_initializer())
def distinguish(self,input_file):
fn_load_image = None
fn_load_image = create_yahoo_image_loader() #创建雅虎图片加载器
image = fn_load_image(input_file)
predictions = \
self.sess.run(self.model.predictions,
feed_dict={self.model.input: image}) #识别
# print("Results for '{}'".format(args.input_file))
# print("\tSFW score:\t{}\n\tNSFW score:\t{}".format(*predictions[0]))
return {"tSFW":predictions[0][0],
"tNSFW":predictions[0][1]}
# if __name__ == "__main__":
def save_image(video_path, image_dir, fps):
#文件夹创建
if not os.path.exists(image_dir):
os.makedirs(image_dir)
#-vf scale=320:240
cmd_str = f'ffmpeg -i {video_path} -f image2 -r {fps} {image_dir}/%d.jpeg -loglevel quiet '
subprocess.run(cmd_str, encoding="utf-8" , shell=True)
app = Flask(__name__)
@app.route('/', methods=['POST'])
def distinguish():
token = request.values.get("token")
if token != 'aid.sd5@ns85': #token
return '403'
params = json.loads(request.data)
try:
# 不能确定正确执行的代码
params = json.loads(request.data) # 将json字符串转为dict
except:
return '405 参数错误'
distinguish = '';
is_violation = False;
#视频识别
if params['type'] == 'video':
#视频进行抽针处理
save_image(params['src'],params['temp_path'],1)#保存帧数1
# os.listdir()方法获取文件夹名字,返回数组
file_name_list = os.listdir(params['temp_path'])
for index,img in enumerate(file_name_list):
img_str = params['temp_path'] + img
distinguish = Model.distinguish(img_str)
if distinguish['tNSFW'] > params['valve']:
is_violation = True
break
returnData = {
"tsfw":f"{distinguish['tSFW']}",
"tNsfw":f"{distinguish['tNSFW']}",
"isViolation":is_violation
}
return jsonify(returnData);
#图片识别
if params['type'] == 'image':
#文件夹创建
if not os.path.exists(params['temp_path']):
os.makedirs(params['temp_path'])
n = 0#用来计数或命名
for img in params['src']:
n += 1
img_url = params['temp_path']+"%s.jpeg" % n
urllib.request.urlretrieve(img, img_url)#保存图片到本地
distinguish = Model.distinguish(img_url)
if distinguish['tNSFW'] > params['valve']:
is_violation = True
break
returnData = {
"tsfw":f"{distinguish['tSFW']}",
"tNsfw":f"{distinguish['tNSFW']}",
"isViolation":is_violation
}
return jsonify(returnData);
return "Ok"
if __name__ == '__main__':
Model = main()
Model.model_load("data/open_nsfw-weights.npy")
app.run(host='0.0.0.0', port=2200, debug=False)
caffe: TypeError: _open() got an unexpected keyword argument ‘as_grey‘
“as_grey” 实际应当修改为 “as_gray”,原因是 scikit-image 的 0.17.2 版本修改了参数名称
ValueError: Object arrays cannot be loaded when allow_pickle=False
自Numpy 1.16.3版本发行之后,函数 numpy.load() 和 numpy.lib.format.read_array() 采用allow_pickle关键字,现在默认为False以响
pip install numpy=1.16.2
Note: Currently only jpeg images are supported.
classify_nsfw.py
accepts some optional parameters you may want to play around with:
usage: classify_nsfw.py [-h] -m MODEL_WEIGHTS [-l {yahoo,tensorflow}]
[-t {tensor,base64_jpeg}]
input_jpeg_file
positional arguments:
input_file Path to the input image. Only jpeg images are
supported.
optional arguments:
-h, --help show this help message and exit
-m MODEL_WEIGHTS, --model_weights MODEL_WEIGHTS
Path to trained model weights file
-l {yahoo,tensorflow}, --image_loader {yahoo,tensorflow}
image loading mechanism
-i {tensor,base64_jpeg}, --input_type {tensor,base64_jpeg}
input type
-l/–image-loader
The classification tool supports two different image loading mechanisms.
yahoo
(default) replicates yahoo’s original image loading and preprocessing. Use this option if you want the sametensorflow
is an image loader which uses tensorflow exclusively (no dependencies on PIL
, skimage
, etc.). TriesNote: Classification results may vary depending on the selected image loader!
-i/–input_type
Determines if the model internally uses a float tensor (tensor
- [None, 224, 224, 3]
- default) or a base64 encoded
string tensor (base64_jpeg
- [None, ]
) as input. If base64_jpeg
is used, then the tensorflow
image loader will
be used, regardless of the -l/–image-loader argument.
The tools
folder contains some utility scripts to test the model.
create_predict_request.py
Takes an input image and generates a json file suitable for prediction requests to a Open NSFW Model deployed
with Google Cloud ML Engine (gcloud ml-engine predict
)
or tensorflow-serving.
export_savedmodel.py
Exports the model using the tensorflow serving export api (SavedModel
). The export can be used to deploy the model
on Google Cloud ML Engine
, Tensorflow Serving or on mobile (haven’t tried that one yet).
export_tflite.py
Exports the model in TFLite format. Use this one if you want to run inference on
mobile or IoT devices. Please note that the base64_jpeg
input type does not work with TFLite since the standard
runtime lacks a number of required tensorflow operations.
export_graph.py
Exports the tensorflow graph and checkpoint. Freezes and optimizes the graph per default for improved inference and
deployment usage (e.g. Android, iOS, etc.). Import the graph with tf.import_graph_def
.