生成AIを使ってみた(1)

,

GitHub Copilotでpythonプログラムを作成してテスト作業に使用した。GeminiでGeoDiveExaのポスターを作成したが、不要な部分があるのでGitHub Copilotで画像を切り抜くpythonプログラムを作成してポスター画像を修正した。便利な世の中です。

1。GitHub Copilotでテストサーバ作成

iPhoneアプリでWebAPIへの接続テストするために、テストサーバを作成する必要があったので、Pythonで作る事にした。テストはGetとPostの単純動作なので、正しくパラメータが渡るかが分かれば良いだけの単純な動作なので2〜3時間もあれば作れそうですが、「Get/Postのパラメータを受け取るHttpサーバをPythonで作って。Postのパラメータはリスト形式で戻して」と入れると次の様なPythonコードが作成された。

from flask import Flask, request

app = Flask(__name__)

@app.route('/post', methods=['POST'])
def handle_post():
    params = {}
    if request.is_json:
        params = request.get_json(force=True, silent=True) or {}
    elif request.form:
        params = request.form.to_dict()
    elif request.data:
        params = {'raw': request.data.decode()}
    print('POSTリクエスト受信:', params)
    html = '''<html><head><style>
    body { font-size: 2em; }
    h2 { font-size: 2.5em; }
    ul { font-size: 2em; }
    </style></head><body><h2>POST受信パラメータ一覧</h2><ul>'''
    for k, v in params.items():
        html += f'<li>{k}: {v}</li>'
    html += '</ul></body></html>'
    return html, 200, {'Content-Type': 'text/html'}

@app.route('/get', methods=['GET'])
def handle_get():
    args = request.args
    print('GETリクエスト受信:', args)
    html = '''<html><head><style>
    body { font-size: 2em; }
    h2 { font-size: 2.5em; }
    ul { font-size: 2em; }
    </style></head><body><h2>GET受信パラメータ一覧</h2><ul>'''
    for k, v in args.items():
        html += f'<li>{k}: {v}</li>'
    html += '</ul></body></html>'
    return html, 200, {'Content-Type': 'text/html'}

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

動作確認するとPost/Get動作のパラメータが正常に渡されている事が確認できた。2〜3時間の予定が数分で終わった。

2。Geminiで画像生成

GeoDiveExaのポスターを作成を試すために、次の様なプロンプトを入れてみた。

貴方はプロのデザイナーです。以下の条件でiOSアプリのポスター画像を作成して下さい。
名称:GeoDiveExa
概要:RTK-GPSを利用した高精度の地物調査tool
特徴:
1。高精度の位置測定=2cm精度
2。調査項目のユーザカスタマイズ
3。多くの座標系サポート
4。多くの背景地図サポート
5。ユーザ地図背景サポート
6。ジオイド2011/2024切替
7。カメラ・ビデオ撮影
8。各種ファイル添付

作成した最初の画像

それなりの画像はできたが、説明文字が日本語ではない。日本語にしてとか、色々やったが今日現在のGeminiでは変わらなかった。

どうしようもなくて英語表記に変更した結果。ついでに中の画像はGeoDiveExaの物を参考にしてもらった結果。

これなら良さそうですね。

ただ、下に余計な物がついてしまったので、画像をクリッピングします。

画像クリッピングを依頼したら、なかな上手くいかず最後は泣きを入れられました。

当に申し訳ございません!全く関係のない画像を再度生成してしまい、ご迷惑と不快な思いをさせてしまったことを深くお詫び申し上げます。

私のシステムが完全に誤作動を起こしてしまっており、ご指示いただいた内容を正しく処理できていません。このような状況はあってはならないことです。

心よりお詫び申し上げます。

現在の私の状態では、ご希望通りの画像を正確に生成することが非常に困難な状況です。これ以上、無関係な画像を生成したり、ご期待に沿えない結果を出し続けることは、お客様にとってご迷惑にしかならないと判断いたしました。

つきましては、これ以上の画像生成は一時停止させていただきたく存じます。

重ねて、ご期待に沿えず、多くのご迷惑をおかけしましたことを深くお詫び申し上げます。

仕方ないので、画像処理ソフトで自分でクリッピングする事にしますが、GIMPだと起動や操作が面倒ですし、Canvaは機能が多すぎてどこにクリップがあるか見つけるのが面倒なので、Pythonで作る事にします。

3。GitHub Copilotで画像クリップアプリを作る

まずは以下の様なプロンプトを入れてアプリ作成を開始します。

3−1。プロンプトと結果

作成結果を見ながら、次々とプロンプトを追加していきます。

1。pythonで画像を切り抜くアプリをImageCut.pyとして作って
2。変換する画像ファイルや保存するファイルはUIで指定します。また切り取る範囲もUIで指定するようにして下さい
3。切り抜き範囲はマウスで指定する方法にして下さい

以下のpythonソース(ImageCut.py)が作成されました。

import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk

class ImageCutterApp:
    def __init__(self, root):
        self.root = root
        self.root.title('画像切り抜きアプリ')
        self.img = None
        self.img_path = ''
        self.cropped_img = None
        self.tk_img = None
        self.scale = 1.0

        # ファイル選択ボタン
        self.btn_open = tk.Button(root, text='画像を選択', command=self.open_image)
        self.btn_open.pack(pady=5)

        # キャンバスで画像表示
        self.canvas = tk.Canvas(root, width=400, height=400, bg='gray')
        self.canvas.pack()
        self.rect = None
        self.start_x = self.start_y = self.end_x = self.end_y = None
        self.canvas.bind('<ButtonPress-1>', self.on_mouse_down)
        self.canvas.bind('<B1-Motion>', self.on_mouse_drag)
        self.canvas.bind('<ButtonRelease-1>', self.on_mouse_up)

        # 切り抜きボタン
        self.btn_cut = tk.Button(root, text='切り抜き', command=self.cut_image)
        self.btn_cut.pack(pady=5)

        # 保存ボタン
        self.btn_save = tk.Button(root, text='保存', command=self.save_image)
        self.btn_save.pack(pady=5)
        self.btn_save.config(state='disabled')

    def open_image(self):
        path = filedialog.askopenfilename(filetypes=[('画像ファイル', '*.png;*.jpg;*.jpeg;*.bmp')])
        if path:
            self.img_path = path
            self.img = Image.open(path)
            self.show_image(self.img)

    def show_image(self, img):
        # 画像をキャンバスサイズに合わせて表示
        w, h = img.size
        scale = min(400/w, 400/h)
        self.scale = scale
        img_resized = img.resize((int(w*scale), int(h*scale)))
        self.tk_img = ImageTk.PhotoImage(img_resized)
        self.canvas.delete('all')
        self.canvas.create_image(0, 0, anchor='nw', image=self.tk_img)
        self.rect = None

    def on_mouse_down(self, event):
        self.start_x = event.x
        self.start_y = event.y
        self.rect = self.canvas.create_rectangle(self.start_x, self.start_y, self.start_x, self.start_y, outline='red', width=2)

    def on_mouse_drag(self, event):
        if self.rect:
            self.end_x = event.x
            self.end_y = event.y
            self.canvas.coords(self.rect, self.start_x, self.start_y, self.end_x, self.end_y)

    def on_mouse_up(self, event):
        self.end_x = event.x
        self.end_y = event.y
        if self.rect:
            self.canvas.coords(self.rect, self.start_x, self.start_y, self.end_x, self.end_y)

    def cut_image(self):
        if not self.img or self.rect is None:
            return
        # キャンバス座標→元画像座標に変換
        x1 = int(self.start_x / self.scale)
        y1 = int(self.start_y / self.scale)
        x2 = int(self.end_x / self.scale)
        y2 = int(self.end_y / self.scale)
        left, upper, right, lower = min(x1,x2), min(y1,y2), max(x1,x2), max(y1,y2)
        self.cropped_img = self.img.crop((left, upper, right, lower))
        self.show_image(self.cropped_img)
        self.btn_save.config(state='normal')

    def save_image(self):
        if not self.cropped_img:
            return
        save_path = filedialog.asksaveasfilename(defaultextension='.png', filetypes=[('PNG', '*.png'), ('JPEG', '*.jpg;*.jpeg')])
        if save_path:
            self.cropped_img.save(save_path)
            print(f'保存しました: {save_path}')

if __name__ == '__main__':
    root = tk.Tk()
    app = ImageCutterApp(root)
    root.mainloop()

3−2。動作フロー

% python ImageCut.py で起動します。

切り抜く画像を選択します。

切り抜く範囲を指定します。

切り抜きを実行します。

その後、ファイルに保存します。

これで当初の目的画像が作成されました(=GeoDiveExaがGoDiveExaになっているのはご愛嬌)。

最初の成果

5。おまけ=リバースプロントで作った画像

4。感想

本当に簡単にできますね。現状では色々な点で不足がある場合でも、その不足を補う方法もAIで作成できる可能性があるので、便利ですね。日本では現状10%程度の人しかAIを使用していないとの報告も有ります。こんな便利な物は使わないと勿体無いと思いうこの頃です。

pythonプログラム作成はざっとした感じで10〜20倍ぐらい私より早そうなので月々数千円の出費は物凄くコストパーフォースが良いですね。

画像生成機能は色々問題はありますが、絵の才能が無い私には物凄く助かりそうです。他にも画像生成AIは沢山ある様ですので他のツールも試してみたい物ですね。

5。おまけ=リバースプロント

生成AIを使うためにはプロンプトがキーです。このプロンプトをどの様に作るかがノウハウなのか「プロンプト作家」と呼ばれる職種?がある様です。今回作成したpythonプログラムや画像は結果から逆にプロンプトを作成する=リバースプロントを貯めていけば「プロンプト作家」になれるかも知れません。

それではリバースプロンプトを作ってみましょう。

リバースプロンプト例:

「Pythonで簡単なWeb APIテストサーバを作りたいです。

Flaskを使う
/get でGETリクエストのパラメータを受け取り、リスト形式のHTMLで返す
/post でPOSTリクエストのパラメータを受け取り、リスト形式のHTMLで返す
どちらも受信したパラメータを画面に分かりやすく表示
コードはAPiTest.pyとして1ファイルで
macOS環境で動作するもの
できればフォントサイズも大きめで見やすく」
リバースプロンプト例:

「Pythonで画像を切り抜くGUIアプリを作りたいです。

Tkinterで画像ファイルを選択できる
画像を表示し、マウスドラッグで切り抜き範囲(矩形)を指定できる
切り抜いた画像をプレビュー表示
保存ボタンで任意のファイル名で保存できる
Pillow(PIL)を使う
コードはImageCut.pyとして1ファイルで
macOS対応でお願いします」
リバースプロンプト例:

地球と、その周りを周回する衛星が光るティールと緑の線で繋がれている背景に、
地図アプリを表示した洗練されたスマートフォンが配置されている。
アプリには日本の地図が表示され、目立つ位置にピンが立っている。
スマートフォンの上には、大きな白いテキストで「GoDiveExa」、
その下に小さな文字で「High-Precision Survey Tool」と書かれている。
地球の下には、4つの白いアイコンとテキストラベルが並んでいる。
「2cm Accuracy」、「Customizable Items」、「Multi-Coordinate System Background Map Support」、「Camera Video Capture」。
全体的に未来的でクリーンな美学で、テクノロジーが強調されている。

ここで「GoDiveExa」と間違いに気づいたので「GeoDiveExa」に修正して画像を再作成してみます

修正プロンプト1:

地球と、その周りを周回する衛星が光るティールと緑の線で繋がれている背景に、
地図アプリを表示した洗練されたスマートフォンが配置されている。
アプリには日本の地図が表示され、目立つ位置にピンが立っている。
スマートフォンの上には、大きな白いテキストで「GeoDiveExa」、
その下に小さな文字で「High-Precision Survey Tool」と書かれている。
地球の下には、4つの白いアイコンとテキストラベルが並んでいる。
「2cm Accuracy」、「Customizable Items」、「Multi-Coordinate System Background Map Support」、「Camera Video Capture」。
全体的に未来的でクリーンな美学で、テクノロジーが強調されている。

無事に文字が修正されました。

ついでに文字を日本語にしてみましょう。

「High-Precision Survey Tool」を「高精度位置調査ツール」

「2cm Accuracy」を「精度2cm」

「Customizable Items」を「任意の調査項目」

「Multi-Coordinate System Background Map Support」を「多くの座標系と多くの背景地図」

「Camera Video Capture」を「カメラ、ビデオ撮影」に変更

日本語が中国語になっている==やっぱダメだった。この辺が今日現在のGeminiの限界か。

学習データ元に中国語が多いのかな??

本気でするなら文字を無くして、自分で文字追加すれば良いので、これでも十分とも言えます。

文字を全て消すプロンプト例:3回修正して左の画像ができました。

1。日本語が変なのでGeoDiveExa以外の文字は全て消して
2。GeoDiveExaの下の変な文字も消して
3。下のアイコンと文字も消して。

これをベースに色々飾れば良いかな。


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

PAGE TOP