infinitered / nsfwjs

NSFW detection on the client-side via TensorFlow.js
https://nsfwjs.com/
MIT License
7.94k stars 529 forks source link

why numchannels is defined as 3, why use Int32Array #476

Open DevTheKing opened 3 years ago

DevTheKing commented 3 years ago
  1. why numchannels is defined as 3, why use Int32Array ??
  2. what is the meaning of this line and why there is a constant value 4 ?
  3. whats is req.file.buffer ?
GantMan commented 3 years ago

Which file are you looking at? I assume a demo?

DevTheKing commented 3 years ago

on this code for node js @GantMan

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() }

// Keep the model in memory, make sure it's loaded only once load_model().then(() => app.listen(8080))