最近实习公司作的项目要使用到Google Cloud上有关Machine Learning的API接口,因此最近一直看这方面的资料比较多,在这里整理一下简单的使用方法,省得以后本身走弯路。node
公司想作的是在一张图片中找到一串电表号(Numero de Compteur Electrique),而且提取中间的一部分。在以前的版本中都是用正则来作的,这一回试图用Google Cloud上的人工智能 API 进行尝试。尽管本人感受熟悉以后用起来应该不是特别困难,可是感受老板不是特别重视,让我尝试一下也只是看看前景。python
主要用到的是:Google Cloud Vision API 和 Google Natural Language API
想要详细了解的话,确定是去看google docs最方便,可是其中有些beta版的只支持英文,这里附上连接:Google AI Docsgit
Google Cloud Vision主要是为了把图片中的text转出来,使用的是ocr的接口。Github上有至关成熟的例子:OCR。主要流程就是,把图片上传到Cloud Storage以后,触发调用包含了OCR接口的Cloud Fonction,把处理以后的.txt在存回Cloud Storage里面。在Github上的例子里,Cloud Fonction仍是包含其余API的,好比Translation API等,真正的大项目可能会触及费用问题。 部署函数时,须要用到:github
gcloud functions deploy NAME --runtime RUNTIME
复制代码
其中NAME必须和export的文件名保持一致,RUNTIME是运行环境(好比Python2.7)。json
若是彻底按照了上面的流程的话,OCR最终输出是在一个Cloud文件夹中的.txt文件。接下来用Natural Language作的就是在这些.txt文件中找到有用的数据。现有的Google IA 能够自主训练的AutoML中大多都是贴标签,可是Natural Language中的实物提取貌似能够抓住对应标签的对象,因此我就进行了尝试。bash
为了创建本身的模型,我先导出了一大批OCR的结果,本身写出了每一个里的关键词。而后把他们逐个合并成立一群.jsonl文件。这里说起一下,训练本身的模型的使用流程是,先处理本身的数据使它变成.jsonl文件格式,以后上传云端的Cloud Storage,在以后制做一个.csv文件,用来把.jsonl文件们倒入Natural Language 的dataset。有点坑的是,跟着Google docs作的话很容易看着导入数据格式的文件,不当心把数据导入到Google Table里。这里要说的是Google docs有很棒的能帮忙把.txt文件转.jsonl文件而且自行生成.csv的脚本:Python Script这样作了以后,你须要在网站上本身添加Key和标签。函数
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文件,一个每一行是text,另外一个每一行是标签对应的Key。个人办法是本身先在本地添加好标签在上传(只有一个标签),附上代码:网站
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文件用来生成dataset,你能够在这里自行定义本身的训练集和测试集,也能够不定义,那么Google将以 Train : Validate : Test = 8 : 1 : 1 进行随机分配。ui
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%的precision。鉴于这只是一个测试用的例子,数据集质量并不高,因此咱们对evaluation这里不作太多的分析。在test一栏中能够直接使用训练好的模型。Google给咱们提供了 REST API 和 python 的使用接口,方便直接在代码中调用训练好的模型。
我的认为,对于用各类特色的对象,仍是应当根据对象特色的不一样多作标签,以达到更高的精度。这也是接下来,我构建真正要使用的模型要作的事。