.net 调用 nsfwjs 进行视频鉴别
1. npm 安装 nsfwjs
npm install express --save
npm install multer --save
npm install jpeg-js --save
npm install @tensorflow/tfjs-node --save
npm install nsfwjs --save
注意:安装 @tensorflow/tfjs-node 有点坑,
1).需要用到 python, 建议添加到用户环境变量 Path 中
2).CentOS7 下如果遇到无法创建目录, 需要增加 --unsafe-perm=true --allow-root 参数
3). node v14.17.5 好像在某些OS下跟 tensorflow 有兼容问题, 可以换 v14.15.4
PS: 支持 win7 的官方最后版本是v13.14.0,但是可以下载更高版本的 zip 包覆盖替换,并在调用前 set NODE_SKIP_PLATFORM_CHECK=1
,忽略平台审查,基本都能运行
2. 运行 WebAPI 服务
nsfwjs 作者提供了一个简单的 server.js 来提供 WebAPI 服务,为方便复制到这里
const express = require('express')
const multer = require('multer')
const jpeg = require('jpeg-js') const tf = require('@tensorflow/tfjs-node')
const nsfw = require('nsfwjs') const app = express()
const upload = multer() let _model const convert = async (img) => {
// Decoded image in UInt8 Byte array
const image = await jpeg.decode(img, true) const numChannels = 3
const numPixels = image.width * image.height
const values = new Int32Array(numPixels * numChannels) for (let i = 0; i < numPixels; i++)
for (let c = 0; c < numChannels; ++c)
values[i * numChannels + c] = image.data[i * 4 + c] return tf.tensor3d(values, [image.height, image.width, numChannels], 'int32')
} app.post('/nsfw', upload.single('image'), async (req, res) => {
if (!req.file) res.status(400).send('Missing image multipart/form-data')
else {
const image = await convert(req.file.buffer)
const predictions = await _model.classify(image)
image.dispose()
res.json(predictions)
}
}) const load_model = async () => {
_model = await nsfw.load() //you can specify module here
} // Keep the model in memory, make sure it's loaded only once
load_model().then(() => app.listen(8080))
尝试运行这个服务 ( 注意这个app仅支持jpeg格式的图片 )
node server.js
用 curl 测试
curl --request POST localhost:8080/nsfw --header 'Content-Type: multipart/form-data' --data-binary 'image=@myimg.jpg'
想简单些,可以写成这样
curl -F "image=@myimg.jpg" "http://localhost:8080/nsfw"
Windows 下可以通过 Postman 来测试。
Linux 下可以通过 forever 以服务方式运行, 具体可参考 nodejs服务后台持续运行三种方法 这篇文章, 当然用 supervisor 也是可以的。
3. .net 封装调用
nsfwjs 的 WebAPI 服务能跑起来了,用 .net 封装调用就很简单了
3.1 首先通过 process 启动 node server.js,可以通过输出重定向隐藏控制台,写个批处理分别启动更简单
3.2 分析视频,参考这篇文章通过调用 ffmpeg 或者使用 FFMpeg.AutoGen 编程实现截图
3.3 通过 HttpClient 或者RestSharp 等客户端组件提交需要鉴别的图片,返回结果
运行效果上来看还是不错的,200K 以内的图片一般都能在 200ms 内返回鉴别结果,唯一的不足是 nsfwjs 安装完有将近 700M,实在是太大了。
源码: https://github.com/towerbit/nsfwjs-gui
.net 调用 nsfwjs 进行视频鉴别的更多相关文章
- Python: 调用youtube_dl实现视频下载
研究PySide与youtube_dl结合实现视频下载,抽丝剥蚕,步步维艰,却也颇有意思. 记录初始心得.界面以PySide之Qt编写,调用youtube_dl下载,回调出下载进度,代码如下: # e ...
- H5调用Android播放视频
webView.loadUrl("http://10.0.2.2:8080/assets/RealNetJSCallJavaActivity.htm"); js调用的Java文件中 ...
- Java调用ffmepg+mencoder视频格式转换(*)
PS: 建议大家在官网下载最新的资源 其他格式转FLV格式,可以用Java调用ffmpeg和memcoder实现 ffmepg: D:\ffmpeg\bin\ffmpeg.exe -i E:\1.mp ...
- NET 2.0(C#)调用ffmpeg处理视频的方法
另外:ffmpeg的net封装库 http://www.intuitive.sk/fflib/ NET 2.0 调用FFMPEG,并异步读取输出信息的代码...public void ConvertV ...
- Java调用FFmpeg进行视频处理及Builder设计模式的应用
1.FFmpeg是什么 FFmpeg(https://www.ffmpeg.org)是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它用来干吗呢?视频采集.视频格式转化.视频 ...
- asp.net实现调用ffmpeg实现视频格式的转换
视频格式转换的函数 //视频转换 public void VideoConvertFlv(string FromName, string ExportName) { string ffmpeg = H ...
- 新手学习FFmpeg - 调用API完成视频的读取和输出
在写了几个avfilter之后,原本以为对ffmpeg应该算是入门了. 结果今天想对一个视频文件进行转码操作,才发现基本的视频读取,输出都搞不定. 痛定思痛,仔细研究了一下ffmpeg提供的examp ...
- .Net调用ffmpeg对视频截图
2019/10/27, .Net c#代码片段 摘要:借助ffmpeg对视频/图片截图.生成缩略图,使用命令行调用ffmpeg工具,支持Linux和Windows 网上很多版本都是需要等待4s的做法, ...
- H5页面调用admob激励视频,用户获取奖励
应用前提条件 使用 Android Studio 3.2 或更高版本 确保您应用的 build 文件使用以下值: minSdkVersion 为 16 或更高版本 compileSdkVersion ...
- 用java程序调用ffmpeg执行视频文件格式转换flv
用java小例题说明更直观:(可以直接编译运行)环境我在windows平台下测试的...需要在e:/下有ffmpeg.exe;mencoder.exe;drv43260.dll;pncrt.dll共4 ...
随机推荐
- Rust 中 *、&、mut、&mut、ref、ref mut 的用法和区别
Rust 中 *.&.mut.&mut.ref.ref mut 的用法和区别 在 Rust 中,*.ref.mut.& 和 ref mut 是用于处理引用.解引用和可变性的关键 ...
- Scratch作品-巴黎2024奥运会
<Scratch作品-巴黎2024奥运会>是一款以巴黎2024年奥运会为主题的互动作品,专为儿童和青少年设计.通过Scratch编程语言,这个作品生动地再现了奥运会的精彩瞬间,结合了动 ...
- [HTTP] HTTP 协议 Response Header 之 Content-Length、Transfer-Encoding与Content-Encoding
0 引言 在近期项目一场景中,一 Web API (响应内容:7MB - 40MB.数据项:5W-20W条)的网络传输耗时较大,短则 5s,长则高达25s,前端渲染又需要耗时 9s-60s. 在这个场 ...
- .NET 开源快捷的数据库文档查询和生成工具
前言 在实际项目开发中,需求变更和项目迭代是常态.要求我们能够迅速响应,对数据库结构进行相应的调整,如添加新表.更新现有表结构或增加字段等. 为了确保团队成员之间的信息同步,实时更新和维护数据库文档变 ...
- Fidder响应数据SyntaxView乱码的处理方法
当Fidder查看响应数据"SyntaxView"出现乱码时,可以点击上方菜单栏的"Decode"按钮,等"Decode"出现蓝色边框后再重 ...
- 【Vue】Re20 VueX 第一部分(共享数据,Getters)
一.概述 专门为VueJS应用程序开发的状态管理模式 集中式存储管理应用的所有组件的状态,按照相应的规则保证状态以一种可预测的方式发生变化 VueX也集成到了官方调试工具devtools extens ...
- 【转载】 SLI导致双显卡被TensorFlow同时占用问题(Windows下) ---------- (windows环境下如何为tensorflow安装多个独立的消费级显卡)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/qq_21368481/article/d ...
- openAI的仿真环境Gym Retro的Game Integration——新游戏融合(2)( 示例 demo )
内容接前文: openAI的仿真环境Gym Retro的Game Integration--新游戏融合(将retro中没有融合的ROM游戏加入其中) 前文大致简单的介绍了gym retro 库对新游戏 ...
- Jmeter SHA512接口加密测试
前言:最近,我遇到一些测试接口必须传入经过SHA512加密后的sign签名,并且签名有1小时时间限制,即签名不是一成不变超1小时就会过期,这导致在测试过程中就得频繁手工去更新签名.其实Jmeter是有 ...
- 获取客户端真实IP备忘
出于安全考虑,近期在处理一个记录用户真实IP的需求.本来以为很简单,后来发现没有本来以为的简单.这里主要备忘下,如果服务器处于端口回流(hairpin NAT),keepalived,nginx之后, ...