学习NestJS开发小程序后台(二)检测图片敏感内容

2024-09-23 16:52:28 浏览数 (2)

前言

在当今数字化时代,小程序以其便捷、高效的特点成为了人们生活和工作中不可或缺的一部分。而在小程序开发中,上传图片功能常常是关键需求之一。然而,随着网络环境的日益复杂,确保上传的图片以及相关文本不含有敏感内容变得至关重要。今天,我们就来探讨一下如何在小程序开发中实现上传图片功能中,需要关注的内容安全监测接口进行严格的校验。

小程序获取图片,未检测图片是否含有敏感内容(黄赌毒)

  • 微信公众平台建议: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;
  }
}
判断图片非法业务逻辑

假设如果色情概率超过一定阈值则认为非法,看业务需要,根据预测结果中成人内容(pornhentai)的概率是否超过一定阈值(这里假设为 0.5)来判断图片是否非法,并返回判断结果。你可以根据实际情况调整阈值和具体的判断逻辑。(宁可错杀一千,也不放过一个! 哈哈哈)

代码语言:ts复制
let isImageIllegal = false;
if (predictions[0].probability > 0.5 && predictions[0].className === 'Porn') {
  isImageIllegal = true;
}
后续

本文只是给大家提供一个可行性思路,具体方案可以根据实际业务来处理。(腾讯云、阿里云也提供了图片检测云api,当然需要收钱~)ps:因为nsfwjs的准确率官方模型的准确率小型模型的准确率约为 90%,中型模型约为 93%,实际使用也存在一些误差,主要是可以白嫖。

最后大家可以试试,nsfwjs在线地址

nsfwjs在线地址nsfwjs在线地址

参考

https://nsfwjs.com/

https://github.com/infinitered/nsfwjs

腾讯技术创作特训营s9

「学习NestJS的第一个接口(一)」

「学习NestJS开发小程序后台(一)」

0 人点赞