Пример использования Google-vision API

Появилась задача распознать текст на пачке картинок (~30k штук), при этом tesseract спасовал, выдавая очень нестабильный результат. По этому принял решение использовать всю мощь корпорации добра.

Итак, есть картинки вида:

003

На них нужно распознать текст и положить его аккуратно рядом с картинкой.

Установка google-sdk

В первую очередь нам нужен аккаунт google, если его у Вас нет, придётся зарегистрироваться. Далее заходим на страницу активации триальной версии: https://console.cloud.google.com/freetrial?_ga=1.159943101.1207033316.1479453903 Заполняем все формочки. Вас так же попросят привязать кредитную карту, придётся это сделать, иначе никак.

На всякий случай попробуйте сделать пример: https://cloud.google.com/vision/docs/quickstart

Если всё ок, триал активирован, апи включено то "Quickstart" пример должен сработать, если же нет, то что-то не так с аккаунтом, и переходить к следующему этапу смысла нет. Тут же Вам предложат создать приватный ключ в json формате, сохраните его, он нам дальше пригодится.

Если всё ок, заходим на страничку: https://cloud.google.com/sdk/docs/quickstart-linux

Скачиваем архив, читаем инструкцию, распаковываем ставим, и привязываем всё к учётной записи.

Создаём проект

mkdir smart.ly
cd smart.ly
touch main.js
npm install google-cloud path

Копируем наш json ключ в эту же папку и пишем скриптик:

var gcloud = require('google-cloud');
var Vision = gcloud.vision;
var fs = require('fs');
var pathInfo = require('path')

var startFolder = 'Smartly';

// Instantiate a vision client
var vision = Vision({
  projectId: 'smartly', // id проекта, должен быть создан в консоли
  keyFilename: 'НАШ_ПРИВАТНЫЙ_КЛЮЧ.json'
});

function detectText (inputFile, callback) {
  // Основная функция, это и есть запрос к google-vision api
  vision.detectText(inputFile, { verbose: false }, function (err, text) {
    if (err) {
      return callback(err);
    }
    callback(null, text);
  });
}

function main (inputFile, callback) {
  detectText(inputFile, function (err, text) {
    if (err) {
      return callback(err);
    }
    callback(inputFile, text);
  });
}

// Сохранение результатов, будем просто создавать новый файл, с "#" в начале имени
function saveResults(inputFile, data){
  try {
    var newFile = inputFile.replace(pathInfo.extname(inputFile), '.json');
    fs.writeFile(newFile, JSON.stringify(data));
  } catch (err) {
    
  }
}

// Так как у нас много вложенных папок, нам их нужно прочитать рекурсивно
function readRecur(folder, callback) {
  var dir = fs.readdirSync(folder);
  var path;
  for(var item of dir) {
    path = folder + '/' + item;
    if( fs.lstatSync(path).isDirectory() )
      readRecur(path, callback)
    else {
      if( pathInfo.basename(path).indexOf('#') > -1 )
        callback(path, saveResults);
    }
  }
}

readRecur(startFolder, main);

Собсно это всё. Написание скрипта занимает времени меньше чем подготовка.



Когда Casper.js недостаточно (Selenium)

Если у Вас есть только одна попытка, и ни в коем случае нельзя спалиться что вы используете бота, то Вас спасёт Selenium. Это практически самый тяжелый калибр, дальше только sikuli.

Нейросети на JavaScript

Если Вы поищите по npm репозиторию фразу "machine learning", то получите пачку готовых библиотек, одна из них synaptic. Давайте её немного изучим.


(0) Комментариев