Google Cloud Platformでのアカウント登録から、MacbookからAPIを叩いて成功するまで


##１. 事前準備

自分が管理するGCPアカウントで立ち上げたGCPプロジェクトに、手元のMacbookからsshリモート接続して、GCPのAPIを叩くためには、__次の準備を行う必要__があります。

__１. GCPアカウントの取得__
__２. GCPプロジェクトの作成__
__３. 作成したGCPプロジェクトの認証キー（jsonファイル）の作成と、ローカルPCへのダウンロード__

1〜３の手順は、次のウェブページがわかりやすいです。私もこのウェブページに沿って、準備を行いました。

- [Google Cloud Vision APIのOCRを使ってPythonから文字認識する方法](https://valmore.work/cloud-vision-api-ocr/)

__「３」に続けて__、Macbookの任意の場所（ディレクトリ）に、ダウンロードした__認証キーのファイル（jsonファイル）を格納__します。

（以下、XXYYZZAABBCCDDの部分は、各自のjsonファイル名に読み替えて下さい）

```bash:Terminal    
electron@diynoMacBook-Pro Desktop % cd gcp
electron@diynoMacBook-Pro gcp % ls
XXYYZZAABBCCDD.json
electron@diynoMacBook-Pro gcp % 
```

その後、__認証キー（jsonファイル）の格納先の絶対パスを、GCPの環境変数として、Macbookに登録__します。

（以下、XXYYZZAABBCCDDの部分は、各自のjsonファイル名に読み替えて下さい）

```bash:Terminal
electron@diynoMacBook-Pro gcp % export GOOGLE_APPLICATION_CREDENTIALS="/Users/electron/Desktop/gcp/XXYYZZAABBCCDD.json"
```` 

export文を、bashrcファイルとbash_profileファイルに書いておくと良いです。

- https://ja.softwareuser.asklobster.com/posts/678113/bash_profile-%E3%81%AB%E8%A1%8C%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/

これで、Macbook内の任意のディレクトリから、Terminal起動 -> Python3立ち上げて、以下のようにGCPに接続して、インスタンスを呼び出すことができます。

```Python3
from google.cloud import vision
client = vision.ImageAnnotatorClient()
```

##２. PythonのGCPライブラリの最新化

手元のMacbookのTerminalを立ち上げて、Pythonの__*google-cloud-storage*ライブラリ__を最新化しておきます。

- [cloud.google.com Python 開発環境の設定](https://cloud.google.com/python/setup?hl=ja)

> ####Python 用 Cloud クライアント ライブラリをインストールする
>
> Python 用 Cloud クライアント ライブラリは、Python デベロッパーが Python を Datastore や Cloud Storage などの Google Cloud サービスと統合する方法を示します。Cloud Storage などの個々の API のパッケージをインストールするには、次のようなコマンドを使用します。
>
> pip install --upgrade google-cloud-storage
>

```bash:Terminal  
electron@diynoMacBook-Pro gcp % pip3 install --upgrade google-cloud-vision
```

##3. GCPのAPIを叩くPythonコードを書く

これで準備がすべて整いました。
MacbookのTerminalでPythonを立ち上げて、GCPのAPIを叩いてみます。

今回は、GCPの__OCR機能のAPI__を叩いて、__画像ファイルのなかに写り込んだ文字（列）の抽出__を試みてみます。

####（ 入力画像 ）

![スクリーンショット 2021-07-20 21.30.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754134/8cd0a415-649b-f4ae-05d6-0b95de4e85e9.png)


```bash:Terminal                  
electron@diynoMacBook-Pro gcp %  python3                                                                                                
>>> from pathlib import Path
>>> from google.cloud import vision
>>> 
>>> client = vision.ImageAnnotatorClient()
>>> p2 = Path().parent / 'sample2.png'
>>>
>>> with p2.open('rb') as image_file:
...     content = image_file.read()
... 
>>> 
>>> image2 = vision.Image(content=content)
>>> response = client.text_detection(image=image2)
>>> 
>>> for text in response.text_annotations:
...     print(text.description)
... 
東京2020 公式アートポスター展
Tokyo 2020 Official Art Posters Exhibition
荒木飛呂彦Hirehiko Araki
浦沢直樹 Nacki Urasawa
大竹伸朗 Sie Ohta
大原大次郎 Dalre Ohara
柿沼康二Koji Kakinuma
金澤翔子 Shoko Kanazawa
GO0 CHOKI PAR
鴻池朋子Tomoke Koneike
野老朝雄 Taele
山口晃A Yamaguch
ヴィヴィアンサッセン viane Sasen フィリップ·ワイズベッカー hipe Westecier
佐藤卓Taku Satoh
新木友行Tomoyul Shinkl
继川実花Mka Ninagawa
ホンマタカシTakashi Homma
森千裕Cilire Mor
テセウスチャン Theseus Chan
クリスオフィリ chris Of
東京都現代美術館Museum of Contemporary Art Tokyo
TOKYO 2020
TOK YO 2020
Sun ER 0-18-00 Opening Hours 10:00-18-00 N Aison Free

東京
2020
公式
アート
ポスター
展
Tokyo
2020
Official
Art
Posters
Exhibition
荒木
飛
呂
彦
Hirehiko
Araki
浦
沢
直樹
Nacki
Urasawa
大竹
伸
朗
Sie
Ohta
大
原
大
次郎
Dalre
Ohara
柿沼
康
二
Koji
Kakinuma
金澤翔
子
Shoko
Kanazawa
GO0
CHOKI
PAR
鴻
池
朋
子
Tomoke
Koneike
野老
朝
雄
Taele
山口
晃
A
Yamaguch
ヴィヴィアン
サッセン
viane
Sasen
フィリップ
·
ワイズ
ベッカー
hipe
Westecier
佐藤
卓
Taku
Satoh
新
木
友
行
Tomoyul
Shinkl
继
川
実
花
Mka
Ninagawa
ホンマ
タカシ
Takashi
Homma
森
千
裕
Cilire
Mor
テセウス
チャン
Theseus
Chan
クリスオフィリ
chris
Of
東京
都
現代
美術館
Museum
of
Contemporary
Art
Tokyo
TOKYO
2020
TOK
YO
2020
Sun
ER
0-18-00
Opening
Hours
10:00-18-00
N
Aison
Free
>>> 
```

見事、__画像ファイル内の日本語文字列の抽出に成功__しました:airplane:

ここまで、MacbookのTerminalから、GCPにsshでリモート接続して、OCR APIを叩いて、結果を受け取ることができました。

ここからは、コードをスクリプトファイルに書いて、GCPに画像ファイルを投げてみます。

- [Cloud Vision APIを使ってみた](https://qiita.com/hiromi_iwai/items/f320e787e3d830e9dda0)

上記の記事に掲載されているコードのうち、以下の部分を修正しました。

- ファイル名：　 コマンドライン引数で受け取るように変更
- 出力メッセージ： Terminal標準出力に表示されるメッセージの形式を変更


```Python3:text_detection_args.py
import io
import argparse, os
from pathlib import Path
from google.cloud import vision

# 画像ファイル名をコマンドライン引数から受け取る
parser = argparse.ArgumentParser(description='')    #
parser.add_argument('file_name')  
args = parser.parse_args()  

image_file = args.file_name
client = vision.ImageAnnotatorClient()

p = Path().parent / image_file
with p.open('rb') as image_file:
	content = image_file.read()

#image = vision.types.Image(content=content)
image = vision.Image(content=content)
response = client.text_detection(image=image)
texts = response.text_annotations

print("\n解析対象のファイル　： " + str(args.file_name) + "\n")
print(str(len(texts)) + "件の文字（列）が見つかりました。 \n")

try:
	if texts is None or len(texts) == 0:
		print("\n何も検出されませんでした。\n")
	else:
		for i, text in enumerate(texts):
			if i == 0:
				print("\n検出された文字列の全体　：\n" + str(text.description)  + "\n")
				print("------------------------------------------------")
			else:
				print("\n" + str(i) + "番目の検出文字（列）")
				print('検出された文字（列）　： "{}"'.format(text.description))
				vertices = (['({},{})'.format(vertex.x, vertex.y) for vertex in text.bounding_poly.vertices])
				print('画像内の文字列の座標値　：  {}'.format(','.join(vertices)))
except:
		pass			
	

```

```bash:Terminal
electron@diynoMacBook-Pro gcp % python3 text_detection_args.py sample2.png

解析対象のファイル　： sample2.png

126件の文字（列）が見つかりました。 


検出された文字列の全体　：
東京2020 公式アートポスター展
Tokyo 2020 Official Art Posters Exhibition
荒木飛呂彦Hirehiko Araki
浦沢直樹 Nacki Urasawa
大竹伸朗 Sie Ohta
大原大次郎 Dalre Ohara
柿沼康二Koji Kakinuma
金澤翔子 Shoko Kanazawa
GO0 CHOKI PAR
鴻池朋子Tomoke Koneike
野老朝雄 Taele
山口晃A Yamaguch
ヴィヴィアンサッセン viane Sasen フィリップ·ワイズベッカー hipe Westecier
佐藤卓Taku Satoh
新木友行Tomoyul Shinkl
继川実花Mka Ninagawa
ホンマタカシTakashi Homma
森千裕Cilire Mor
テセウスチャン Theseus Chan
クリスオフィリ chris Of
東京都現代美術館Museum of Contemporary Art Tokyo
TOKYO 2020
TOK YO 2020
Sun ER 0-18-00 Opening Hours 10:00-18-00 N Aison Free


------------------------------------------------

1番目の検出文字（列）
検出された文字（列）　： "東京"
画像内の文字列の座標値　：  (62,484),(153,484),(153,526),(62,526)

2番目の検出文字（列）
検出された文字（列）　： "2020"
画像内の文字列の座標値　：  (172,486),(282,486),(282,524),(172,524)

3番目の検出文字（列）
検出された文字（列）　： "公式"
画像内の文字列の座標値　：  (306,481),(384,481),(384,534),(306,534)

4番目の検出文字（列）
検出された文字（列）　： "アート"
画像内の文字列の座標値　：  (386,481),(528,481),(528,534),(386,534)

5番目の検出文字（列）
検出された文字（列）　： "ポスター"
画像内の文字列の座標値　：  (530,481),(708,481),(708,534),(530,534)

6番目の検出文字（列）
検出された文字（列）　： "展"
画像内の文字列の座標値　：  (710,481),(762,481),(762,534),(710,534)

7番目の検出文字（列）
検出された文字（列）　： "Tokyo"
画像内の文字列の座標値　：  (61,547),(136,547),(136,574),(61,574)

8番目の検出文字（列）
検出された文字（列）　： "2020"
画像内の文字列の座標値　：  (149,546),(216,546),(216,569),(149,569)

9番目の検出文字（列）
検出された文字（列）　： "Official"
画像内の文字列の座標値　：  (231,546),(326,546),(326,569),(231,569)

10番目の検出文字（列）
検出された文字（列）　： "Art"
画像内の文字列の座標値　：  (337,547),(377,547),(377,569),(337,569)

（ ・・・省略・・・ ）


120番目の検出文字（列）
検出された文字（列）　： "Opening"
画像内の文字列の座標値　：  (410,831),(441,831),(441,848),(410,848)

121番目の検出文字（列）
検出された文字（列）　： "Hours"
画像内の文字列の座標値　：  (443,831),(471,831),(471,848),(443,848)

122番目の検出文字（列）
検出された文字（列）　： "10:00-18-00"
画像内の文字列の座標値　：  (473,831),(528,831),(528,848),(473,848)

123番目の検出文字（列）
検出された文字（列）　： "N"
画像内の文字列の座標値　：  (530,831),(558,831),(558,848),(530,848)

124番目の検出文字（列）
検出された文字（列）　： "Aison"
画像内の文字列の座標値　：  (561,831),(626,831),(626,844),(561,844)

125番目の検出文字（列）
検出された文字（列）　： "Free"
画像内の文字列の座標値　：  (628,831),(653,831),(653,844),(628,844)
electron@diynoMacBook-Pro gcp %
```

__スクリプト・ファイルからのAPI呼び出しも、成功__しました。

###ディレクトリの場所を変えても実行成功

```bash:Terminal  
electron@diynoMacBook-Pro gcp % cd ..
electron@diynoMacBook-Pro gcp %  mkdir tmp                                 
electron@diynoMacBook-Pro gcp %  cd tmp
tmp % python3 ../gcp/text_detection_args.py ../gcp/sample2.png > result.txt
electron@diynoMacBook-Pro tmp % wc -l result.txt 
     534 result.txt
electron@diynoMacBook-Pro tmp % head result.txt 

解析対象のファイル　： ../gcp/sample2.png

126件の文字（列）が見つかりました。 


検出された文字列の全体　：
東京2020 公式アートポスター展
Tokyo 2020 Official Art Posters Exhibition
荒木飛呂彦Hirehiko Araki
electron@diynoMacBook-Pro tmp % 
electron@diynoMacBook-Pro tmp % tail result.txt 
検出された文字（列）　： "N"
画像内の文字列の座標値　：  (530,831),(558,831),(558,848),(530,848)

124番目の検出文字（列）
検出された文字（列）　： "Aison"
画像内の文字列の座標値　：  (561,831),(626,831),(626,844),(561,844)

125番目の検出文字（列）
検出された文字（列）　： "Free"
画像内の文字列の座標値　：  (628,831),(653,831),(653,844),(628,844)
electron@diynoMacBook-Pro tmp % 
```