.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 ...
随机推荐
- 【Java】项目采用的设计模式案例
先说一下业务需要: 做电竞酒店后台系统,第一期功能有一个服务申请的消息通知功能 就是酒店用户在小程序点击服务功能,可以在后台这边查到用户的服务需要 原本设计是只需要一张表存储这些消息,但是考虑设计是S ...
- 【MySQL】 批量更改库,表,字段的字符集
库一级的更改: -- 单个库字符集更改 ALTER DATABASE `ymcd_aisw` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'; ALTER ...
- 【Java】API 时区ID类
主要是用以获取时区ID @Test void contextLoads() { ZoneId zoneId = ZoneId.systemDefault(); // System.out.printl ...
- git No url found for submodule path 'xxxxx' in .gitmodules
删除之前的子模块记录 rm -rf git rm --cached 然后加进去 git submodule add
- StartImage.DLL使用说明
StartImage.DLL使用说明 一.库的引入 库包含以下物件,请按照要求将以下库映入到项目中 StartImage.dll StartImage.lib StartImage.h 二.注意事项 ...
- 【问题解决】git status中文文件名乱码
问题复现 解决办法 在git bash中直接执行如下命令 git config --global core.quotepath false 原因 通过 git config --help 可以查看到以 ...
- 18-canvas绘制饼状图
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- 【牛客刷题】HJ10 字符个数统计
题目链接 简单的说这题就是字符串去重以后检查长度.如果用Java的话,可以遍历字符串,然后利用Set来进行去重,最后统计Set的size就可以了.但是如果是Go语言,则稍微麻烦点.基本思路就是用map ...
- 为什么要加 REQUIRE8 and PRESERVE8? 栈的8字节对齐
REQUIRE8 and PRESERVE8 The REQUIRE8 and PRESERVE8 directives specify that the current file require ...
- 使用Ollama本地离线体验SimpleRAG(手把手教程)
Ollama介绍 Ollama是一个开源项目,专注于开发和部署大语言模型,特别是像LLaMA这样的模型,用于生成高质量的文本和进行复杂的自然语言处理任务.Ollama的目标是让大语言模型的运行和使用变 ...