Google Cloud AI API 簡單使用記錄

最近實習公司作的項目要使用到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

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

Google Natural Language

若是徹底按照了上面的流程的話,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 的使用接口,方便直接在代碼中調用訓練好的模型。

我的認爲,對於用各類特色的對象,仍是應當根據對象特色的不一樣多作標籤,以達到更高的精度。這也是接下來,我構建真正要使用的模型要作的事。

相關文章
相關標籤/搜索