node+nsfwjs搭建图片鉴黄服务
去年由于业务的需要,对图片的内容安全做一定的监控,简单的说就是图片鉴黄,由于早前就体验过nsfwjs的强大,所以第一时间就想到用它搭建一个图片鉴黄的服务。翻看了github上nsfwjs的文档,也有node相关的例子,原本会以为比较顺利的可以搭建完成,没想到后面还是经历了一波三折,所以也就有了这篇文章,记录一下自己的心路历程。
1. 服务框架搭建node框架选择很多,我这里选了egg,因为egg集成了很多丰富的能力,简单省事,并且图片鉴黄,必定会有上传,egg也很好的集成了上传模块,简单配置一下即可放心使用。egg的搭建以及上传的配置,就不展开了,参考官方文档即可。egg官方文档egg上传node版本建议选用 14.x 及以上版本,反正我在centOS 7.x 环境下吃过亏了。
2. 安装12npm install nsfwjsnpm install @tensorflow/tfjs-node
3. 加载模型官方文档给出的例子如下:
1234567891011121314const axios = require('axios')const tf = requir ...
浏览器端crc32文件计算以及分片上传思路
大文件上传我们知道需要做MD5计算以及文件分片,由于最近业务业务上的调整,需要把MD5换成crc32,,crc32可以校验文件的完整性,对于业务处理比较方便。这里记录一下解决思路吧。
1. 文件分片考虑到文件可能很大,出于性能的考虑,优先把文件分片,这里我设置默认5M大小一个分片:
123456789const createFileChunk = (file, size = 5 * 1024 * 1024) => { let chunks = []; let cur = 0; while (cur < file.size) { chunks.push(file.slice(cur, cur + size)); cur += size; } return chunks;};
2. 文件crc32计算首先找一个crc32的库,这里我选了sheetjs的crc32库。为了提高性能,这种纯计算的功能使用web workers另起一个线程处理。
12345678910111213141 ...
你也可以成为鉴黄师,nsfwjs鉴黄库初探
近日,我偶然在Github发现了一个鉴定不雅内容的 js 库 NSFW JS,出于好奇,于是就研究了一下,并且写了一个demo。下面就跟大家分享一下。
首先,NSFW JS 给一张图片鉴定的结果可能会得到如下 5 个分类结果。
绘画(Drawing)——无害的艺术,或艺术绘画;
变态(Hentai)——色情艺术,不适合大多数工作环境;
中立(Neutral)——一般,无害的内容;
色情(Porn)——不雅的内容和行为,通常涉及生殖器;
性感(Sexy)——不合时宜的挑衅内容。
最终结果输出一个数组,每个分类都会输出一个概率,按概率从高到低排,所有分类的概率总和是1
1234567891011121314151617181920212223[ { "className": "Sexy", "probability": 0.35769057273864746 }, { "className": "N ...
演唱会随机选座解题思路
最近遇到一个演唱会随机选座的问题,这个问题细想起来确实有趣,正好周末有空,所以我想花点时间分享一下我的解题思路。
演唱会会场分A、B、C、D四个区域,每个区域第一排50个座位,向后每排递增2个座位,最后一排100个座位。一个人可以买1~5张票,系统要随机分配座位,但必须连号,问要怎么分配?
因为买票的张数不确定性,如果直接随机分配,则有可能出现很多单个位置空出的情况,降低了座位的有效利用率。如果直接顺序出票,那就出现人群扎堆的情况。所以我们要在均衡分布与高利用率之间取一个平衡点。
首先定义座位信息
123456789let item = { index: 0, //下标(索引) group: 0, //分组 groupName: 'A', //分组名称 number: 3, //座位编号 row: 9, //第几排 disable:false //该座位 ...
使用acme.sh 申请 Let's Encrypt 泛域名SSL证书
之前用ertbot方式获取Let’s Encrypt泛域名证书,必须手动在添加DNS TXT 记录,也不能自动续签,使用起来颇为不便。
今天发现了github上的一个开源工具acme.sh,是一个开源的Let’s Encrypt SSL申请工具,操作和流程比官方的申请方式简化很多,使用起来非常方便,推荐大家使用。欢迎大家给该工具打星。
安装acme.sh12curl https://get.acme.sh sh
执行完代码后,acme.sh会被自动安装到~/.acme.sh/中
设置DNS API目前泛域名证书仅支持DNS验证,acme.sh通过DNS提供商的API自动完成操作,因此需要先设置DNS API,以阿里云为例。
先前往阿里云后台获取App_Key跟App_Secret, 在【用户信息管理】-【安全信息管理】创建SecretKey 传送门,然后执行以下脚本
1234# 替换成从阿里云后台获取的密钥export Ali_Key="LTA*********uV6"export Ali_Secret="QKm ...
https实践,Let's Encrypt 免费泛域名 SSL 证书申请
2018 年 3 月 14 日,Let’s Encrypt 对外宣布 ACME v2 已正式支持泛域名证书。这就意外味着用户可以在 Let’s Encrypt 上免费申请支持泛域名的 SSL 证书。
什么是 Let’s Encrypt部署 HTTPS 网站的时候需要证书,证书由 CA 机构签发,大部分传统 CA 机构签发证书是需要收费的,这不利于推动 HTTPS 协议的使用。
Let’s Encrypt 也是一个 CA 机构,但这个 CA 机构是免费的! 也就是说签发证书不需要任何费用。
Let’s Encrypt 是国外一个公共的免费 SSL 项目,由 Linux 基金会托管。由 Mozilla、思科、Akamai、IdenTrust 和 EFF 等组织发起,目的就是向网站自动签发和管理免费证书。以便加速互联网由 HTTP 过渡到 HTTPS,目前 Facebook 等大公司开始加入赞助行列。
Let’s Encrypt 已经得了 IdenTrust 的交叉签名,这意味着其证书现在已经可以被 Mozilla、Google、Microsoft 和 Apple 等主流的浏览器所信任。用 ...
浅尝 HTML 5 input 新属性
在HTML 5中,input增加了许多新的特性,本篇文章整理了一些新增的,并且谷歌浏览器也已经支持的属性。 这些新增的属性,很大程度的丰富了表单控件,很多原来需要js去验证的表单,现在只要一个属性就可以了,大大提高了生产效率。 #color::-webkit-input-placeholder { /* WebKit, Blink, Edge */ color:#f00; } #color::-moz-placeholder { /* Mozilla Firefox 19+ */ color:#f00; } #color:-ms-input-placeholder { /* Internet Explorer 10-11 */ color:#f00; } dl input { border: 1px solid #ccc; }
required 属性required属性规定必需在提交表单之前填写输入字段。
123<!-- 此输入框为必填--><input type="text" required>
list 属性属性引用 da ...
egret3d 用视频video做纹理贴图
前段时间学习了一下egret3d,然后有些奇妙的想法,如果用视频video来做纹理贴图可不可以呢?于是就尝试了一下,效果还不错。
思路也很简单,创建一个立方体,然后把立方的纹理设置成一个视频video,主要代码如下
123456789101112131415161718192021222324252627282930313233343536373839404142 public createGameScene() { this.createVideoTexture(); this.loaderSkyBox();}//创建视频纹理private createVideoTexture() { this.video = new egret3d.VideoTexture(640,264); this.video.source = "resource/oceans-clip.mp4";}// 加载资源private loaderSkyBox() ...
egret引用Animate CC发布的HTML5 Canvas
在flash时代,我们可以在Adobe Flash中导出swf,然后在ActionScript 3.0项目里面引用。让设计人员可以直接提供素材给开发人员,这大大提高了开发效率。
但在egret里,虽然官方也提供了很丰富的工具,但是不得不承认,目前并没有足够的设计人员参与进来,导致开发人员拿到素材后还要“二次加工”,开发效率自然上不去。
所以,在Adobe Animate CC已经普及的今天,我们能不能让Animate CC导出的HTML5 Canvas直接用到我们的项目里呢?
在我尝试了一翻后,确实能达到不错的效果。
1. 建立引用路径
在egret项目里建立一个存放Animate CC导出的HTML文件目录,这里我引用了/html/man的实例。里面的index.html和index.js是用Animate CC发布导出的
2. 动画采集器通过外部引用html,然后获取页面的canvas的bitmap,然后添加到egret的舞台上。
新创建一个类,命名为CollectAnimation.ts
1234567891011121314151617181920212223242526272 ...
egret天空盒子浅尝
现在移动端越来越多类VR的推广H5页面需求,egret恰好也有相关的API可以方便我们使用,这就是egret的天空盒子-egret3d. Sky 在 Egret 3D 所创建的空间中最外层是由天空盒子来包裹起来的。我们通常使用天空盒子来展现风景,地平线,天空,星空等等空间的“大背景”。天空盒子由一组无缝的贴图包裹起来的盒状空间。当我们的 3D 场景中包含有物体时,天空盒子总是充当其背景。
环境:egret 5.0.12 IDE:egret wing 3
加载天空盒子素材资源通过egret3d. QueueLoader加载器加载资源,然后监听资源加载完成事件egret3d. LoaderEvent3D. LOADER_COMPLETE。
12345678910111213141516/** * 加载器 */private queueLoader: egret3d.QueueLoader;// 加载天空盒资源private loaderSkyBox() { this.queueLoader = new egret3d ...