Всё о web

Для чайников и не только


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

Ноябрь 18, 2016

Появилась задача распознать текст на пачке картинок (~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);

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



Комментарии

Оставить комментарий:

Ваш e-mail не будет опубликован. Обязательные поля помечены *