В последнее время проект, выполненный стажерской компанией, должен использовать интерфейс 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, в котором удобно вызывать обученную модель прямо в коде.
Лично я считаю, что для объектов с различными характеристиками нужно делать больше меток по разным характеристикам объектов для достижения большей точности. Это то, что я собираюсь сделать дальше, чтобы построить модель, которую я действительно собираюсь использовать.