11global . fetch = require ( "node-fetch" ) ;
22
33const { 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' ) ;
66const isImageUrl = require ( 'is-image-url' ) ;
7+ const parseDataUrl = require ( 'parse-data-url' ) ;
78
89const wait = ms => new Promise ( r => setTimeout ( r , ms ) ) ;
910
@@ -27,7 +28,7 @@ const retryOperation = (operation, delay, times) => new Promise((resolve, reject
2728const 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
0 commit comments