コード一覧

【チャットGPTとPython】で楽々画像処理!写真の背景削除を学ぼう

ChatGPTに登録

まずは、チャットGPTに登録が必要です。
まだ登録していない人は、早くした方がいいです。めちゃ楽になります。
https://chat.openai.com/

「チャットGPT ログイン」
などで検索したらいくらでも記事が出てくるので、登録方法は割愛します。
先日社内で勉強会をやりました。
ポイントだけまとめておきます。

Googleでログインしたらカンタン
・電話番号を聞かれるので、手持ちのスマホを登録すること(あとで認証コードがSMSで送信され、初回ログインで必要になります)ビビッて他の電話番号にしないように!

プロンプトについて

よく、チャットGPTにあなたは〇〇の専門家です
とか、#制約条件: #入力文: #出力形式:
みたいにしている動画や解説をよく見ますが、実際にやってみると、そこまで重要じゃないかなと思います。(プロンプトとは、チャトGPTに出す指示のことです)
チャットGPTに渡してもいいのか渡してはいけないのかはわかりませんが、APIのキーや自分が使っている環境だったり、動かしたいパスをそのまま投げると、その通りにコードを記載してくれるので、めちゃ快適です。
例えば、以下のように聞いています。

実際の活用例1 写真の背景削除

Pip

Pythonでrembgを使い、画像の背景を削除するコードをかいてください

ChatGPT

rembgとは、画像から背景を削除するためのツールで、AIとディープラーニングを利用しています。このツールはPythonパッケージとして利用可能で、コマンドラインツールやPython APIとして使用することができます。

以下のPythonコードは、rembgを使用して画像の背景を削除するものです。まず初めに、rembgをインストールする必要があります。これはコマンドラインからpip install rembgと入力してインストールできます。

from rembg import remove
import numpy as np
import io
from PIL import Image

input_path = 'input.png'
output_path = 'output.png'

def remove_background(input_path, output_path):
    with open(input_path, 'rb') as img_file:
        img = img_file.read()

    # `remove`関数は、バイト列の入力画像から背景を削除します
    img_no_bg_bytes = remove(img)

    # バイト列の画像をPIL.Imageオブジェクトに変換します
    img_no_bg = Image.open(io.BytesIO(img_no_bg_bytes))

    # 結果をPNG形式で保存します
    img_no_bg.save(output_path, "PNG")

remove_background(input_path, output_path)

ChatGPT

このコードは、入力画像の背景を削除し、出力画像をPNG形式で保存します。input_pathは入力画像のパス、output_pathは背景が削除された画像の保存先を表しています。

なお、rembgはGPUを必要とするため、このコードはGPUをサポートする環境で実行することが推奨されます。また、ライブラリの詳細やアップデートは公式ドキュメンテーションをご覧ください。

上記を実行してみるとエラーがでました。それをまたChatGPTへ確認します。この時のポイントというか、すごいところは、エラーメッセージを貼り付けるだけで、上記の続きから回答を得られるということです!

Pip

File "/Users/*****/Documents/python/python_app/pyapp/lib/python3.9/site-packages/PIL/Image.py", line 2410, in save fp = builtins.open(filename, "w+b") IsADirectoryError: [Errno 21] Is a directory: '/Users/******/Documents/python/python_app/cut_app/'

ChatGPT

このエラーメッセージは、Pythonがsave関数を使用してファイルを保存しようとしたときに、指定したパスがディレクトリであるために発生します。つまり、ファイルではなくディレクトリへの書き込みを試みたため、このエラーが発生しています。

save関数の引数output_pathには、出力画像の完全なファイル名(ディレクトリのパス+ファイル名)を指定する必要があります。おそらく現在、ディレクトリのパスのみを指定しているため、この問題が発生していると考えられます。

したがって、以下のようにoutput_pathを修正してみてください:

output_path = '/Users/*****/Documents/python/python_app/cut_app/output.png'
ChatGPT

上記のように、パスの最後に具体的なファイル名(ここではoutput.png)を追加します。このようにすることで、画像は指定したディレクトリ内のoutput.pngという名前のファイルとして保存されます。

上記のコードで実際に動かしてみると、見事成功!
ただ、ファイルを1枚1枚指示するのは面倒なので、一気にやりたいと思ったので、以下のように質問をしました。

Pip

Inputパスをフォルダの中にある写真すべて、という形にしたいです。アウトプットの画像名は、元のファイル名に透過というファイル名を拡張子の前につけたいです

アイコン名を入力

Pythonの os モジュールを使用することで、指定されたディレクトリ内のすべてのファイルを処理することができます。そして、新しいファイル名を作成するためには、os.path.splitext 関数を使用して元のファイル名から拡張子を分割し、新しい名前を作成します。以下に、要件に合わせて更新したコードを示します。

from rembg import remove
import numpy as np
import io
from PIL import Image
import os

input_dir = '/path/to/input/directory/'
output_dir = '/path/to/output/directory/'

def remove_background(input_dir, output_dir):
    # 入力ディレクトリ内のすべてのファイルを処理します
    for filename in os.listdir(input_dir):
        if filename.endswith('.png') or filename.endswith('.jpg'): # PNGとJPGファイルのみを処理します
            with open(os.path.join(input_dir, filename), 'rb') as img_file:
                img = img_file.read()

            img_no_bg_bytes = remove(img)
            img_no_bg = Image.open(io.BytesIO(img_no_bg_bytes))

            # 元のファイル名から拡張子を分割します
            base_filename, file_extension = os.path.splitext(filename)

            # 新しいファイル名を作成します
            new_filename = f"{base_filename}_透過{file_extension}"

            # 出力ディレクトリに新しいファイル名で保存します
            img_no_bg.save(os.path.join(output_dir, new_filename), "PNG")

remove_background(input_dir, output_dir)
ChatGPT

このコードは、指定された入力ディレクトリ内のすべての.pngと.jpgファイルの背景を削除し、指定された出力ディレクトリに新しい名前で保存します。新しいファイル名は、元のファイル名に"_透過"が追加されています。ただし、このコードはサブディレクトリ内のファイルは処理しません。入力ディレクトリ内のすべてのサブディレクトリも探索したい場合は、これに対応した追加のコードが必要になります。

また、出力ディレクトリは既に存在している必要があります。出力ディレクトリが存在しない場合、このコードはエラーを引き起こします。

上記を実行してみると、実際にフォルダ内に入っている写真の背景が切り抜かれて、人物だけが残りました。

まとめ

チャットGPTを使うことで、今までエラーを調べていた時間が思いっきり短縮されていきます。よりスピード感をもって開発を進められます。面倒なことや、やりたいことは、すべてチャットGPTに聞いていますが、今のところ、完璧にやってくれます。
一部の人だけのものではなく、これからは、だれでも 簡単に めんどうなことを自動化する時代になってくるんだろうなと思います。