Skip to content

Commit 30d0edb

Browse files
authored
Merge pull request #8 from eternaleclipse/data-url-support
Added data url support
2 parents 3d276a8 + a4c571a commit 30d0edb

File tree

3 files changed

+96
-69
lines changed

3 files changed

+96
-69
lines changed

index.js

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
global.fetch = require("node-fetch");
22

33
const { Readable } = require('stream');
4-
const tf = require('@tensorflow/tfjs')
5-
const PImage = require('pureimage')
4+
const tf = require('@tensorflow/tfjs');
5+
const PImage = require('pureimage');
66
const isImageUrl = require('is-image-url');
7+
const parseDataUrl = require('parse-data-url');
78

89
const wait = ms => new Promise(r => setTimeout(r, ms));
910

@@ -27,7 +28,7 @@ const retryOperation = (operation, delay, times) => new Promise((resolve, reject
2728
const bufferToStream = (binary) => {
2829
const readableInstanceStream = new Readable({
2930
read() {
30-
this.push(binary)
31+
this.push(binary);
3132
this.push(null);
3233
}
3334
});
@@ -76,7 +77,7 @@ const getTopKClasses = async (logits, classes) => {
7677
topkIndices[i] = valuesAndIndices[i].index;
7778
}
7879

79-
const topClassesAndProbs = []
80+
const topClassesAndProbs = [];
8081
for (let i = 0; i < topkIndices.length; i++) {
8182
topClassesAndProbs.push({
8283
class: classes[topkIndices[i]],
@@ -100,7 +101,7 @@ class SashiDoTeachableMachine {
100101

101102
try {
102103
const modelURL = `${modelUrl}model.json`;
103-
const response = await fetch(`${modelUrl}metadata.json`)
104+
const response = await fetch(`${modelUrl}metadata.json`);
104105
const body = await response.text();
105106
this.model = await tf.loadLayersModel(modelURL);
106107
this.model.classes = JSON.parse(body).labels;
@@ -125,7 +126,7 @@ class SashiDoTeachableMachine {
125126
async classify(params) {
126127
const { imageUrl } = params;
127128

128-
if (!isImageUrl(imageUrl)) {
129+
if ((!imageUrl.startsWith('data:image/')) && (!isImageUrl(imageUrl))) {
129130
return Promise.reject({ error: "Image URL is not valid!" });
130131
}
131132

@@ -138,10 +139,22 @@ class SashiDoTeachableMachine {
138139

139140
async inference({ imageUrl }) {
140141
try {
141-
const data = await fetch(imageUrl);
142-
143-
const contentType = data.headers.get("Content-Type");
144-
const buffer = await data.buffer();
142+
let data;
143+
let buffer;
144+
let contentType;
145+
146+
if (imageUrl.startsWith('data:image/')) {
147+
data = parseDataUrl(imageUrl);
148+
149+
contentType = data.contentType;
150+
buffer = data.toBuffer();
151+
} else {
152+
data = await fetch(imageUrl);
153+
154+
contentType = data.headers.get("Content-Type");
155+
buffer = await data.buffer();
156+
}
157+
145158
const stream = bufferToStream(buffer);
146159
let imageBitmap;
147160

package-lock.json

Lines changed: 71 additions & 58 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)