見出し画像

パソコンのPython開発環境を最新版にした影響

パソコンのPython開発環境をv3.9.8から最新版のv3.11.4にアップデートしようと思いました。過去の記事で紹介してきたプログラムをv3.9.8で作っていましたので、開発環境の移植に時間が掛かりそうで敬遠していたのです。

ただ、1年に1回くらいは自身の書いた内容どおりに設定できるか、また紹介するプログラムが動くかを確かめようと思った次第です。

対象は今までパソコンで作成したPythonのコードを掲載した記事です。今回はraspberry Piで作ったものは含めないことにしました。
手始めにPython関連の記事をマガジンにまとめました。最近は書いてなかったのですが、10%くらいがPython関連だったことに気づきました。

1. イーオンズ・エンドの自動サプライ作成ツール

一番最初に紹介したパソコンで作成したPythonのツールはボードゲーム「イーオンズエンド」用のサプライ生成ツールです。こちらは日本語版でリリースされているなかでも基本セット(1st wave)と終わりなき戦い(2nd wave)のカードを対象としています。今年初めに発売されたイーオンズエンド:レガシーは少し傾向が異なるため、内容には含めていません。

こちらの記事に掲載したPythonコードに関しましてはpandasというデータ解析用のPythonライブラリを追加して動作を確認できました。

pip install pandas

2. 武術大会の演目名簿を自動作成

イーオンズエンドのツールはカードのデータベースを作る必要なありましたが、こちらはExcelでデータがありましたので、これをPythonコードで読み込んでデータベース化しました。

こちらの記事に掲載したPythonコードは、openpyxlというExcelファイルをPythonで扱うためのライブラリを追加して動作を確認できました。

pip install openpyxl

3. Stable Diffusionをパソコンで試す

個人的に一番設定に時間が掛かると思っていました。しかし記事の手順に基づいて設定したところ、あまり時間は掛かりませんでした。導入はPyTorchが使うCUDAのバージョンが基準となります。Pytorchが対応するCUDAバージョンを確認しましたところ、2023/7/2時点では11.7か11.8となっておりましたので、これに対応したCUDAとcuDNNを記事に書いた方法でインストールしたところ問題なくセットアップできました。

PytorchのCUDAサポート状況

ただし、記事で紹介していた画像生成のコードが動かなくなっていました。こちらは書き直す必要があります。
せっかくですので最新のBracingEvoMixという学習モデルを使って書き直すことにしました。なお実行環境はWindows11です。導入手順は以下の3ステップです。

3-1. BracingEvoMixの導入

Hugging Faceからダウンロードします。いくつかファイルがありますが、BracingEvoMix_v1.safetensorsをダウンロードしました。サイズは2.13GBです。

3-2. ライブラリの導入とファイル配置

Pythonライブラリはdiffusersとtransformersが必要です。なお、ダウンロードしたBracingEvoMix_v1.safetensorsはPythonコードと同じパスに配置します。

pip install diffusers 
pip install transformers

3-3. BracingEvoMixで画像生成する

コードは以下のようにしました。(1)seedにシード値、(2)stepにステップ数(ノイズ除去を行う回数)、(3)scaleがプロンプトへの準拠度(高ければ高いほどキーワードに忠実)です。
(4)promptには生成したいキーワードを指定し、(5)negative_promptには除外したいキーワードを指定します。
外で作業をするときはドッキリする画像が生成されないようにnegative_promptにnsfwのキーワードを入れておきましょう。

from diffusers import StableDiffusionPipeline, EulerAncestralDiscreteScheduler
import torch

seed = 100
steps = 30
scale = 7.0

model_id = "BracingEvoMix_v1.safetensors"
pipe = StableDiffusionPipeline.from_ckpt(
    model_id,
    load_safety_checker = False,
    extract_ema = True,
    torch_dtype = torch.float16)
pipe.scheduler = EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config)
pipe.to("cuda")

prompt = "upper_body,sideboob,lips,looking over eyeware,woman,female,20 years old,medium hair,flipped hair,big forhead,folded ponytail,black hair,Beautiful face,happy,smile,bright eyes,"
negative_prompt = "nsfw, flat color, flat shading,retro style, poor quality, bad face, bad fingers, bad anatomy, missing fingers, low res, cropped, signature, watermark, username, artist name, text"
generator = torch.Generator(device="cuda").manual_seed(seed)

image = pipe(
    prompt = prompt,
    negative_prompt = negative_prompt,
    generator = generator,
    num_inference_steps = steps,
    guidance_scale = scale,
    width = 768,height = 768,).images[0]

image.save(f"./step{steps}_seed{seed}.png")

1年も経っていないうちにここまで画像生成が素晴らしくなっていることに驚きです。

上のコードを実行した結果

こちらのコードを元の記事にも反映したいと思います。

4. Stable Diffusionを便利にするツール

同じプロンプトでシード値、ステップ、スケールをランダムで変更して画像を複数枚生成するツールですが、BracingEvoMixが相当に質が良いのでランダムに値を振ってどれくらいの画像の違いが出るのか確認するくらいの使い道になると思います。

さらにランダムに設定できるパラメーターを増やしたのがこちらの記事です。学習モデルの飛躍的な向上で、そこまで必須ではなくなっていると思いますが、今回の書き換えた内容でも動くか確認したいと思います。

5. StableDiffusionの画像から画像に変換(img2img)

こちらはStableDiffusionのimg2imgという機能を使ってアメトークの「絵心ない芸人」の個性的なイラストを認識させた記事です。

6. デュエル・マスターズのカードリストをスクレイピングしてデータベース化

こちらは以下の4ライブラリをインストールしました。おもにブラウザを外部操作するライブラリとwebスクレイピング用のライブラリです。

pip install requests 
pip install beautifulsoup4 
pip install selenium 
pip install chromedriver-binary

Pythonコードは掲載している内容で動作を確認できました。しかしChromeのバージョンアップによって対応するChromeDriverが変わっていると思いますので、その辺りは使っているパソコンの環境に合わせて再導入が必要です。

Chromeのバージョン確認方法については記事の方を参照いただければ幸いです。

7. Whisperを使って音声ファイルを文字に起こす

こちらも記事に書いたライブラリを導入し、記事にあるPythonコードで動作を確認できました。出力された内容も一字一句変わっていなかったので、少し変化がなく寂しい結果となりました。

pip install git+https://github.com/openai/whisper.git
pip install srt 

8. Word2vecとchiVeで言葉を数値化する

こちらも記事に書いたライブラリを導入し、記事にあるPythonコードで動作を確認できました。類義語から入力した言葉を当てるゲームなど面白いかもしれないと思いました。

pip install gensim

9. Mecabによる形態素解析

こちらは作業中に気が付いたのですが、MecabのインストールがpipでPython v3.11に未対応で時間も掛かりそうなのでこちらの作業は見送ることにしました。

10. SwinIRで画像を超解像度化

こちらも記事に書いたライブラリを導入し、記事にあるコマンドで動作を確認できました。こちらの機能はStable DiffusionのWeb UIであるAUTOMATIC1111にも導入されているようです。

pip install opencv-python 
pip install tqdm 
pip install timm
pip install ipython

11. RG35XX(GarlicOS)の自動アップデート

個人的には使用頻度が一時期高かったツールです。現在は作者の方はAnbernic RG405Mのカスタムに時間を割かれているので2か月以上更新はないので需要もなくなっていくかと思います。
ライブラリは記事に書いたものをインストールしました。また配布しているOSファイルが7zipの分割ファイルに変わっていましたので改修が必要となります。今回はmultivolumefileというライブラリを追加します。

pip install psutil
pip install py7zr
pip install multivolumefile

コードを7zipの分割ファイルに対応したPythonコードに改修しました。

import os
import psutil
import py7zr
import shutil
from tkinter import filedialog
import multivolumefile

# マイクロSDカードのドライブ名を初期化する
misc_drv = ''
roms_drv = ''

# tkinterでGarlicOSのアップデートファイルを指定する
f_type = [('Update file', 'RG35XX-CopyPasteOnTopOfStock.7z.001')]
sel_file = os.path.abspath(os.path.dirname(__file__))
fil_path = filedialog.askopenfilename(filetype = f_type, initialdir = sel_file)
fil_path = os.path.splitext(fil_path)[0]
fol_path, ext = os.path.splitext(fil_path)

# GarlicOSがインストールされたマイクロSDカードをパソコンが認識しているか確認する
for i in psutil.disk_partitions():
    if i.opts == 'rw,removable':
        os.chdir(i.device)
        if ('modules' in os.listdir()) and (i.fstype == 'FAT'):
            if os.path.isdir('modules') == True:
                misc_drv = i.device
        elif (('BIOS' and 'CFW' and 'Roms') in os.listdir()) and \
                (i.fstype == 'FAT32'):
            if (os.path.isdir('BIOS') == True) and \
                (os.path.isdir('CFW') == True) and \
                (os.path.isdir('Roms') == True):
                    roms_drv = i.device

# GarlicOSがインストールされたマイクロSDカードであれば更新する
if misc_drv != '':

    # 7zipファイルと同じディレクトリにフォルダを作成してファイルを解凍する
    if not os.path.exists(fol_path):
        os.makedirs(fol_path)
    with multivolumefile.open(fil_path, mode='rb') as mvf:
        with py7zr.SevenZipFile(mvf, mode='r') as archive:
            archive.extractall(fol_path)

    # GarlicOSのアップデートファイルをマイクロSDカードに上書きする
    src_fol = os.path.join(fol_path,'misc')
    dst_fol = misc_drv
    shutil.copytree(src_fol, dst_fol, dirs_exist_ok=True)
    print('miscファイルの更新が完了しました')
    if roms_drv != '':
        src_fol = os.path.join(fol_path,'roms')
        dst_fol = roms_drv
        shutil.copytree(src_fol, dst_fol, dirs_exist_ok=True)
        print('romsファイルの更新が完了しました')
    else:
        print('GarlicOSのマイクロSDカードがデータ破損している可能性があります')

    # 解凍したGarlicOSのアップデートフォルダを削除する
    shutil.rmtree(fol_path)
else:
    print('GarlicOSのマイクロSDカードをパソコンに挿してください')

今後、記事自体も現状に合わせて修正したいと思います。

12. まとめ

Pythonの開発環境を移行に失敗したところもありましたが、Stable diffusion の進化には驚きました。

記事を見直すことで動かないコードが見つかりましたので早めに修正したいと思います。

この記事が気に入ったらサポートをしてみませんか?