はじめに
先日の記事ではGemini API
を利用したテキスト生成について紹介しました。
それに引き続き、今回は画像を読み込ませて、何らかの簡単な処理を行う方法をまとめてみました。
なお、Gemini API
を利用するにあたり始めに行うキーの取得などは前回の記事にまとめたので、もしよかったらどうぞ。
では、始めていきます。
概要
実行の前に、まずはGemini API
を利用して画像処理を行う際の概要についてまとめます。
Gemini 1.5 Pro
と1.5 Flash
(今回用いるのはこちら)は、最大3,600個の画像ファイルをサポートしており、各画像は258個のトークンに相当します。
画像データは、下記のいずれかでなければなりません。
- PNG - image/png
- JPEG - image/jpeg
- WEBP - image/webp
- HEIC - image/heic
- HEIF - image/heif
画像の大きさ(ピクセル数)について特に制限はなく、大きすぎたり、小さすぎたりした場合はそのアスペクト比を維持したまま拡大、縮小されます。
渡す画像の合計サイズが20Mb未満になる場合は、base64
でエンコードされた画像をアップロード、またはローカルにある画像フォルダを直接アップロードすることが推奨されています。(いずれも後述)
一方、それよりも大きな画像をアップロードする際はFile API
のmedia.upload
メソッドを使用します。(勉強不足によりこちらは今回省略させてもらいます、ごめんなさい)
加えて、最良の結果を得るために以下のことが公式から推奨されています。
- アップロードする前に画像を適切な向きにしておくこと(上下逆さまなどにしない)
- ぼやけた画像を使用しないこと
- 1つの画像を使用する場合は、テキスト プロンプトを画像の後に配置すること
実行してみる
では、実際に動かしてみます。
base64でエンコードされた画像をアップロードする
ウィキペディアで紹介されていた、ニューヨークの景色の画像をアップロードします。
以下のように記述してみます。
import httpx
import os
import base64
import google.generativeai as genai
genai.configure(api_key="(ここに自身のAPIキーを入力)")
model = genai.GenerativeModel("gemini-1.5-flash")
image_path = "https://upload.wikimedia.org/wikipedia/commons/8/8e/Downtown_Skyline_%2839960025320%29.jpg"
image = httpx.get(image_path)
prompt = "この画像はどこで撮影されたものだと考えられる?"
response = model.generate_content([{'mime_type':'image/jpeg', 'data': base64.b64encode(image.content).decode('utf-8')}, prompt])
print(response.text)
すると、以下のように返答がくると思います。
これはニューヨーク市のマンハッタンの夜景です。写真の中央に ある象徴的なビルは ワールドトレードセンターです。周りの 高層ビルと街の照明から、この画像はニューヨーク市で撮影され たものだと推測できます。
ローカルにある画像をアップロードする
ためしに、先日の投稿で使用した以下の画像をアップロードして、簡潔に説明させてみます。
以下のように記述してみます。
import PIL.Image
import os
import google.generativeai as genai
genai.configure(api_key="(ここに自身のAPIキーを入力)")
image_path = "(ここにアップロードする画像ファイルのパスを記述)"
image = PIL.Image.open(image_path)
model = genai.GenerativeModel("gemini-1.5-flash")
prompt = "この画像について2,3文で簡単に説明して。"
response = model.generate_content([prompt, image])
print(response.text)
アップロードする画像ファイルのパスについては、C:/Users/(ユーザー名)/Pictures/Screenshots/スクリーンショット 2024-11-13 155312.png
(私の場合)のように、Cドライブからファイルまでのパスを書く必要があります。
ちなみに、今回は以下のように返答がきました。
これはGitHub Copilotのチャットインターフェースのスクリーンショットです。ユーザーはCopilotに雑談をしたいと尋 ねていますが、Copilotは雑談には対応 しておらず、GitHub関連の質問であれば対応できると答えています。
おわりに
今回の記事では、Gemini API
に画像を読み込ませ、その画像の説明を主にしてもらいました。ただ、File API
についての理解が全然できておらず、省略という形になってしまったので、今後勉強していくようにします。
では、今回の記事はこれで終わりです。最後までお読みいただきありがとうございました。
参考