Browse Source

tensorflow

isundil 1 month ago
parent
commit
6d73800a86
3 changed files with 31 additions and 2 deletions
  1. 3 0
      package.json
  2. 2 2
      src/fileTypeManager.js
  3. 26 0
      src/filetype/tensorflow.js

+ 3 - 0
package.json

@@ -16,6 +16,9 @@
     "@dashboardcode/bsmultiselect": "^1.1.18",
     "@mdi/font": "^7.3.67",
     "@popperjs/core": "^2.11.8",
+    "@tensorflow-models/mobilenet": "^2.1.1",
+    "@tensorflow/tfjs": "^4.22.0",
+    "@tensorflow/tfjs-node": "^4.22.0",
     "bootstrap": "^5.3.2",
     "bootstrap-icons": "^1.11.2",
     "bootstrap-slider": "^11.0.2",

+ 2 - 2
src/fileTypeManager.js

@@ -2,7 +2,8 @@
 const parsers = [
     require ('./filetype/sharp.js'),
     require ('./filetype/imagemagick.js'),
-    require ('./filetype/meta.js')
+    require ('./filetype/meta.js'),
+    require ('./filetype/tensorflow.js')
 ];
 
 module.exports.createThumbnail = async function(fileObj, w, h, quality) {
@@ -29,4 +30,3 @@ module.exports.createMeta = async function(fileObj) {
     delete result["exifParsed"];
     return result;
 }
-

+ 26 - 0
src/filetype/tensorflow.js

@@ -0,0 +1,26 @@
+
+const fs = require('fs');
+const tfnode = require('@tensorflow/tfjs-node');
+const mobilenet = require('@tensorflow-models/mobilenet');
+
+const modelPromise = mobilenet.load();
+
+module.exports.parse = async (fileObj) => {
+    try {
+        const model = await modelPromise;
+        const tfimage = tfnode.node.decodeImage(fs.readFileSync(fileObj.path));
+        return {
+            value: {
+                tags: ((await model.classify(tfimage)) || [])
+                    .map(x => x.className)
+                    .reduce((acc, i) => acc = acc.concat(i.split(",").map(x => x.trim())), [])
+            }
+        };
+    }
+    catch (err) {
+        console.error(err);
+    }
+    return {};
+}
+
+module.exports.createThumbnail = async (fileObj, w, h, quality) => { return null; };