Image result for API

Dans la partie précédente nous avons vu le routing ainsi que l’upload de fichier, dans cette partie nous verront la communication avec l’API de Clarifay, pour tagger nos images automatiquement.

Partie 3 : Clarifai

Clarifai est une API de reconnaissance d’image : on envoie en Ajax, soit l’url de l’image, sois celle-ci directement et on reçoit la réponse sous forme de JSON.

Pour l’utiliser il faudra déjà aller vous créer un compte pour recevoir les identifiants nécessaires ici

Ensuite il faut installer le SDK avec npm :

$ npm install --save clarifai

On va créer le client Clarifai:

$ touch /api/clarifay.js

Le Code:


// content of api/clarifay.js
var Clarifai = require('clarifai');

// extends the Clarifai.App
class ImageProcessing extends Clarifai.App {
constructor(clientId, clientSecret) {
super(clientId, clientSecret);
}
analyse(base64data) {
return this.models.predict(Clarifai.GENERAL_MODEL, base64data)
}
}

// instantiate a new Clarifai app passing in your clientId and clientSecret
module.exports = new ImageProcessing(
'clientId',
'clientSecret'
)

Grace aux nouvelles features de l’ES6 on va améliorer notre client Clarifai de base, on va donc faire une classe qui prolonge celui-ci et implementer notre propre méthode : analyse qui va nous renvoyer un object de type Promise ( d’où le .then() ).

Il nous reste ensuite a implementer ce code au moment de l’upload d’image et qui renverra les résultats de l’analyse :


//content of api/app.js
const express = require('express')
const multer = require('multer')
const clarifay = require('./clarifay')
const fs = require('fs');

const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, './uploads')
},
filename: (req, file, cb) => {
cb(null, `${Date.now()}.${file.mimetype.split('/')[1]}`)
}
})

const upload = multer({ storage })
const app = express()

app.post('/photos/upload', upload.array('photos'), function (req, res, next) {
const message = { "data": [] }
req.files.forEach(image => {
fs.readFile(image.path, function (err, data) {
// predict the contents of an image by passing in base 64 encoded file
clarifay
.analyse(new Buffer(data).toString('base64'))
.then(
response => {
message.data.push({
'image': {
'path': image.path,
'tags': serialize(response.outputs[0].data.concepts)
}
})
// if every image has been proccessed send back the response
if (message.data.length == req.files.length) {
res.status(200).send(message)
}
},
err => console.error(err)
);
});
})
})

// get the tags from the Clarifay API
const serialize = (array) => {
let subjects = [];
array.forEach(function (element) {
subjects.push(element.name)
});
// get only the best of 3 results
return subjects.slice(0, 3)
}

module.exports = app

on va lire l’image uploadée grace au module intégré dans Node.js : fs ou filesystem et renvoier une réponse avec l’emplacement et le nom de l’image upload ainsi que les tags qui lui sont liés. Le code du tutoriel est ici.

Dans la prochaine partie nous allons stocker ces résultat dans la base de données avec MongoDB et gérer les réponses de l’API avec les images stockées.