mirror of
https://github.com/ragestudio/comty.git
synced 2025-06-10 02:54:15 +00:00
73 lines
1.8 KiB
JavaScript
Executable File
73 lines
1.8 KiB
JavaScript
Executable File
const tf = require("@tensorflow/tfjs-node")
|
|
|
|
import * as nsfwjs from "nsfwjs/dist"
|
|
import sharp from "sharp"
|
|
|
|
import fs from "fs"
|
|
import path from "path"
|
|
|
|
import downloadFile from "../download-file"
|
|
import readImage from "../read-image"
|
|
import imageByteArray from "../image-byte-array"
|
|
|
|
const imageToInput = (image, numChannels) => {
|
|
const values = imageByteArray(image, numChannels)
|
|
const outShape = [image.height, image.width, numChannels]
|
|
const input = tf.tensor3d(values, outShape, "int32")
|
|
|
|
return input
|
|
}
|
|
|
|
if (global.isProduction) {
|
|
tf.enableProdMode()
|
|
}
|
|
|
|
export default async (payload) => {
|
|
try {
|
|
let { url, image, channels = 3 } = payload
|
|
|
|
let file = null
|
|
const model = await nsfwjs.load()
|
|
|
|
if (!image && url) {
|
|
file = await downloadFile({ url })
|
|
|
|
image = file.destination
|
|
}
|
|
|
|
// check if image is not a jpg
|
|
if (image.indexOf(".jpg") === -1) {
|
|
// convert image to jpg
|
|
const converted = await sharp(image)
|
|
.jpeg()
|
|
.toBuffer()
|
|
|
|
// write converted image to disk (use cache)
|
|
const destination = path.resolve(global.uploadCachePath, `${Date.now()}.jpg`)
|
|
|
|
fs.writeFileSync(destination, converted)
|
|
|
|
// set image to the converted image
|
|
file = {
|
|
destination,
|
|
delete: () => fs.unlinkSync(destination),
|
|
}
|
|
|
|
image = destination
|
|
}
|
|
|
|
const logo = readImage(image)
|
|
const input = imageToInput(logo, channels)
|
|
|
|
const predictions = await model.classify(input)
|
|
|
|
if (typeof file.delete === "function") {
|
|
await file.delete()
|
|
}
|
|
|
|
return predictions
|
|
} catch (error) {
|
|
console.error(`Failed to process image >`, error)
|
|
console.trace()
|
|
}
|
|
} |