Google Cloud Platformのニューラルネットワークモデルで写真からテキストを検出してみた | そう備忘録

Google Cloud Platformのニューラルネットワークモデルで写真からテキストを検出してみた

テキストを検出

以前にGCP(Google Cloud Platform)のニューラルネットワークモデルを使って複数の人物の顔写真より各人の顔のパーツの位置や感情を分析したり、ランドマークを検出して場所を特定するCloud Vision APIについての記事を書いた。

今回は同じCloud Vision APIのText Detection(テキスト抽出)についての記事とする。

画像からテキストを抽出するニューラルネットワークを使ったOCR(Optical Character Reader)と思ってもらえれば良い。

概要図

写真上の文字を抽出する。

写真上の文字を抽出する

事前準備

VMインスタンスの準備からクラウドに写真をアップロードする所までは以前の記事の「写真の人物の顔の表情から感情分析 ~GCP~」と全く同じなので割愛する。

詳細はこちらの記事を参照して欲しい。

ストレージにファイルをアップロード

著作権フリーで文字が写っている写真をネット上で探してGoogleのストレージにアップロードした。

今回使用するフリーの写真

今回使用させて貰ったのは以下の3つの写真。

1枚目は大阪の通天閣周辺の写真。

Cloud Visionは日本語対応しているとは書いてあったのだがGoogleの海外の写真中心に学習したであろうニューラルネットワークに縦書きの文字が認識できるのかを試してみる。

大阪

2枚目は巣鴨地蔵通り商店街の写真。

こちらは横書きなので認識率が高いことを期待。

巣鴨地蔵通商店街

3枚目は海外のカフェ(場所不明)の写真。

テキスト認識と同時にランドマーク検出、顔の表情からの感情分析を同時に試してみることにする。

海外のカフェ

Cloud Storageにアップロード

メニューから”storage”ー>”ブラウザ”、バケットの作成で”cloudvision20200628”を作成してその中に感情分析したい画像をアップロードした。(バケットの作成からファイルのアップロードまで詳しいやり方は以前の記事を参照して欲しい)

尚、外部から参照できるようにallUsersの権限を追加している。

Googleストレージにアップロード

textdetection.jsonの作成

リクエスト用のJSONファイル(textdetection.json)を準備する。

{
  "requests": [
      {
        "image": {
          "source": {
              "gcsImageUri": "gs://cloudvision20200628/text-det-02.jpg"
          }
        },
        "features": [
          {
            "type": "TEXT_DETECTION",
            "maxResults": 5
          }
        ]
      }
  ]
}

gcsImageUri

Google Storage上の写真のパス名を指定する

type

分析のタイプを指定する

  • TEXT_DETECTION:テキスト(画像上の文字をテキストに変換)
  • LANDMARK_DETECTION:ランドマーク(写っている場所が何処かを判別)
  • FACE_DETECTION:顔分析

等が指定可能で複数のtypeを指定する事も出来る

今回はTEXT_DETECTIONを指定した

maxResults

最大検出件数を指定する

実行コマンド

以下のコマンドでCloud Vision APIを呼び出して実行する。

curl -s -X POST -H "Content-Type: application/json" --data-binary @textdetection.json  https://vision.googleapis.com/v1/images:annotate?key=${API_KEY}

実行結果(通天閣)

最初に通天閣周辺の写真の実行結果。

JSONはデータ量が多いので一部省略している。

{
  "responses": [
    {
      "textAnnotations": [
        {
          "locale": "ja",
          "description": "新世發\n1....\n月関関\n新世界\nビアガード\n手約付!\n1冷代\n日本ーの串かっ\n横\n穴子\n味唱\nぐールは\n大安きじゃがな\n那ぼち\nもちいと\nチースしそ巻\n为变\n个木九\n公\n奥8いわし梅肉\nSアスハラ\n客AKN-NN\n新世界\nDK16冬0 局\n由本\n黄网\n处\nCET\n老宴会第り的\n也山\nEU信頼の日立NE\nAYA\nつぼあや\n味くつあ川\n书物 \u003eてっあり\n名物 てったり\n",
          "boundingPoly": {
            "vertices": [
              {
                "x": 505,
                "y": 405
              },
              {
                "x": 3549,
                "y": 405
              },
              {
                "x": 3549,
                "y": 2591
              },
              {
                "x": 505,
                "y": 2591
              }
            ]
          }
        },
        {
          "description": "新",
          "boundingPoly": {
            "vertices": [
              {
                "x": 2393,
                "y": 1005
              },

以下省略


        "text": "新世發\n1....\n月関関\n新世界\nビアガード\n手約付!\n1冷代\n日本ーの串かっ\n横\n穴子\n味唱\nぐールは\n大安きじゃがな\n那ぼち\nもちいと\nチースしそ巻\n为变\n个木九\n公\n奥8いわし梅肉\nSアスハラ\n客AKN-NN\n新世界\nDK16冬0 局\n由本\n黄网\n处\nCET\n老宴会第り的\n也山\nEU信頼の日立NE\nAYA\nつぼあや\n味くつあ川\n书物 \u003eてっあり\n名物 てったり\n"
      }
    }
  ]
}

出力結果のJSONの主な項目は以下の通り。

  • locale:場所
  • vertices:写真上の座標
  • text:抽出されたテキスト

「新世界」の認識はできたり出来なかったり。

新世發と誤読している時もある。

「日本ーの串かっ」は”つ”が小さい”っ”になってしまっているが何とかセーフ。

細かい文字が多いせいか全体的に誤読が多く人間には及ばない様子が分かる。

やはり人(日本人)なら大阪周辺という事が分かれば新世界の誤読はまずしないが、AIだとその辺の理解度はまだまだと感じた。

実行結果(巣鴨)

続いて「巣鴨の地蔵通り」の写真の検出結果。

行数が多いのでlocaleとdescriptionのみ載せる。

          "locale": "ja",
          "description": "行\n政\n集鴨地戲進商店物\n哪/3F\n957\nぶぶらりお参り ゆったり巣鴨\n巢地蔵通り商店街派興組合\n当ビル3 FRs\n直進\n徒歩10分\n右側\n大从堂式山在重深世給上建\n庚申塚\n最古の史法\nハチン恋れい逢っていてす\n小\n地戲\n门INhカ\n",

「ぶらりお参り ゆったり巣鴨」は正しく読み取っているが肝心の「巣鴨地蔵通商店街」は誤読。

一方、その下の小さい文字の「巣鴨地蔵通り商店街振興組合」は比較的正しく読み取れている。

看板が汚れていて黒い雨だれの様なものが見えるのだが、もしかしたらそれが誤読の原因なのかも知れない。

実行結果(海外のカフェ)

最後に海外のカフェ(場所不明)の写真にたいしてTEXT_DETECTION、LANDMARK_DETECTION、FACE_DETECTIONを同時に指定した時の結果。

行数が多いので省略している。

{
  "responses": [
    {
      "faceAnnotations": [

省略


          "rollAngle": 2.0501788,
          "panAngle": 2.9058487,
          "tiltAngle": -6.012346,
          "detectionConfidence": 0.93638027,
          "landmarkingConfidence": 0.7652993,
          "joyLikelihood": "POSSIBLE",
          "sorrowLikelihood": "VERY_UNLIKELY",
          "angerLikelihood": "VERY_UNLIKELY",
          "surpriseLikelihood": "VERY_UNLIKELY",
          "underExposedLikelihood": "VERY_UNLIKELY",
          "blurredLikelihood": "VERY_UNLIKELY",
          "headwearLikelihood": "VERY_UNLIKELY"

省略

      "textAnnotations": [
        {
          "locale": "nl",
          "description": "Brand\nONE\nA LA VACA\nladen/lossen vrachtauto's\nma t/m za van\n07.0 h en Van 11.00h\n-overige motorvoertuigen\nvan 07.00 - 17.00h\nEE\nLANA\n",
          "boundingPoly": {

最初にFace Detecsionの結果の感情分析、続いてText Detectionで文字が検出されている。

一方、Landmark Detectionによる場所の特定は出来なかった模様。

JSONにランドマーク関連の項目は出力されなかった。

特徴のある建物が写り込んでいない場合はランドマークからの場所の特定はやはり難しい。

しかしGoogleマップやGoogle Earthの映像を学習させることにより、そのうち地方の町並みであっても場所が特定されるようになるのかも知れない。

終わりに

以上で写真上の文字を検出するCloud Vision APIの記事は終了とする。

最後に

この記事が何処かで誰かの役に立つことを願っている。

尚、当記事中の商品へのリンクはAmazonアソシエイトへのリンクが含まれています。Amazonのアソシエイトとして、当メディアは適格販売により収入を得ていますのでご了承ください。

souichirou

やった事を忘れない為の備忘録 同じような事をやりたい人の参考になればと思ってブログにしてます。 主にレゴ、AWS(Amazon Web Services)、WordPress、Deep Learning、RaspberryPiに関するブログを書いています。 仕事では工場に協働ロボットの導入や中小企業へのAI/IoT導入のアドバイザーをやっています。 2019年7月にJDLA(一般社団法人 日本デイープラーニング協会)Deep Learning for GENERALに合格しました。 質問は記事一番下にあるコメントかメニュー上部の問い合わせからお願いします。

おすすめ

質問やコメントや励ましの言葉などを残す

名前、メール、サイト欄は任意です。
またメールアドレスは公開されません。