Python快速实现黄图检测——车速检测器

article/2025/10/10 4:43:56

文章目录

  • 简介
  • 安装
  • 图像
  • 视频
  • 预加载
  • 车速检测器
  • 视频车速检测器
    • 无声音
    • TODO: 有声音
  • 参考文献

简介

使用雅虎开源的 TensorFlow 2 Open-NSFW 模型

NSFW:not safe for work,工作场所不宜

1.jpg

2.jpg

自己去下




安装

Python 3.7 及以上,本人尝试 Python 3.6 失败

pip install opennsfw2




图像

import opennsfw2 as n2# 单张预测
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]

将自动下载预训练模型 open_nsfw_weights.h5 到 C:\Users\Administrator\.opennsfw2\weights




视频

import opennsfw2 as n2video_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%




预加载

import numpy as np
from PIL import Image
from opennsfw2._model import make_open_nsfw_model
from opennsfw2._image import preprocess_image, Preprocessingimage_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




车速检测器

import time
import numpy as np
import tkinter as tk
from pathlib import Path
from tkinter import filedialog
from tkinter import messagebox
from PIL import ImageTk, Imagefrom opennsfw2._model import make_open_nsfw_model
from opennsfw2._image import preprocess_image, Preprocessingbegin = 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 = sizeif not width or not height:_width, _height = sizeheight = width * _height / _width if width else heightwidth = height * _width / _height if height else widthreturn int(width), int(height)def img_resize(event=None):"""显示图片"""global imgif 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 initialdirglobal imgfile_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.parentimg = 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()

效果




视频车速检测器

无声音

安装

pip install imageio-ffmpeg
import time
import threading
import tkinter as tk
from pathlib import Path
from tkinter import filedialog
from tkinter import messagebox
from timeit import default_timer as timerimport imageio
import numpy as np
from PIL import ImageTk, Imagefrom opennsfw2._model import make_open_nsfw_model
from opennsfw2._image import preprocess_image, Preprocessingbegin = time.time()
model = make_open_nsfw_model()  # 加载模型
elapsed = time.time() - begin  # 加载模型耗时
initialdir = Path.cwd()  # 初始化目录,可切换为图片Path.home() / 'Pictures'
reader = None  # 视频读取器accum_time = 0
curr_fps = 0
last_fps = 0
prev_time = timer()def on_closing():"""关闭事件"""if messagebox.askokcancel('关闭', '是否退出程序?'):win.destroy()def play():global readerglobal prev_time, accum_time, curr_fpsfor 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])# FPScurr_time = timer()exec_time = curr_time - prev_timeprev_time = curr_timeaccum_time = accum_time + exec_timecurr_fps = curr_fps + 1if accum_time > 1:accum_time = accum_time - 1last_fps = curr_fpscurr_fps = 0statusbar.config(text=f'概率: {probability * 100:.2f} % FPS: {last_fps}')def open_file(event=None):"""打开视频"""global initialdirglobal readerfile_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.parentreader = 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()




TODO: 有声音

方案一:tkinter + FPS + 单独播放声音

代码






方案二:pyglet

安装

pip install pyglet

代码

import ioimport pyglet
import numpy as np
from PIL import Image
from opennsfw2._model import make_open_nsfw_model
from opennsfw2._image import preprocess_image, Preprocessingmodel = 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.event
def 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




参考文献

  1. opennsfw2 GitHub
  2. Tkinter inserting video into window
  3. ImageNet千分类标签翻译
  4. Tkinter inserting video into window
  5. Video player by Python tkinter, When I pause video, I cannot re-play
  6. imageio Documentation

http://chatgpt.dhexx.cn/article/2jhoHoKH.shtml

相关文章

做了个色情图片识别系统

项目介绍 本项目将使用python3去识别图片是否为色情图片&#xff0c;会使用到PIL这个图像处理库&#xff0c;并且编写算法来划分图像的皮肤区域 介绍一下PIL&#xff1a; PIL&#xff08;Python Image Library&#xff09;是一种免费的图像处理工具包&#xff0c;这个软件包提供…

图像鉴黄的数据集及相关算法汇总

前方高能预警&#xff0c;非战斗人士请火速撤离…… 数据集1&#xff1a;https://github.com/EBazarov/nsfw_data_source_urls/tree/master/raw_data 在 raw_data 文件夹里&#xff0c;可以找到不同的 .txt 格式的文档&#xff0c;每个文档都含有一组 URL&#xff0c;以下是关…

微信小程序—智能鉴黄、敏感识别

小程序提供内容安全接口 security.imgSecCheck&#xff1a;图片检测 security.msgSecCheck&#xff1a;文本检测 调用效果如下&#xff1a; 敏感信息&#xff0c;不好暴漏&#xff0c;可自行体验 体验路径&#xff1a;扫码>>AI智能系列>>安全检测—敏感词语、黄…

android图片颜色识别器,颜色识别器APP

颜色识别器APP是一款手机上的颜色辨别应用&#xff0c;用户只需用摄像头拍出要识别的颜色&#xff0c;应用就能将颜色信息识别出并转换为相关的颜色信息&#xff0c;如颜色名称&#xff0c;颜色的HEX码、RGB码等&#xff0c;还有实时识别&#xff0c;测色仪&#xff0c;色差计等…

二维码/条码识别、身份证识别、银行卡识别、车牌识别、图片文字识别、黄图识别、驾驶证(驾照)识别

Scanner 项目地址&#xff1a;shouzhong/Scanner 简介&#xff1a; 二维码/条码识别、身份证识别、银行卡识别、车牌识别、图片文字识别、黄图识别、驾驶证&#xff08;驾照&#xff09;识别 更多&#xff1a;作者 提 Bug 标签&#xff1a; >>> reset-###- …

身份证、银行卡、车牌、图片文字识别、黄图识别、驾驶证识别库实现功能

预览图效果&#xff1a; 原文来自&#xff1a;http://code.662p.com/view/19388.html &#xff0c;需要自己去下载就可以了。 使用 依赖 implementation com.shouzhong:Scanner:1.1.3以下选择自己需要的 // zxing implementation com.google.zxing:core:3.3.3 // zbar imp…

黄图识别-open nsfw

大楷简介&#xff1a; open nsfw是一款开源的黄图识别的模型。对的&#xff0c;只是模型。并且有有python的代码作为预测图片是否黄图。 https://github.com/yahoo/open_nsfw 这里网址。 open nsfw是雅虎开源项目caffeonspark&#xff0c;使用深度学习训练得到caffe模型。ns…

计算机无法对NAS硬盘操作,使用计算机为Synology NAS安装DSM操作系统

Synology NAS由硬件&#xff0c;系统和应用程序套件组成. Synology最著名的是DSM操作系统. DSM操作系统是Synology开发的用于存储的智能操作系统. 它不仅功能强大&#xff0c;而且在DSM中可用. 在操作系统上安装各种应用程序包&#xff0c;以满足您的需求. 可以通过手机或计算机…

Delta-Sigma调制(DSM)技术

前言 数字信号处理和通信系统的性能很大程度上受到了模拟信号到数字信号转换接口——ADC的精度和分辨率的限制。而传统的线性脉冲编码调制&#xff08;PCM&#xff09;ADC受到了制造工艺的限制&#xff0c;无法达到很高的分辨率。但基于Delta-Sigma调制技术的ADC可以在现有工艺…

黑群晖 DSM 6.2 3617 成功安装教程

黑群晖简介&#xff1a; 黑群晖指的是不是购买正规的群晖的nas 而是在普通电脑上装群晖nas的系统。从硬件来说&#xff0c;群晖本来就是软阵列&#xff0c;和普通PC的软阵列比&#xff0c;没多大分别&#xff1b;黑群晖给你一个打包好的nas&#xff0c;功能全面的轻量化系统&am…

趋势DSM安装

1、基础环境准备 ①准备一台虚拟机&#xff0c;操作系统&#xff1a;CentOS 7.9(带图形) 4vCPU&#xff0c;16GB内存&#xff0c;200GB存储。 ②虚拟机需要安装数据库(支持MSSQL/Oracle/PostgreSQL)和Java环境。 ③本次环境以PostGreSQL位例&#xff0c;进行安装。 2、Pos…

dsm操作系统服务器,DSM 5.1操作系统提供以下新功能

DSM 5.1操作系统提供以下新功能 DSM 5.1操作系统提供以下新功能&#xff1a; 一、打造你的多媒体娱乐中心 DSM 5.1公开分享功能的覆盖范围遍及多媒体内容、档案与数字笔记&#xff0c;NAS上的档案仅通过一键产生网址的方式就能够实时和他人分享。此外&#xff0c;Video Station…

用户DSN、系统DSN、文件DSN的区别

“ODBC数据源管理器”提供了三种DSN&#xff0c;分别为用户DSN、系统DSN和文件DSN。 文件DSN&#xff1a;是建立一个 DSN 的文件&#xff0c; 信息存在文件里。只能由配置该DSN的用户使用或只能在当前的计算机上使用。 系统DSN&#xff1a;是建立一个系统级的DSN&#xff0c…

黑群晖DSM安装教程及详细配置

本文同步发布在个人博客&#xff1a;YouForever - 专注于互联网分享 欢迎访问 为什么要安装黑群晖 先说说什么是NAS服务器&#xff0c;简单来说就是一个网络存储器&#xff0c;你可以存放音乐、视频、文件等&#xff0c;方便地从各个设备进行访问。而群晖的Synology DSM&#…

nDSM、CHM、DTM、DEM、DSM,剪不断、却理得清

nDSM、CHM、DTM、DEM、DSM&#xff0c;剪不断、却理得清 目前&#xff0c;围绕地形产品这一主题&#xff0c;在测绘、地理信息、林业与生态、地质、土木工程等领域普遍存在DTM、DEM、DSM、nDSM、CHM、DCM等英文缩写词。这些缩写的英文专业名词往往被混淆&#xff0c;即使是部分…

如何通过ABB代理程序备份群晖DSM系统

Active Backup for Business代理程序仅支持7.1系统&#xff0c;6.2系统及虚拟DSM系统不支持。 适用机型 备份还原限制 目的地 NAS 必须为与来源 NAS 相同机种或为后续机种&#xff0c;方可进行系统还原 (例&#xff1a;DS218 可还原至另一台 DS218 或 DS220)。目的地 NAS 所安…

把“友商”装进芯里威联通运行黑群晖最新DSM系统

原文网址&#xff1a;http://www.nasyun.com/forum.php?modviewthread&tid30334&fromuid106494 (出处: NAS云论坛) 接触过威联通NAS的玩家可能知道&#xff0c;威联通X86架构的机型NAS&#xff0c;支持在NAS系统中运行虚拟机软件&#xff0c;从而在里面虚拟化运行各种…

DBMS(数据库管理系统)的功能

DBMS是数据库系统中重要的组成部分&#xff0c;比如用户在数据库中的增删改查操作以及各种控制都是由DBMS进行的。简单来讲&#xff0c;DBMS可以帮助用户、满足用户的需要&#xff0c;从抽象逻辑数据转换成计算机的物理数据&#xff0c;给用户带来很大的便利。 DBMS的主要功能 …

DSM -- 进入linux文件系统

将DSM 设置为SSH可用。 在DSM中 &#xff1a;控制面板 --》 选择 终端机和SNMP --》 选中 启动ssh 将windows的SSH客户端启动。&#xff08;默认windows是关闭的&#xff09; 见 &#xff1a;http://www.blogbus.com/amazingxiu-logs/242929522.html 下载Xshell远程登陆工…

DSS系统架构

2019独角兽企业重金招聘Python工程师标准>>> 基于数据库技术的DSS的解决方案&#xff1a; 数据仓库、OLAP和数据挖掘是作为三种独立的信息处理技术出现的。数据仓库用于数据的存储和组织&#xff0c;OLAP集中于数据的分析&#xff0c;数据挖掘则致力于知识的自动发现…