Google Cloud Vision APIのOCRを触ってみた
画像からテキストを読むことで、データを効率よく取得できるのではないかと考えGoogle Cloud Vision APIのOCR機能を触ってみました。公式ページのチュートリアルとほぼ同じです。go言語でやってみました。
まず最初に、Vision APIを使用するための設定を行います。 クイックスタート: クライアント ライブラリを使用して画像内のラベルを検出する | Cloud Vision API | Google Cloud
今回はローカルの画像を対象としました。
ctx := context.Background() // Creates a client. client, err := vision.NewImageAnnotatorClient(ctx) if err != nil { log.Fatalf("Failed to create client: %v", err) } defer client.Close() filename := "Image.jpg"//対象とする画像ファイル名 file, err := os.Open(filename) if err != nil { log.Fatalf("Failed to read file: %v", err) } defer file.Close() image, err := vision.NewImageFromReader(file) if err != nil { log.Fatalf("Failed to create image: %v", err) } texts, err := client.DetectTexts(ctx, image, nil, 10)//OCRなのでDetectTexts。ラベル検出だとDetectLabels if err != nil { log.Fatalf("Failed to detect labels: %v", err) } for _, text := range texts { fmt.Println(text.Description) } }
これで取得したテキストを表示します。テキストは、1行ごとに検出されるというよりはテキストの空白が文章の文字と文字の空白より大きいと判断されたら分割されます。例えば画像中に「弁当 400」があったとしたら、「弁当 400」で読まれるのではなく、「弁当」と「400」で読まれます。
位置はtext.BoundingPoly.String()で取得します。以下の文字列が返されます。
{vertices:{x:205 y:24} vertices:{x:210 y:24} vertices:{x:210 y:29} vertices:{x:205 y:29}}
これはテキスト領域を4角形で検出した4つの頂点の座標を表しています。対象画像のサイズが決まっていたり、テキストに目次がついていれば位置や取得結果からデータを取得できそうだな、と感じました。
Amazon Rekognitionはどうなのか
画像認識サービスとしてもう一つ上げられるのがAmazon Rekognitionです。こちらは、日本語に対応していません。今回対象とした画像は日本語だったため、Google Cloud Vision APIを採用しました。
精度
大方読めていました。ですが、「!」が「i」になったり、半角アルファベットが記号になったりと、文字と文字の間隔が狭かったり似ている記号や文字はミスすることがあるようです。
まとめ
これを使って何か作ってみようと思います。多くのデータを取得するのであれば、手打ちよりも早くできそうですし。