前言
在当今数字化时代,小程序以其便捷、高效的特点成为了人们生活和工作中不可或缺的一部分。而在小程序开发中,上传图片功能常常是关键需求之一。然而,随着网络环境的日益复杂,确保上传的图片以及相关文本不含有敏感内容变得至关重要。今天,我们就来探讨一下如何在小程序开发中实现上传图片功能中,需要关注的内容安全监测接口进行严格的校验。
小程序获取图片,未检测图片是否含有敏感内容(黄赌毒)
- 微信公众平台建议:1.尽快排查删除小程序中已存在的违规内容,包括但不限于平台验证时发布的测试文字、图片等;2.调用内容安全监测接口校验文本/图片是否含有敏感内容,降低被恶意利用导致传播恶意内容的风险。
第一版express版本 调用微信小程序官方img_sec_check接口(官方废弃),也没有通过官方代码审核。。。后面发现nsfwjs,一个JavaScript 库。
代码语言:javascript复制const wxImgCheck = async (token, file) => {
const url = `https://api.weixin.qq.com/wxa/img_sec_check?access_token=${token}`;
const stream = fs.createReadStream(file.path);
const form = new FormData();
form.append('media', stream);
const getHeaders = form => {
return new Promise((resolve, reject) => {
form.getLength((err, len) => {
if (err) { reject(err); };
const headers = Object.assign({ 'Content-Length': len, }, form.getHeaders());
resolve(headers);
});
})
}
try {
const headers = await getHeaders(form);
const res = await axios.post(url, form, { headers });
if (res.data.errcode === 40001 || res.data.errcode === 40013) {
global.AccessToken.flag = true;
const newToken = await getToken();
await wxImgCheck(newToken, file);
}
return res.data;
} catch (err) {
return {
errcode: 500,
message: err.message
}
}
}
今天要介绍的是 nsfwjs
nsfwjs 库,基于 TensorFlow.js 构建。 是一个用于检测图像是否包含不适当内容(Not Safe For Work,NSFW)的 JavaScript 库。
nsfwjs 的工作原理主要基于深度学习中的卷积神经网络(Convolutional Neural Network,CNN)技术来对图像进行分类,以判断图像是否属于不适当内容。
1. 前端项目直接使用
nsfwjs有三个model库:MobileNetV2、MobileNetV2Mid、InceptionV3
我们也能使用自己的匹配库
代码语言:ts复制const model = nsfwjs.load("/path/to/model/directory/");
代码语言:ts复制import * as nsfwjs from 'nsfwjs';
const imgbody = document.getElementById('img');
const img = new Image();
img.crossOrigin = 'anonymous';
img.src =
'https://xxxxxxxx.jpg';
imgbody?.appendChild(img);
if (img) {
const model = await nsfwjs.load('MobileNetV2');
const predictions = await model.classify(img);
console.log('Predictions: ', predictions);
}
下图百分比就是鉴别结果,主要区分如下:
- Drawing 绘图 – 安全的工作图纸(包括动漫)
- Hentai – 变态和色情图纸
- Neutral – 工作中性图像安全
- Porn – 色情图片,性行为
- Sexy – 色情图片,而不是色情内容
2. 通过nestjs后台调用nsfwjs
类似前端直接使用,需要注意的是,model.classify img参数类型
代码语言:bash复制nsfwjs.classify(img: tf.Tensor3D | ImageData | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement, topk?: number): Promise<Array<nsfwjs.predictionType>>
代码语言:ts复制import {
Controller,
Post,
UploadedFile,
UseInterceptors,
} from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import * as nsfwjs from 'nsfwjs';
import * as tf from '@tensorflow/tfjs-node';
import { readFileSync } from 'fs';
import jpeg from 'jpeg-js';
const convert = async (img) => {
// Decoded image in UInt8 Byte array
const image = await jpeg.decode(img, { useTArray: 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');
};
@Controller('image-check')
export class ImageCheckController {
@Post('detect')
@UseInterceptors(FileInterceptor('image'))
async detectImage(@UploadedFile() file) {
if (!file) {
return { error: 'No image uploaded.' };
}
const model = await nsfwjs.load('InceptionV3');
const buffer = readFileSync(file.path);
const image = await convert(buffer);
const predictions = await model.classify(image);
return predictions;
}
}
判断图片非法业务逻辑
假设如果色情概率超过一定阈值则认为非法,看业务需要,根据预测结果中成人内容(porn
或hentai
)的概率是否超过一定阈值(这里假设为 0.5)来判断图片是否非法,并返回判断结果。你可以根据实际情况调整阈值和具体的判断逻辑。(宁可错杀一千,也不放过一个! 哈哈哈)
let isImageIllegal = false;
if (predictions[0].probability > 0.5 && predictions[0].className === 'Porn') {
isImageIllegal = true;
}
后续
本文只是给大家提供一个可行性思路,具体方案可以根据实际业务来处理。(腾讯云、阿里云也提供了图片检测云api,当然需要收钱~)ps:因为nsfwjs的准确率官方模型的准确率小型模型的准确率约为 90%,中型模型约为 93%,实际使用也存在一些误差,主要是可以白嫖。
最后大家可以试试,nsfwjs在线地址
参考
https://nsfwjs.com/
https://github.com/infinitered/nsfwjs
腾讯技术创作特训营s9
「学习NestJS的第一个接口(一)」
「学习NestJS开发小程序后台(一)」