Com o multer configurado, iremos para o core do app, a api de reconhecimento visual da Watson. Será necessário criar uma conta no https://console.bluemix.net/registration/ para ter acesso ao Watson, ao criar a conta, você poderá criar uma projeto do tipo Visual Recognition e o mesmo retornará um path em json informando quais são os valores para a configuração da api dentro da app.
Inicialmente iremos declarar a variável que irá receber o tipo VR:
var VisualRecognitionV3 = require('watson-developer-cloud/visual-recognition/v3');
Lembrando que o watson-developer-cloud deverá ser previamente instalado pelo comando npm com a opção –save. Após a configuração do tipo da variável, iremos declarar uma outra o qual recebe esse tipo e adiciona configurações pertinentes a conexão com o Watson.
var visualRecognition = new VisualRecognitionV3({
url: 'https://URL/api',
version: 'VERSÃO',
iam_apikey: 'SUA KEY',
});
Finalizado nosso set de conexão, precisamos adicionar o path de onde a imagem está no servidor, lembrando que pra esse projeto, estamos usando uma imagem (1.jpg) que se sobrepõe quando o próximo usuário executa a API.
var params = {
images_file: fs.createReadStream('./public/img/1.jpg')
};
Para evitar problemas com possível delay entre o front-end com o back-end, iremos declarar a variável acima, depois do request do nosso método POST no qual já executou o multer e o mesmo salvou em nosso arquivo destino.
Ao chamar nossa função de reconhecimento visual, precisamos apenas definir o path de onde está a imagem, declarada na variável params, e irá gerar uma função de call-back o qual iremos tratar possíveis erros antes do render da página end.ejs.
visualRecognition.classify(params, function(err, response) {
if (err) {
console.log(err);
} else {
console.log(JSON.stringify(response, null, 2));
res.render('end', { classes: response.images[0].classifiers[0].classes});
}
});
Após o tratamento de possíveis erros, ao renderizar nossa view, enviaremos para nosso front-end uma variável classes, que irá receber todo o json da resposta a partir da informação classes, que irá conter todas as classes da imagem com seus respectivos scores. Quando a api do Watson retorna a classificação, o modelo chega no formato:
data.images[0].classifiers[0].classes[i].class = Nome da Classes da IMG
data.images[0].classifiers[0].classes[i].score = Score em float.
Neste exemplo, iremos usar o classificador padrão do Watson, pode-se montar um conjunto de classes exclusiva no próprio painel de administração do Watson que deverá ser feito afim de dar mais exclusividade ao projeto. Irei exemplificar a baixo.
Imagine que nosso APP precisa classificar se uma foto é um gato, ou um cão. Inicialmente iremos criar as duas classes no painel e fazer a importação dos dados para o treinamento da máquina. Para importar os dados, a própria api do Watson indica a utilização de 10 modelos por classe e todas elas devem estar em um pacote .ZIP.
Necessita uma certa cautela ao selecionar as imagens necessárias para treinamento e autenticação do aprendizado. As imagens responsáveis pelo aprendizado do Watson, precisão ser “cleans” apenas com o elemento referente a classes, mesmo que o mesmo se repita na foto. Como na imagem a seguir:

Imagem para treinamento 
Repetindo classes no mesmo input
Para fazer a autenticação da APP, podemos usar fotos como:

Existe uma classe NOT dentro do projeto, ondem lá pode-se armazenar imagens que não contém nas classes cachorro e gato.
Concluindo:

Treinamento 
NOT 
Validação
Código final da API.js:
var express = require('express');
var router = express.Router();
const multer = require('multer');
var storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, '../ProjIA/public/img');
},
filename: function (req, file, cb) {
var exts = file.originalname.split('.')[1];
cb(null, '1' + '.' + exts);
}
});
var upload = multer({ storage: storage });
var VisualRecognitionV3 = require('watson-developer-cloud/visual-recognition/v3');
var fs = require('fs');
var visualRecognition = new VisualRecognitionV3({
url: '',
version: '',
iam_apikey: '',
});
router.get('/', function(req, res, next) {
res.render('end', { classes: 'teste'});
});
/* GET home page. */
router.post('/', upload.single('file'), function(req, res, next) {
var data = {};
var params = {
images_file: fs.createReadStream('./public/img/1.jpg')
};
visualRecognition.classify(params, function(err, response) {
if (err) {
console.log(err);
} else {
console.log(JSON.stringify(response, null, 2));
res.render('end', { classes: response.images[0].classifiers[0].classes});
}
});
});
module.exports = router;
