Open Interpreterの使い方、Docker環境で実際に試しました

話題のOpen Interpreterがどのように動くのか試してみました。ちょうどstable-diffusionで生成した画像上下に余白をつけてサイズ調整したいと考えていたので、Open Interpreterにはそれを実現するためのPythonコードをお願いしてみたいと思います。

本記事ではOpen Interpreterがどのような流れで動作するのか、また何がうまくできなかったのかを合わせてご紹介いたします。

この記事は以下のような方に向けて書いています。

  • Open InterpreterでPythonコードを生成し、画像の余白追加を自動化する方法について解説
  • Open Interpreterの回答精度とAPI利用にかかった費用について
目次

実行環境

  • windows 11
  • Docker version 25.0.3, build 4debf41
  • Python(Docker):Python 3.10.12
  • open-interpreter:Version: 0.2.2

環境構築については以下の記事をご参照ください。

あわせて読みたい
Open InterpreterをDocker環境に導入する手順について解説します Open InterpreterをDocker環境に導入したので、その導入方法についてまとめました。本当はローカル環境に構築したかったのですが、Open Interpreterの特性上様々なパッ...

Pythonコードから実行(うまくいかず)

当初、Pythonコードからinterpreterを呼び出して実行することを試みましたが、途中でエラーが発生してしまいうまくいきませんでした。試したときの手順は以下の通りです。

まずDockerコンテナを起動、接続します。

次に以下の簡単なコードを作成します。

from interpreter import interpreter

prompt = "フォルダ内にある全ての画像は1024*1024サイズです。この画像ファイルを1024*1448の大きさのファイルの中央に配置して出力しなおすプログラムをPythonで作成して。解説は日本語でお願いします。"
interpreter.chat(prompt)

すると実行している最中に以下のようにエラーが出て中断してしまいました。

5回ほど試しましたが、一度も最後まで実行できませんでした。ChatGPTに尋ねたところ、Dockerコンテナのリソース不足やネットワークの問題が原因の可能性があるとのことでしたが、解決には至らなかったため、コードからの実行は諦めることにしました。

interpreterコマンドから実行(成功)

Pythonコードからの実行ができなかったのでinterpreterコマンドを実行する方法に方針変更しました。以下のようにinterpreterコマンドを実行することで対話が開始します。

まずは依頼したい内容を書き出してみます。日本語で大丈夫なようなので日本語で記入し、回答も日本語で返してもらえるよう明記しました。

冒頭に指示を与えてからここまで、一切操作せずに自動で進みました。必要なライブラリもインポートしてプログラムコードも作成されています。私の希望ではフォルダ内のすべての画像に対して画像処理をして欲しいため、その旨をOpen Interpreterに伝えます。また、画像のファイル名が’sample_image.jpg’のときに動くコードになっているので、画像のファイル名に関わらず動作するように変更を求めてみます。

すみませんが、具体的な指示が必要です。たくさんの画像があってそれぞれに新しく名前をつけることを指しているのでしょうか。それとも全ての画像を一つの背景画像に貼り付けたいということでしょうか。それとも別の指示でしょうか。それぞれの場合には異なる取り組み方が必要となるからです。具体的に何をしたいのかお教えいただけますでしょうか。

AIから指示が不明確だと指摘されました。Open Interpreter(ChatGPT)は、このような場合、自分の判断で進めるのではなく、ユーザーとの認識のすり合わせを行う点が優れていますね。もう一度、明確な指示を与えることにします。

了解しました。先ほどの単一画像の処理をすべての画像に適用するようコードを修正します。そのためには、写真のリストをループしてそれぞれの画像に対して以下の処理を実行します:

1 各画像を開く
2 新しい背景画像を作成(1024×1448ピクセル、白色)
3 元の画像を新しい背景画像の中心に配置
4 新しい画像を保存(新しいファイル名は元のファイル名に’_new’を追加)

それでは、これらの手順を実行するPythonコードを実行します。これにより、フォルダ内の全ての画像が新しいサイズの白い背景の中央に配置された新しい画像として保存されます。

完成したようです。ただ、肝心のコードが出力されていません。表示するようにお願いします。

  # New image size
  new_size = (1024, 1448)

  # Process all images
  for image_file in images:
      # Open the image file
      img = Image.open(image_file)

      # Get the size of the image
      img_width, img_height = img.size

      # Calculate the position to center the image
      position = ((new_size[0]-img_width)//2, (new_size[1]-img_height)//2)

      # Create a new white image
      new_img = Image.new('RGB', new_size, (255, 255, 255))

      # Paste the image
      new_img.paste(img, position)

      # Save the new image with a new filename
      new_img.save(os.path.splitext(image_file)[0] + '_new.jpg')

  'Processed all images.'

これにより、/home/scriptsフォルダ内の全ての画像(PNG、JPG、JPEG)が新しい背景画像(サイズ:1024×1448ピクセル)の中央に配置され、元のファイル名に’_new’を追加した新しいファイル名で保存されました。

例えば、元の画像が ‘sample_image.jpg’ だった場合、新しい画像は ‘sample_image_new.jpg’ という名前で保存されます。

この作業はすべての画像について実行され、各画像は元の形状を保ったまま新しい背景上に中央揃えで配置されています。したがって、原画像が1024×1024ピクセル未満の場合でも、新しい画像は1024×1448ピクセルのサイズを保ちます。

もし何か他にご質問や要求がありましたら、いつでもお知らせください。

以上でプログラムコードの作成は終了しました。ほとんど何も操作せずに完了しています。今回はコード作成をして欲しかったので上記のようなオーダーで試しましたが、実行の過程ですでに画像のアウトプットまで実施してありました。

imageサイズが1024*1448になっていて、さらに画像が中央に配置されています。まさにオーダー通りの形になっていますね。素晴らしいです。

完成コードを実行してみる

完成したコードが実際に動作するのか、実際に画像を用意して試してみます。

# New image size
new_size = (1024, 1448)

# Process all images
for image_file in images:
# Open the image file
    img = Image.open(image_file)

    # Get the size of the image
    img_width, img_height = img.size

    # Calculate the position to center the image
    position = ((new_size[0]-img_width)//2, (new_size[1]-img_height)//2)

    # Create a new white image
    new_img = Image.new('RGB', new_size, (255, 255, 255))

    # Paste the image
    new_img.paste(img, position)

    # Save the new image with a new filename
    new_img.save(os.path.splitext(image_file)[0] + '_new.jpg')

実行しようとコードエディター(VS CODE)に張り付けたところまず冒頭にimport文がなく、さらにfor文の imagesのリストが定義されていませんでした。その旨をもう一度OpenInter preterに指摘します。

すみません、imageのリストが不足していました。以下の修正された完全なコードをご確認ください。

   import os
   import glob
   from PIL import Image

   # Define the directory and formats
   path = '/home/scripts'
   formats = ['*.png', '*.jpg', '*.jpeg']

   # Function to collect all image files
   def collect_images(directory, formats):
       images = []
       for format in formats:
           images.extend(glob.glob(os.path.join(directory, format)))
       return images

   # Collect all images
   images = collect_images(path, formats)

   # New image size
   new_size = (1024, 1448)

   # Process all images
   for image_file in images:
       # Open the image file
       img = Image.open(image_file)

       # Get the size of the image
       img_width, img_height = img.size

       # Calculate the position to center the image
       position = ((new_size[0]-img_width)//2, (new_size[1]-img_height)//2)

       # Create a new white image
       new_img = Image.new('RGB', new_size, (255, 255, 255))

       # Paste the image
       new_img.paste(img, position)

       # Save the new image with a new filename
       new_img.save(os.path.splitext(image_file)[0] + '_new.jpg')

   print("All images have been processed!")

このコードは、 ‘/home/scripts’ ディレクトリ内の全ての .png, .jpg, .jpeg 画像を収集し、新しい1024×1448ピクセルの背景画像の中央に各画像を配置します。新しい画像は元の画像名に ‘_new’ を追加した名前で保存されます。

コードを直してもう一度実行したところ、画像のフォルダ内にある全ての画像に処理を行うことができました。

左画像が処理前、右画像が処理後になっていて、しっかりオーダー通りのプログラムができました。

API利用でかかった費用

今回、Open InterpreterはGhatGPT-4を利用しているため、APIの費用が掛かります。APIの利用状況はChatGPT公式ページにログインしてUsageを参照すると確認することができます。実際に見てみましょう。

3月19日に$1.37と記載があります。これが今回かかった費用です。上述したように何回かやり直したり、指示を出し直したりしているのでそれを含めた金額になります。調子に乗ってやりすぎてしまうと一気に金額が跳ね上がりそうですね。。気を付けます。

まとめ

本記事では、Open InterpreterでPythonコードを自動生成し、画像の余白追加処理を自動化する方法についてご紹介しました。Open Interpreterは指示に従ってコードを生成してくれるだけでなく、必要に応じてユーザーに質問し、認識のすり合わせを行うことで正確なコードを出力してくれました。

Open InterpreterのようなAIアシスタントを活用することで、プログラミングの生産性を大幅に高めることができそうです。今後もAI技術の発展に伴い、さらに強力なコーディング支援ツールが登場することが期待されます。

本検証内で発生した「PythonコードからOpen Interpreterを呼び出したときに途中で止まってしまう事象」は、原因がわかったらまた更新したいと思います。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次