Gemini API + Vision APIを試してみた（名刺データの整形）

# Gemini API + Vision APIを試してみた（名刺データの整形）
こんにちは、京セラコミュニケーションシステム　立脇（@kccs_hiroshi-tatsuwaki）です。

Qiitaを眺めていたら、タイムラインでこんな記事を発見！

https://qiita.com/watanabe-tsubasa/items/12dc7ba9a6de55e8afd9 

タイトルが斬新だったので「何だこの記事は！」と思って閲覧させていただきました。
内容を読むと、なるほど。Cloud Vision API　＋　GPT4 APIですか。おもしろいアプローチですね！（AI OCRを挟むのがミソなわけですね。）

そして、この記事を読んだときに、ふと「そういえばGeminiって今どうなってるんだっけ？」とも思いました。

ということで、記事を参考にさせてもらいながら名刺をOCRしつつ、Geminiも試してみたいと思います。

今回試す構成図は以下の通りです。

![architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140479/3211bfd5-61f6-e29e-4ece-103e134fb7e8.png)

## この記事を読んでわかること

2024年4月時点のCloud Vision APIとGemini API (Vertex AI Studio) の挙動がわかります。

## この記事の対象者

- Google Cloud PlatformでのAI OCRに興味のある方
- Gemini APIを試してみたいと思ってる方

## 事前準備

### 前提

- Google Cloudは利用できる状態であることとします。
- Gemini APIをそのまま使おうとすると準備が大変です。この記事ではいち早く性能を確認したいのでVertex AI Studio：マルチモーダルを使って検証します。

### ① 名刺を撮影

自分のスマートフォンで名刺を撮影しCloud Shellにアップロードしておきます。

### ② Cloud Shellに「jq」をインストール

Json文字列を扱うので、jqコマンドをインストール。

```console
$ sudo apt-get install jq
```

### ③ Vertex AI Studioを開く

[Vertex AI Studio：マルチモーダル](https://console.cloud.google.com/vertex-ai/generative/multimodal/gallery) にアクセスする。

※「Vertex AI Studioを使ってみる」という同意画面が出てきた場合は内容をよく確認して「同意」してください。

## 実際にやってみた

### まずは Cloud Vision API でAI OCR

まずは画像のAI OCRを実施。Vision APIに画像をPOSTします。

```console
$ gcloud ml vision detect-text meishi.png > result.json
```

`result.json`の中身を確認すると、それっぽいテキストが出ています。Json文字列を解析して見栄えを整えます。

```console
$ cat result.json | jq -r '.responses[0].fullTextAnnotation.text'
xxxxxxxxxxx事業部
xxxxxxxxxxx開発課 課長
Google Cloud Professional Data Engineer
立脇
たつ
わき
浩
ひろし
京セラコミュニケーションシステム株式会社
THE NEW VALUE FRONTIER
KYOCERA
東京オフィス
東京都港区三田3-5-19 (住友不動産東京三田ガーデンタワー) 〒108-8605
Data Engineer
Tel: xxx-xxxx-xxxx (直通)
E-mail: xxxxxx@xxxxx.xx.xx
https://www.kccs.co.jp/
GOOGLE CLOUD
KYOCERA
Google C
Cloud Certified
```

※xxxxxxxxxxxの部分は実際はキレイに読み取れていますが、便宜上マスクしております。ご了承ください。

すごい！OCRできましたね！

### 次は Vertex AI Studio でGemini APIを試す

AI OCRできたのでこの文字列をJson文字列に整形したいと思います。

Vertex AI Studioのプロンプトに以下のテキストを入力します。
`[文字列]`の部分は↑のOCR文字をそのままコピー＆ペーストで入力します。

```
以下の[文字列]は、名刺画像をOCR処理した文字列です。
この[文字列]を解析し、[Jsonテンプレート]で指定されたテンプレートを使いつつ[ルール]に従ってJson文字列を返してください。
[ルール]----------------------
・役職とは「課長」「部長」などの文字をいう。
・名前とかなの姓・名の間は空白であけること。
・組織名は複数行にまたがっている可能性がある。
・アウトプットのJson文字列は①人間が見やすいように成形すること②Json文字として有効であること
・電話番号は数字と-のみ読み取ること。
・Jsonテンプレートで指定されている項目のうち、読み取れなかった項目はnullで表現すること
[文字列]----------------------
xxxxxxxxxxx事業部
xxxxxxxxxxx開発課 課長
Google Cloud Professional Data Engineer
立脇
たつ
わき
浩
ひろし
京セラコミュニケーションシステム株式会社
THE NEW VALUE FRONTIER
KYOCERA
東京オフィス
東京都港区三田3-5-19 (住友不動産東京三田ガーデンタワー) 〒108-8605
Data Engineer
Tel: xxx-xxxx-xxxx (直通)
E-mail: xxxxxx@xxxxx.xx.xx
https://www.kccs.co.jp/
GOOGLE CLOUD
KYOCERA
Google C
Cloud Certified
[Jsonテンプレート]----------------------
{
 "name": "%ここに氏名を入れてください%",
 "kana": "%ここにふりがなを入れてください%",
 "title": "%ここに役職を入れてください%",
 "organization": "%ここに組織名を入れてください%",
 "license": "%ここに資格名を入れてください%",
 "company": "%ここに会社名を入れてください%",
 "location": "%ここに事業所名を入れてください%",
 "adress": "%ここに住所を入れてください%",
 "postal": "%ここに郵便番号を入れてください%",
 "tel": "%ここに電話番号を入れてください%",
 "mail": "%ここにメールアドレスを入れてください%",
 "hobby": "%ここに趣味を入れてください%",
 "homepage": "%ここにホームページを入れてください%"
}
```

実行結果は以下の通りです。

```json
{
  "name": "立脇 浩",
  "kana": "たつわき ひろし",
  "title": "課長",
  "organization": "xxxxxxxxxxxxxx開発課",
  "license": "Google Cloud Professional Data Engineer",
  "company": "京セラコミュニケーションシステム株式会社",
  "location": "東京オフィス",
  "adress": "東京都港区三田3-5-19 (住友不動産東京三田ガーデンタワー)",
  "postal": "108-8605",
  "tel": "xxx-xxxx-xxxx",
  "mail": "xxxxxx@xxxxx.xx.xx",
  "hobby": null,
  "homepage": "https://www.kccs.co.jp/"
}
```

事業部をうまく読み取ってはくれませんでした。私のプロンプトの問題かな・・。
それでも整形力はさすがですね！すごいな、と感じました！

## ちょっと待てよ・・・

あれ、でもよくよくVertex AI Studioの画面を見ていると気になるボタンが・・。


![screenshot01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140479/f4398863-5a71-a10e-562c-8e90b927df3a.png)



*「メディアを挿入」*

こ、これは！もしや、名刺の画像をそのまま指定すれば良いのでは・・！？

ということで、実際にやってみました。

![screenshot02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140479/067a900e-ed78-8815-a225-14630818c37d.png)

```
以下の画像はとある日本人の名刺です。この名刺の画像データを読み取って、Json文字列で出力してください。
（ここに「メディアを挿入」から名刺画像を挿入）
読み取れない場合はエラーとして下さい。
[ルール]----------------------
・役職とは「課長」「部長」などの文字をいう。
・名前とかなの姓・名の間は空白であけること。
・組織名は複数行にまたがっている可能性がある。
・アウトプットのJson文字列は①人間が見やすいように成形すること②Json文字として有効であること
・電話番号は数字と-のみ読み取ること。
・Jsonテンプレートで指定されている項目のうち、読み取れなかった項目はnullで表現すること
[Jsonテンプレート]----------------------
{
 "name": "%ここに氏名を入れてください%",
 "kana": "%ここにふりがなを入れてください%",
 "title": "%ここに役職を入れてください%",
 "organization": "%ここに組織名を入れてください%",
 "license": "%ここに資格名を入れてください%",
 "company": "%ここに会社名を入れてください%",
 "location": "%ここに事業所名を入れてください%",
 "adress": "%ここに住所を入れてください%",
 "postal": "%ここに郵便番号を入れてください%",
 "tel": "%ここに電話番号を入れてください%",
 "mail": "%ここにメールアドレスを入れてください%",
 "hobby": "%ここに趣味を入れてください%",
 "homepage": "%ここにホームページを入れてください%"
}
```

結果はこちら。

```json
{
 "name": "立脇 浩",
 "kana": "たつわき ひろし",
 "title": "課長",
 "organization": "xxxxxxxxx事業部\nxxxxxxxxxxx開発課",
 "license": "Google Cloud認定 Professional Data Engineer",
 "company": "京セラ コミュニケーションシステム株式会社",
 "location": "東京オフィス",
 "adress": "東京都港区三田3-5-19 (住友不動産東京三田ガーデンタワー)",
 "postal": "108-8605",
 "tel": "xxx-xxxx-xxxx",
 "mail": "xxxxxxxxxxx@xxx.xx.xx",
 "homepage": "https://www.kccs.co.jp/"
}
```

おお、すごい精度！ばっちりですね！！

## まとめ

今回、元々の参考にさせていただいた記事のアイデアを参考にさせてもらいながら、Gemini APIを使って名刺に記載の内容の文字列整形を試してみました。

元々の記事ではAI OCRを挟むことで精度がアップするようなアプローチでしたが、GeminiにかかればOCR＋整形まで一括でできてばっちりですね！
そして、Googleの底力を感じました。世の中、生成AI全盛ですね！