本連載は実際に業務で役立つプログラムやツールを使って業務の改善に取り組む様子を紹介する物語です。物語はフィクションですが、作中で紹介するプログラムは実際に使えるものです。係長となった主人公の田中君が後輩の葵お嬢さんと一緒に業務課題に取り組みます。

謎 - 消えた物件写真

係長の田中新君は、中小企業の不動産会社で新任の係長として頑張っていた。ある朝、彼が銀行周りを終えて会社に到着すると、ざわざわと社内が慌ただしい様子だった。

僕は怪訝に思いながらも「おはようございます」と、いつも通り元気よく挨拶をして、オフィスのドアをくぐった。

「おはよう、田中君」と、営業チームの南さんが挨拶を返すが、顔色が悪い。他のみんなも焦っているようだった。みんな、行ったり来たりして、何かを話し合っていた。

営業部の南さんは、僕より少し年上の、気の優しい大男だった。彼の顔には珍しく焦りが見られる。

「南さん、何が起こってるんですか?」

「田中、大変なことになっちゃったんだ。物件内覧会のイベント用に整理してあった写真が、全部消えちゃったんだよ。」

「えー?!どうしてそんな事が…イベントってもう明後日じゃないですか!」

「バックアップ取ってなかったんですか?」

「残念ながら、バックアップしていないんだ。今回のイベント、みんな忙しくて。」

そのとき、敢えて僕を避けて通り過ぎようとする怪しい人影があった。そう、トラブルメーカーの葵さんだ。悪役令嬢を気取っているが、実は真面目な彼女。

僕が呼び止めて声を掛けると、「私、何もしていないから」と、怪しい様子で答えた。明らかに何か知っている感じだ。

「なるほど、君が犯人だね…」僕は彼女の教育係として責任を感じるのだった。察すると、悪意はなくうっかり共有フォルダのファイルを削除してしまったとか、そんなところだろう。

トラブルは起こした人が解決するべき

「田中君、今回のトラブル、どうにかしてくれないか?」

そのとき、沢谷支店長も問題に気付いてやってきた。

「そうですね」僕はしばし考える。

「写真を撮影した人たちからもう一度、写真を集めて整理しなおそう。」南さんが提案する。

それを受けて僕は考えをまとめた。

「写真にはGPS情報が埋め込まれてるんですよね。それを使って、自動で写真を整理するプログラムを作れば、時間を節約できるかもしれません。」

沢谷支店長が期待の目で僕を見た。「それはいいアイディアだ!」

僕は、葵さんに言う。

「トラブルは起こした人が解決するべきだよね!葵さん、今日の午後までにプログラムを作ってね。」

葵さんは怪訝な顔をした。「私にプログラムなんて作れるわけないでしょう。」

「今話題の会話型AIのChatGPTを使えば簡単だよ。やってみようね。」

イベントに間に合ったか?!

葵はしぶしぶ僕の提案に従い、プログラムを作成することになった。

今年大ブームを起こした、ChatGPTや、Google Bardなどの会話型AIは、ただ質問に答えてくれるだけではない。プログラムの生成や物語の生成が得意なのだ。

数時間後、悪戦苦闘の末、葵さんの作ったプログラムは無事に完成した。それを使って、写真をGPS情報に基づき、自動でフォルダに整理することができた。無事に何百枚もの写真が自動整理されたのだった。

イベント当日、朝の光が会場を穏やかに照らしていた。僕と葵さんも会場の受付での案内として駆り出された。

会場内の各テーブルには、モニターが配置され、自動整理された写真がきれいに映し出されていた。家の様子が次々と分かりやすく表示されていた。

そして、イベントが始まると、たくさんのお客さんがイベントに来場してくれた。お客さんは、物件写真を熱心に見て、営業担当と商談をしていた。

イベントが終わった後、僕は葵に声をかけた。「お疲れ様でした。良く頑張ったね。」

葵は顔を赤くして「こんなことくらい当然よ」と答えた。それは、とても眩しい笑顔だった。まるで初夏の太陽のようにキラキラと輝いていた。

実際のプログラム

それでは、葵さんと一緒にChatGPTの力を借りて作成したプログラムを確認してみましょう。

今回は、仕事の自動化に役立つと田中君が勧めたプログラミング言語の「Python」を使うことにしました。Pythonについては、本連載の姉妹連載がこちらにあります。

まずは、こちらのPythonのWebサイトを開いて、[Downloads > Python 3.x.x]をクリックしてPythonのインストーラーをダウンロードしましょう。

ダウンロードしたらインストーラーの指示に従って、Pythonをインストールします。ただし、下記の画像の通り、画面下部にある[Add python.exe to PATH]にチェックを入れてから、[Install Now]をクリックしてください。これによって、PythonがPowerShellから利用できるようになります。

  • Pythonのインストールについて

    Pythonのインストールについて

Pythonがインストールできたら、プログラムを作成してみましょう。

まず、葵さんは、次のような指示をChatGPT(無料でも使えるモデルGPT-3.5)に与えました。

大量の写真画像があります。
GPS情報元にしてフォルダに分類するPythonのプログラムを作成してください。

ところが、どうもうまくいきません。何かしらのエラーが出るか、何も動作しません。
この時点で、葵さんは、上司の田中君に文句を言いに行ったことでしょう。

しかし、まずは、緯度経度だけの情報を取り出して表示するプログラムを作り、それがうまくいったら、次にフォルダに分類するプログラムに改良するという二段ステップにすることを提案されます。

そこで、まずは、画像ファイルから緯度経度の情報を取り出して表示するだけのプログラムを依頼しました。以下のようなプロンプトです。

大量の写真画像があります。
これらの写真に埋め込まれたGPS情報から緯度経度を表示するPythonのプログラムを作ってください。

すると、うまく行きました。これは、以下のようなプログラムになるでしょう。

# 必要なライブラリをインポート
from PIL import Image
from PIL.ExifTags import TAGS, GPSTAGS

# 指定したファイル名の画像からGPS情報を抽出する関数
def extract_gps_info(filename):
    try:
        # 画像を開く
        image = Image.open(filename)
        # Exifデータを取得
        exif_data = image._getexif()
        if exif_data:
            # Exifデータの各タグとその値についてループ処理
            for tag, value in exif_data.items():
                tag_name = TAGS.get(tag, tag)
                # タグがGPS情報であれば、詳細なGPSタグを抽出
                if tag_name == "GPSInfo":
                    gps_info = {}
                    for gps_tag, gps_value in value.items():
                        gps_tag_name = GPSTAGS.get(gps_tag, gps_tag)
                        gps_info[gps_tag_name] = gps_value
                    return gps_info
    except Exception as e:
        print(f"Error extracting GPS info from {filename}: {e}")
    return None

# GPS情報から緯度と経度を計算して返す関数
def get_lat_lon(gps_info):
    if gps_info:
        # 緯度と経度の情報を取得
        lat = gps_info.get("GPSLatitude")
        lon = gps_info.get("GPSLongitude")
        # 参照方向(北/南、東/西)を取得
        lat_ref = gps_info.get("GPSLatitudeRef", "N")
        lon_ref = gps_info.get("GPSLongitudeRef", "E")
        if lat and lon:
            # 緯度と経度を十進数の形式に変換
            lat = float(lat[0]) + float(lat[1])/60 + float(lat[2])/3600
            lon = float(lon[0]) + float(lon[1])/60 + float(lon[2])/3600
            # 南緯や西経の場合は符号を反転
            if lat_ref == "S":
                lat = -lat
            if lon_ref == "W":
                lon = -lon
            return lat, lon
    return None

if __name__ == "__main__":
    directory = "./input"
    import os
    # 指定したディレクトリ内の全ファイルに対してループ処理
    for filename in os.listdir(directory):
        # ファイルがJPEG画像である場合
        if filename.endswith(".jpg") or filename.endswith(".jpeg"):
            file_path = os.path.join(directory, filename)
            # GPS情報を抽出
            gps_info = extract_gps_info(file_path)
            if gps_info:
                # 緯度と経度を取得
                lat_lon = get_lat_lon(gps_info)
                if lat_lon:
                    print(f"{filename:30s}: Latitude = {lat_lon[0]:3.5f}, Longitude = {lat_lon[1]:3.5f}")
                else:
                    print(f"{filename:30s}: GPS information found, but latitude and longitude not available.")
            else:
                print(f"{filename}: No GPS information found.")

上記のプログラムを「show_gps.py」という名前で保存しましょう。そして、プログラムを配置したフォルダに「input」というフォルダを作り、そこに写真を何枚か入れて試してみましょう。

プログラムを実行する前に、実行に必要となるライブラリPillowをインストールします。WindowsのPowerShellを起動して、以下のコマンドを実行して、必要となるモジュールをインストールします。

pip install pillow

次いで、PythonのIDLEを起動して、保存した上記のプログラム(show_gps.py)を読み込んで、画面上部の[Run > Run Module]をクリックします。すると、次のように写真に埋め込まれたGPSタグの値を読み取って、緯度経度の情報が表示されます。

  • GPS情報を表示したところ

    GPS情報を表示したところ

ところで、上記の画像の青色で表示される正しい実行結果の上部分には「No module named 'PIL'」と表示されています。これは、PowerShellで正しくPillowライブラリをインストールしていない時に表示されるエラーです。同じエラーが出る場合には、Pillowをインストールするようにしましょう。

正しく、上記のプログラムが動いたなら、この緯度経度情報を用いて写真をフォルダ分けするプログラムを作ってみましょう。

ChatGPTに次のように依頼します。

上記のプログラムを元にして、緯度経度の情報を元にして画像を分類するPythonのプログラムを作ってください。
- 緯度と経度は小数点以下3位で四捨五入したものにしてください。
- 分類先のフォルダ名は、`緯度_経度`としてください。

すると、次のようなプログラムが作成されます。下記のプログラムを「bunrui.py」という名前で保存しましょう。

# 必要なライブラリをインポート

この記事は
Members+会員の方のみ御覧いただけます

ログイン/無料会員登録

会員サービスの詳細はこちら