Python:使用opennsfw2对图片/视频进行鉴黄识别

这篇具有很好参考价值的文章主要介绍了Python:使用opennsfw2对图片/视频进行鉴黄识别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

使用雅虎开源的 TensorFlow 2 Open-NSFW 模型,NSFW:not safe for work,工作场所不宜

实践

1.环境准备,

Python 3.7 及以上,安装 opennsfw2 库。图片素材请参考 小结中地址进行下载。

pip install opennsfw2

2.代码实践

图片识别 代码如下:

import opennsfw2 as n2# 将自动下载预训练模型 open_nsfw_weights.h5 到 C:\Users\Administrator\.opennsfw2\weights# pip install opennsfw2# 单张预测image_path = '1.jpg'nsfw_probability = n2.predict_image(image_path)print(nsfw_probability)# 0.16282974183559418# 批量预测image_paths = ['1.jpg', '2.jpg']nsfw_probabilities = n2.predict_images(image_paths)print(nsfw_probabilities)# [0.16282965242862701, 0.8638442158699036]

视频识别 代码如下:

import opennsfw2 as n2

video_path = '1.mp4'elapsed_seconds, nsfw_probabilities = n2.predict_video_frames(video_path)for second, probability in zip(elapsed_seconds, nsfw_probabilities):
    print(f'{second:.2f}s: {probability * 100:.0f} %')# 0.03s: 1%# ...# 10.01s: 87.00%# ...# 10.64s: 69.00%

高级用法

1. 加载的方式

import numpy as npfrom PIL import Imagefrom opennsfw2._model import make_open_nsfw_modelfrom opennsfw2._image import preprocess_image, Preprocessing

image_path = '1.jpg'image = preprocess_image(Image.open(image_path), Preprocessing.YAHOO)model = make_open_nsfw_model()nsfw_probability = float(model.predict(np.expand_dims(image, 0), batch_size=1)[0][1])print(nsfw_probability)# 0.16282974183559418

2.车速检测

import timeimport numpy as npimport tkinter as tkfrom pathlib import Pathfrom tkinter import filedialogfrom tkinter import messageboxfrom PIL import ImageTk, Imagefrom opennsfw2._model import make_open_nsfw_modelfrom opennsfw2._image import preprocess_image, Preprocessing

begin = time.time()model = make_open_nsfw_model()  # 加载模型elapsed = time.time() - begin  # 加载模型耗时initialdir = Path.cwd()  # 初始化目录,可切换为图片Path.home() / 'Pictures'img = None  # 当前打开的图片def scale(size, width=None, height=None):
    """获取按比例缩放后的宽高"""
    if not width and not height:
        width, height = size    if not width or not height:
        _width, _height = size
        height = width * _height / _width if width else height
        width = height * _width / _height if height else width    return int(width), int(height)def img_resize(event=None):
    """显示图片"""
    global img    if img:
        _img = img.resize(scale(img.size, height=win.winfo_height()))
        _img = ImageTk.PhotoImage(_img)
        label.config(image=_img)
        label.image = _imgdef on_closing():
    """关闭事件"""
    if messagebox.askokcancel('关闭', '是否退出程序?'):
        win.destroy()def open_file(event=None):
    """打开图片"""
    global initialdir    global img
    file_path = filedialog.askopenfilename(title='选择图片', initialdir=initialdir,
                                           filetypes=[('image files', ('.png', '.jpg', '.jpeg', '.gif'))])
    if file_path:
        statusbar.config(text='正在加载...')
        statusbar.update_idletasks()
        begin = time.time()
        path = Path(file_path)
        initialdir = path.parent
        img = Image.open(file_path)
        img_resize()
        _img = preprocess_image(Image.open(file_path), Preprocessing.YAHOO)
        probability = float(model.predict(np.expand_dims(_img, 0), batch_size=1)[0][1])
        print(probability)
        end = time.time()
        statusbar.config(text=f'{path.name} 耗时: {end - begin:.2f}s 概率: {probability * 100:.2f} %')win = tk.Tk()win.title('黄图检测')  # 标题menu = tk.Menu(win)menu.add_command(label='打开', command=open_file)win.config(menu=menu)win.bind('<Configure>', img_resize)win.geometry('600x300+300+300')win.minsize(200, 200)win.protocol('WM_DELETE_WINDOW', on_closing)statusbar = tk.Label(win, text=f'加载模型耗时: {elapsed:.2f}s', bd=1, relief=tk.SUNKEN, anchor=tk.W, name='statusbar')statusbar.pack(side=tk.BOTTOM, fill=tk.X)label = tk.Label(win, text='双击打开图片')label.bind('<Double-Button-1>', open_file)label.pack(fill=tk.BOTH, expand=True)win.mainloop()

3. 视频车速检测(无声)

import timeimport threadingimport tkinter as tkfrom pathlib import Pathfrom tkinter import filedialogfrom tkinter import messageboxfrom timeit import default_timer as timerimport imageioimport numpy as npfrom PIL import ImageTk, Imagefrom opennsfw2._model import make_open_nsfw_modelfrom opennsfw2._image import preprocess_image, Preprocessing# pip install imageio-ffmpegbegin = time.time()model = make_open_nsfw_model()  # 加载模型elapsed = time.time() - begin  # 加载模型耗时initialdir = Path.cwd()  # 初始化目录,可切换为图片Path.home() / 'Pictures'reader = None  # 视频读取器accum_time = 0curr_fps = 0last_fps = 0prev_time = timer()def on_closing():
    """关闭事件"""
    if messagebox.askokcancel('关闭', '是否退出程序?'):
        win.destroy()def play():
    global reader    global prev_time, accum_time, curr_fps    for image in reader:
        image = Image.fromarray(image)
        frame_image = ImageTk.PhotoImage(image)
        label.config(image=frame_image)
        label.image = frame_image
        _img = preprocess_image(image, Preprocessing.YAHOO)
        probability = float(model.predict(np.expand_dims(_img, 0), batch_size=1)[0][1])

        # FPS
        curr_time = timer()
        exec_time = curr_time - prev_time
        prev_time = curr_time
        accum_time = accum_time + exec_time
        curr_fps = curr_fps + 1
        if accum_time > 1:
            accum_time = accum_time - 1
            last_fps = curr_fps
            curr_fps = 0
            statusbar.config(text=f'概率: {probability * 100:.2f} % FPS: {last_fps}')def open_file(event=None):
    """打开视频"""
    global initialdir    global reader
    file_path = filedialog.askopenfilename(title='选择视频', initialdir=initialdir,
                                           filetypes=[('Select files', ('.mp4', '.mkv', '.avi', '.wmv'))])
    if file_path:
        statusbar.config(text='正在加载...')
        statusbar.update_idletasks()
        path = Path(file_path)
        initialdir = path.parent
        reader = imageio.get_reader(path)
        thread = threading.Thread(target=play, daemon=True)
        thread.start()win = tk.Tk()win.title('黄图检测')  # 标题menu = tk.Menu(win)menu.add_command(label='打开', command=open_file)win.config(menu=menu)win.geometry('1280x720+300+300')win.minsize(200, 200)win.protocol('WM_DELETE_WINDOW', on_closing)statusbar = tk.Label(win, text=f'加载模型耗时: {elapsed:.2f}s', bd=1, relief=tk.SUNKEN, anchor=tk.W, name='statusbar')statusbar.pack(side=tk.BOTTOM, fill=tk.X)label = tk.Label(win, text='双击打开视频')label.bind('<Double-Button-1>', open_file)label.pack(fill=tk.BOTH, expand=True)win.mainloop()

4. 视频车速检测(有声)

import ioimport pygletimport numpy as npfrom PIL import Imagefrom opennsfw2._model import make_open_nsfw_modelfrom opennsfw2._image import preprocess_image, Preprocessing# pip install pygletmodel = make_open_nsfw_model()filename = '1.mp4'source = pyglet.media.load(filename)video_format = source.video_format
width, height = video_format.width, video_format.height
title = 'Video Player'window = pyglet.window.Window(width, height, title)player = pyglet.media.Player()player.queue(source)player.play()@window.eventdef on_draw():
    window.clear()
    if player.source and player.source.video_format:
        player.get_texture().blit(0, 0, width=width, height=height)
        image_data = player.get_texture().get_image_data()
        pitch = -(image_data.width * len('RGB'))
        data = image_data.get_data('RGB', pitch)
        _img = preprocess_image(Image.frombytes('RGB', (width, height), data, 'raw'), Preprocessing.YAHOO)
        probability = float(model.predict(np.expand_dims(_img, 0), batch_size=1)[0][1])
        print(probability)pyglet.app.run()

运行结果:

效率分析:
get_data() 0.941 s
frombytes() 0.001 s
preprocess_image() 0.006 s
predict() 0.052 s

小结

参考: https://blog.csdn.net/lly1122334/article/details/121247781
https://github.com/bhky/opennsfw2文章来源地址https://www.toymoban.com/news/detail-541949.html

到了这里,关于Python:使用opennsfw2对图片/视频进行鉴黄识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用python对图片进行压缩

    对于图片,强行被定义高和宽会变形,我们希望图片被改变大小后,比例保持不变,完成对图片的压缩。 1.pillow : pip install pillow -i https://pypi.douban.com/simple 2. os : 连接文件,并获取文件夹下的文件名 获取picture文件下的相关图片的路径,将路径放到列表里面进行存储 使用Image模

    2024年02月13日
    浏览(45)
  • 使用python进行图片的文字识别

    Tesseract OCR 是一款由 Google 团队开发的开源 OCR(Optical Character Recognition,光学字符识别)引擎,用于将图片、PDF 等格式中的文本转换为可编辑的文本格式。自 1985 年首次发布以来,它已经经历了多个版本和改进,并成为目前最受欢迎的 OCR 引擎之一。 Tesseract OCR 支持多种语言,

    2024年02月09日
    浏览(44)
  • Python案例|使用卷积网络对星系图片进行分类

     星系动物园(galaxy zoo)是由牛津大学等研究机构组织并邀请公众协助的志愿者科学计划,目的是为超过100万个星系图像进行分类。这是天文学中一次规模浩大的公众星空普查活动,大众参与热情高涨,在近十万名志愿者的积极参与下,只用了175天就完成了第一阶段的星系动

    2024年02月17日
    浏览(32)
  • python使用ffmpeg合并多张图片成视频

    注意: 需要在本地有ffmpeg,并且配置环境变量 下载链接如下:https://download.csdn.net/download/qq_30273575/87898080 # FFmpeg 将多张图片合成视频 # 可以使用 FFmpeg 库来将多张图片合成视频,下面是一个简单的示例: # 在代码中,需要提供存储图片的文件夹路径 images_path 和最终生成的视频

    2024年02月11日
    浏览(50)
  • uni-sec-check内容安全unicloud公共模块,校验微信小程序文本内容安全识别和图片智能鉴黄,uniapp进阶

    uni-sec-check内容安全是unicloud封装了微信小程序的免费接口,文本内容安全识别(msgSecCheck)和音视频内容安全识别(mediaCheckAsync),如果我没选择使用uniapp+unicloud开发的话,可以轻松从插件市场引入uni-sec-check公共模块,完成内容安全检测,包含图片和文字检测,下面就针对文

    2024年02月04日
    浏览(51)
  • 如何使用python快速将大批量图片合成为视频?

    由于CSDN大批量导入图片容易出现乱序,本程序将支撑图片转为视频,便于用视频的方式展示文件内容。 由于图片名称复杂多样,为便于统一化处理,增强程序的通用性,使用改名程序可以降低手动调整的复杂度。 改名之后的效果: 注意此部分的图片大小仍需要手动修改或输

    2024年02月04日
    浏览(49)
  • 使用Python的Pillow库对图片进行格式转换和重命名

    Python 是一门功能强大的编程语言,广泛应用于科学计算、数据分析、机器学习等领域。随着互联网的发展和智能手机的普及,现在人们更加倾向于通过图片来表达自己的想法和情感。因此,在科研、工程和设计等领域,对于图片的处理也变得越来越重要。 Python 提供了多种图

    2024年02月08日
    浏览(86)
  • ffmpeg将图片转换为视频报错:width not divisible by 2(原因:H.264使用4x4和16x16的块进行编码,输入图像宽度或者高度需要能被2整除)图片转视频

    我有一张图片,需要把它转换为一个mp4 h.264编码视频,我用ffmpeg转换,但是过程中报错了: 提示: 这个错误是由于H.264编码器(libx264)的限制。对于H.264编码器,视频的宽度和高度必须能被2整除。这是因为在编码过程中, H.264使用了4x4和16x16的块进行编码,所以如果输入的图

    2024年02月04日
    浏览(38)
  • 使用python脚本将视频素材转化为图片数据集并打标

    在深度学习的训练过程中,第一步要做的制作数据集。本文所介绍的内容就是在面临视频素材时,如何将这个视频素材转换成图片,并将生成的图片给打上标签。 1.视频的根目录 2.视频在根目录中所在的位置    这里我的视频格式是.ps格式,具体可以根据你的视频格式来修改

    2024年02月08日
    浏览(52)
  • 如何使用Python进行可视化/音视频处理?

    要使用Python进行可视化和音视频处理,可以使用以下库: matplotlib:用于绘制各种类型的图表和图形,包括折线图、柱状图、散点图等。 seaborn:基于matplotlib的可视化库,提供更高级别的图表和样式,用于创建各种吸引人的统计图表。 plotly:用于创建交互式图表和数据可视化

    2024年02月09日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包