Простая запись использования Google Cloud AI API

машинное обучение искусственный интеллект

В последнее время проект, выполненный стажерской компанией, должен использовать интерфейс API, связанный с машинным обучением в Google Cloud, поэтому в последнее время я читал много информации в этой области.

Потребности компании

Что компания хочет сделать, так это найти строку номеров счетчиков (Numero de Compteur Electrique) на изображении и извлечь среднюю часть. В предыдущих версиях это делалось с помощью регулярных выражений, в этот раз я попробовал использовать API искусственного интеллекта в Google Cloud. Хотя я чувствую, что это не должно быть особенно сложно использовать после того, как я ознакомлюсь с ним, но я чувствую, что босс не обращает на это особого внимания, поэтому я просто пробую его, чтобы увидеть перспективы.

В основном используется: Google Cloud Vision API и Google Natural Language API.
Если хотите узнать больше, то однозначно удобнее всего зайти в google docs, но некоторые из бета-версий поддерживают только английский язык, вот ссылка:Google AI Docs

Google Cloud Vision

Google Cloud Vision предназначен в основном для передачи текста на картинке с помощью интерфейса распознавания текста. На Github есть довольно зрелые примеры:OCR. Основной процесс заключается в том, что после загрузки изображения в облачное хранилище инициируется вызов Cloud Fonction, который включает интерфейс OCR, и сохранение обработанного .txt обратно в облачное хранилище. В примере на Github Cloud Fonction по-прежнему включает в себя другие API, такие как API перевода и т. д. Действительно большой проект может затронуть вопрос стоимости. При развертывании функции необходимо использовать:

gcloud functions deploy NAME --runtime RUNTIME

Среди них NAME должно совпадать с именем экспортируемого файла, а RUNTIME — это рабочая среда (например, Python2.7).

Google Natural Language

Если описанный выше процесс выполняется точно, конечным результатом OCR является файл .txt в облачной папке. Следующее, что нужно сделать с Natural Language, — это найти полезные данные в этих файлах .txt. Большинство существующих AutoML, которые Google IA может обучать независимо, помечены, но физическое извлечение на естественном языке, похоже, способно захватить объект, соответствующий метке, поэтому я попробовал.

Чтобы построить свою собственную модель, я сначала экспортировал большое количество результатов OCR и сам написал ключевые слова в каждом из них. Затем объедините их один за другим, чтобы сформировать группу файлов .jsonl. Здесь упоминается, что процесс обучения вашей собственной модели заключается в том, чтобы сначала обработать ваши собственные данные, чтобы преобразовать их в формат файла .jsonl, затем загрузить их в облачное хранилище в облаке, а затем создать файл .csv для преобразования файла . jsonl.Залить в набор данных Natural Language. Небольшой подвох заключается в том, что если вы следуете документам Google, легко просмотреть файл в формате импортированных данных и случайно импортировать данные в таблицу Google. Я хочу сказать, что в документах Google есть отличный скрипт, который может помочь преобразовать файлы .txt в файлы .jsonl и создать .csv самостоятельно:Python ScriptПосле этого вам нужно самостоятельно добавить ключи и теги на сайт.

Формат файла Jsonl:

{
  "annotations": [
     {
      "text_extraction": {
         "text_segment": {
            "end_offset": number, "start_offset": number
          }
       },
       "display_name": string
     },
     {
       "text_extraction": {
          "text_segment": {
             "end_offset": number, "start_offset": number
           }
        },
        "display_name": string
     },
   ...
  ],
  "text_snippet":
    {"content": string}
}

У меня есть два файла .txt, один для каждой строки - это текст, а другой для каждой строки - это ключ, соответствующий метке. Мой метод заключается в добавлении тегов локально перед загрузкой (только один тег) и прикреплении кода:

const fs = require('fs');
const readline = require('readline');

readFileToArr("./catchinformation.txt", function (data) {
  for (var i = 0; i < 88; i++) {
    var index = fs.readFileSync("./Image/F" + (i + 1) + ".txt", 'utf-8');
    var object = {
      annotations: [],
      text_snippet:
        { content: index }
    };
    if (data[i] != "") {
      var annotation = {
        text_extraction: {
          text_segment: {
            end_offset: index.search(data[i]) + data[i].length, start_offset: index.search(data[i])
          }
        },
        display_name: "n_Matricule"
      }
      object.annotations.push(annotation);
    }
    var resultJson = JSON.stringify(object);
    fs.writeFile("./Jsonl/F" + (i + 1) + ".jsonl", resultJson, 'utf8', function (err) {
      if (err) {
        console.log("An error occured while writing JSON Object to File.");
        return console.log(err);
      }
      //console.log("JSON file" + (i + 1) + " has been saved.");
    });
  }
}
)

function readFileToArr(fReadName, callback) {
  var fRead = fs.createReadStream(fReadName);
  var objReadline = readline.createInterface({
    input: fRead
  });
  var arr = new Array();
  objReadline.on('line', function (line) {
    arr.push(line);
    //console.log('line:'+ line);
  });
  objReadline.on('close', function () {
    // console.log(arr);
    callback(arr);
  });
}

//readFileToArr函数来源:https://blog.csdn.net/yajie_china/article/details/79407851 

После этого импортируйте файл .csv в следующем формате для создания набора данных, вы можете определить здесь свой собственный обучающий набор и тестовый набор или нет, тогда Google будет использовать Train: Validate: Test = 8: 1: 1 для случайного назначения .

TRAIN,gs://my-project-lcm/training-data/traindata.jsonl
VALIDATE,gs://my-project-lcm/training-data/validatedata.jsonl
TEST,gs://my-project-lcm/training-data/testdata.jsonl

результаты и использование

Время ожидания еще очень долгое, по крайней мере я сидел рядом с компьютером и ждал три часа без обученной модели. В этом примере я использовал только более тысячи данных и одну метку.

В итоге мы получаем точность 98,1%. Поскольку это всего лишь тестовый пример, качество набора данных невысокое, поэтому мы не проводим здесь слишком много анализа оценки. Обученную модель можно использовать непосредственно в тестовой колонке. Google предоставляет нам REST API и интерфейс на python, в котором удобно вызывать обученную модель прямо в коде.

Лично я считаю, что для объектов с различными характеристиками нужно делать больше меток по разным характеристикам объектов для достижения большей точности. Это то, что я собираюсь сделать дальше, чтобы построить модель, которую я действительно собираюсь использовать.