たった1時間で!Gemini APIとGoogle AI Studioを使ったワインラベル識別モデルの構築(実践コード付き)

こんにちは。新里です。

Google Geminiが最近は色々と出してきていて、触ってみたくなってきました。そこで、Gemini Provision API (マルチモーダル)を使って画像の判別をしてみました。

ワインのラベル判定

勢いでWeb上からワインのラベルをアップロードすると、対象のワインの情報を取得してくる物を作ってみました。プログラムに要した時間は1時間もかからない程度でした。
これはGoogle AI Studioが便利だった…というのもありますね。

ローカルPCからワインのラベルがある画像をアップロードすると、対象のワイン情報を取得するものです。サクッと作ったついでに、GMOインターネットグループが2023年に行っていた「AIしあおうぜ」コンテストに出してみたら受賞にはなりませんでしたが、ピックアップ作品としてチョイスして頂きました。

Google AI Studioが便利

Google AI Studioは現在のところ英語版しかありませんが、いまの所は無料で使えるのでプロンプトやAPIを実験してみるにはお手軽な環境ですね。無料期間が2024年の初頭までみたいなので、いまのうちに使って遊んでみるのも良いです。

Google AI Studioの便利な所が、右上にある「Get code」から各種言語、Google Colabへのリンクもあって、プロンプトでテストしてみた内容をいきなりコード・Google Colab上で実際に動かすことが出来るのがめちゃくちゃ便利でした。

というのもあって、冒頭の1時間で実装できたというのも、この機能があってこそ…というのもあります。この辺のコードに展開する部分は他のサービスでは無いかなーと感じていたり、いかにもGoogleといった感じですね。

ここで生成されたコードを使うと簡単に自分のコードに入れ込めますね。僕の場合、フロントエンドはVue、バックエンドはPythonで作っていたので、組み込んだコードはこんな感じになりました。

class LabelImageView(APIView):
    def post(self, request):
        file = request.FILES['image']
        
        genai.configure(api_key="your key")
        # Set up the model
        generation_config = {
        "temperature": 0.4,
        "top_p": 1,
        "top_k": 32,
        "max_output_tokens": 4096,
        }

        safety_settings = [
        {
            "category": "HARM_CATEGORY_HARASSMENT",
            "threshold": "BLOCK_MEDIUM_AND_ABOVE"
        },
        {
            "category": "HARM_CATEGORY_HATE_SPEECH",
            "threshold": "BLOCK_MEDIUM_AND_ABOVE"
        },
        {
            "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
            "threshold": "BLOCK_MEDIUM_AND_ABOVE"
        },
        {
            "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
            "threshold": "BLOCK_MEDIUM_AND_ABOVE"
        }
        ]

        model = genai.GenerativeModel(model_name="gemini-pro-vision",
                                    generation_config=generation_config,
                                    safety_settings=safety_settings)

        image_parts = [
        {
            "mime_type": "image/png",
            "data": file.read()
        },
        ]

        prompt_parts = [
        "貴方はプロのソムリエです。この画像から銘柄・ビンテージ・畑名・生産者・ワインの説明を取得してきてください。結果はJSON形式で日本語のJSONにまとめてお願いします。\n\n",
        image_parts[0],
        ]

        response = model.generate_content(prompt_parts)
        json_text = response.text
        json_text = json_text.replace('```json', '')
        json_text = json_text.replace('```', '')
        data = json.loads(json_text)
        return JsonResponse(data, safe=False)

PoCなので出力されたコードをほぼ、そのまま使っても全然普通に動きました。画僧ファイルを受け取ってGemini APIに投げているだけですね。最後に謎のreplaceをしているのは、LLMの応答としてそのままjson textを使えなかったので、jsonとして使えるように整形しています。

実は過去にも…

以前にもワインのラベル判定は実験的に検証をしていました。


ワインでもいかが? -Vol.02
この時は特徴点を使ったlabeling、近隣探索などなど…検証を行ってきましたが、うまくヒットさせることが難しかったでした。また、他のマルチモーダルは日本語や多言語が入ってくると、識字率が一気に下がってしまう問題もあります。多言語の文字を認識させるというは、なかなかハードルが高いですね。

Google Vision APIはOCRでも良いパフォーマンスを出しているというのもあって、この手の画像の中の文字認識をマルチモーダルとして扱う場合でも、非常によいパフォーマンスを出してくれました。
ただし、必ずしもラベルを正しく認識しているか?というとそうでもありませんでした。実際の画像とマルチモーダルが出してくる内容の差異を埋めるのは人の役目というわけです。

他の画像では?

他にもGeminiを使ってレシートを読み込みできるか?というのも試してみました。インボイス登録番号をレシートから判別して、実在性をチェックしてデータとして自動保存できるのでは?と。

レシートを色々と何枚か実験的に使ってみましたが、他のマルチモーダルで日本語が入ってきたり、この画像のように濡れ染みがあっても認識できるパフォーマンスを発揮できるのは、現時点では他にはありませんでした。

まさかここまで認識できるとは、かなり驚きです。

マルチモーダルの利活用

単純なOCRだけでは難しい処理がマルチモーダルLLMだと可能だと分かりました。従来は画像の中にある文字を読み取るだけでしたが、コンテキスト・意味がある物として読み取ることが出来る点が大きく違いますね。
画像の要素・コンテキストをプログラムが処理しやすい形式に変換するコンバーターとして、マルチモーダルLLMを使うという方法もアリなのかもしれません。

ブログの著者欄

新里 祐教

GMOインターネットグループ株式会社

プログラマー。GMOインターネットグループにて開発案件・新規事業開発に携わる。またオープンソースの開発や色々なアイデアを形にして展示をするなどの活動を行っている。

採用情報

関連記事

KEYWORD

採用情報

SNS FOLLOW

GMOインターネットグループのSNSをフォローして最新情報をチェック