хуйу нас не матерятся
Появилась задача распознать текст на пачке картинок (~30k штук), при этом tesseract спасовал, выдавая очень нестабильный результат. По этому принял решение использовать всю мощь корпорации добра.
Итак, есть картинки вида:
На них нужно распознать текст и положить его аккуратно рядом с картинкой.
В первую очередь нам нужен аккаунт 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);
Собсно это всё. Написание скрипта занимает времени меньше чем подготовка.