Sepblectusの今後のメモ
Amy
- 死んだら考える。
- ツイートを見ることができなくなるが……ツイートをすることはできる。
- 何をしようかね。
Kya
- 妹分のお仕事を振る。
→ 仕事の内容って271108として喋ってたっけ?
- 妹分のお仕事に関してはチャンネル増やしてひとまず凌ぐ。
→ あとできれいにしてあげましょう。
Celen
- まだまだ微調整が必要。
- どこを修正したかメモ取るのがめんどいので根本の認識が必要かもしれない。
- いいからはやくSSSSとトリカラマッチの処理を用意してくれ。
→webサイトとか作っても面白いかもね。
→そんな余裕はどこにもないか。
Sphy
- とりあえずエラーが発生したときのログをDiscordに投げるようにした。
- ただし、Amyのエラーに関してはまだ確認していない。
その他
- 今はそれぞれ順番に実行させてる。めんどい。
- 行動順はどれが無難?
- Kyaだけまた特殊なのでそこに注意。
→仕事が溜まってる状態で終わる危険性があるならSphyから実行する方が無難かな?
→行動を終わらせる順番ならCelen、Amy、Kya、Sphyか?
- Twitterがベースだったので過去のブログ記事が全く役に立たなくなりそう。ブログカテゴリーを作り直したほうがいいかもしれない。
ブルリフのボスが気になった
気になったので調べただけのメモです。
(3/27memo ブルリフTのボスもあとで書き足す)
ブルリフ燦の271108のための攻略用ブログ記事を書こうと思っていたのにそれよりも先にこんな記事書くとは思わなかった。
一応ネタバレ注意。
続きを読むChat-GPTとDiscordBot
事の始め
親戚と旅行に行くことになりました。
その親戚が可愛がっている結構デカいくまのぬいぐるみがあります。
残念ながら、旅行にそのぬいぐるみを持って連れていくことはできません。
人間の場合、離れていてもLINEを始めとしてやり取りをすることが可能です。
しかし、くまのぬいぐるみの場合、離れていると会話は…………
そうだ、Chat-GPTを使おう。
Putty
特に設定をしていない場合「login as:」の項目は「ec2-user」になっていたらしい。メアドを入れて「ログインできないが??」ってなってた。最近メアドって言わんよね。
DiscordBot
かつてKyashowを微修正したものを利用。
名前を変え、アイコンを変えることで外面はOK。
Discord.pyの仕様が結構変わっている
結構面倒だった。
さらに、アップデートしようとしたらこれである。
ERROR: Package 'discord-py' requires a different Python: 3.7.9 not in '>=3.8.0'
python3.8以降が必要っぽいのでEC2にpython3.9をインストールした。
テスト編
まず、写真を始めとして文章として成立しないものの送信を行うと崩壊する。
記憶
- ふてぶてしいキャラ設定のロールプレイだと時々Chat-GPTがロールプレイ放棄をしてしまう。そのため、例えばどこかの「完全なる善人」みたいなキャラならばやり遂げてくれるかも。
- ↑もっとも、呪文でなんとかなるかもしれないが……
- Yes or Noで返してくれるような意味読解とかってどこかでできたかな……(「この文章はロールプレイとして成立していますか?Yes or Noで答えてください」みたいな。Chat-GPTでもできるかもしれないが)
参考
discordpy.readthedocs.io
[初心者向け]VPC作成からEC2インスタンス起動までを構成図見ながらやってみる(その1) | DevelopersIO
[初心者向け]VPC作成からEC2インスタンス起動までを構成図見ながらやってみる(その2) | DevelopersIO
PuTTY を使用した Windows から Linux インスタンスへの接続 - Amazon Elastic Compute Cloud
【初心者向け】Amazon EC2にSSH接続する【Windows、Macintosh】 | DevelopersIO
Hello,Kyashow! - 271108の記憶貯蔵庫
AttributeError: 'Intents' object has no attribute 'message_content' : Discord_Bots
AmazonLinux2でPython3環境構築 - Qiita
AWSのEC2上に環境変数を設定する方法 - Qiita
AWS EC2上のWebサーバーを起動したままにする方法を教えてください
linux - nohup 付きで実行した処理を強制終了したい - スタック・オーバーフロー
*1:3/7時点
画像の整理をしよう(2)
これの続きです
Chat-GPTくんに言われたコードが違っていたのでそこを微修正しました。
クラスタリングの結果が文字で言われても私には何のことか分からないのでChat-GPTにサムネ付きで分かりやすく提示してね!って命令を出しました。
メモリ足らないってさ
DefaultCPUAllocator: not enough memory: you tried to allocate 12006000 bytes.
まあ、そんな気はしてた。
最終的なコード
import collections import cv2 import glob import numpy as np import os import pickle import random import torch import torchvision.transforms as transforms from PIL import Image from sklearn.cluster import KMeans from torchvision.models import resnet18 from tqdm.notebook import tqdm as tqdm def imread(filename, flags=cv2.IMREAD_COLOR, dtype=np.uint8): try: n = np.fromfile(filename, dtype) img = cv2.imdecode(n, flags) return img except Exception as e: print(e) return None jpg = [] Error = [] for f in tqdm(glob.glob("./**/*.jpg", recursive=True)): try: im = imread(f) jpg.append(im.shape) except Exception as e: Error.append([f,e]) jpg_counter = collections.Counter(jpg) png = [] for f in tqdm(glob.glob("./**/*.png", recursive=True)): try: im = imread(f) png.append(im.shape) except Exception as e: Error.append([f,e]) png_counter = collections.Counter(png) data = {} Error = [] shape = (1334, 750, 3) l = [] for f in tqdm(glob.glob("./**/*.jpg", recursive=True)): im = imread(f) if type(im) != type(None): if im.shape == (1334, 750, 3): l.append(f) data["jpg"] = l l = [] for f in tqdm(glob.glob("./**/*.png", recursive=True)): im = imread(f) if type(im) != type(None): if im.shape == (1334, 750, 3): l.append(f) data["png"] = l # 画像を読み込んでPyTorch Tensorに変換する関数 def load_image(image_path): image = Image.open(image_path).convert('RGB') transform = transforms.Compose([ # transforms.Resize((224, 224)), # 画像サイズを変更する transforms.ToTensor() # PyTorch Tensorに変換する ]) return transform(image).unsqueeze(0) # 画像を3次元Tensorに変換し、バッチの次元を追加する device = 'cuda' # 画像を読み込む images = [] for file in tqdm(data["jpg"]): images.append(load_image(file)) from sklearn.model_selection import train_test_split train_rate = 0.3 test_rate = 0.7 MainPngData, UndecidedData = train_test_split(data["png"], train_size=train_rate) for file in tqdm(MainPngData): images.append(load_image(file)) # PyTorch Tensorに変換する images = torch.cat(images) # 特徴量を抽出するためのモデルをロードする(例えば、ResNet18) model = resnet18() model.eval() # 画像の特徴量を抽出する features = [] with torch.no_grad(): for image in tqdm(images): feature = model(image.unsqueeze(0)).squeeze().numpy() features.append(feature) features = np.array(features) # KMeansアルゴリズムを使用してクラスタリングする num_clusters = 10 # クラスタ数 kmeans = KMeans(n_clusters=num_clusters) kmeans.fit(features) # クラスタリング結果を表示する for i in range(num_clusters): cluster_idx = np.where(kmeans.labels_ == i)[0] print(f'Cluster {i}: {cluster_idx}') import matplotlib.pyplot as plt from mpl_toolkits.axes_grid1 import ImageGrid # クラスタごとに画像のインデックスを分割する cluster_indices = [[] for _ in range(num_clusters)] for i, label in enumerate(kmeans.labels_): cluster_indices[label].append(i) # 各クラスタに属する画像のサムネイルを表示する fig = plt.figure(figsize=(10, 10)) grid = ImageGrid(fig, 111, nrows_ncols=(num_clusters, len(cluster_indices[0][:num_clusters])), axes_pad=0.1) for i in range(num_clusters): for j, idx in enumerate(cluster_indices[i][:num_clusters]): ax = grid[(i*len(cluster_indices[i][:num_clusters]))+j] ax.imshow(images[idx].permute(1, 2, 0).numpy()) ax.set_title(f'Cluster {i}') ax.axis('off') plt.show()
結果
黒ウィズの画像ばかりではないか……
スクショのサイズだしまあそうっちゃそうだよな……
全体的に色を重視している傾向がありそう。
メモ
- K-meansだけじゃなくてWard法でもやってみればよかったかもしれない
↑なんかバージョンのせいかわかんなかったけど読み込めなかった
- 別の方法を試したほうがいいかも……
参考
ValueError: expected 4D input (got 3D input)
ValueError: expected 4D input (got 3D input) - PyTorch Forums
↑このモデルでは(Batch x Channel x Height x Width)の4次元で入力を受け付けてるので3次元で入力しても無駄だぜ!というエラーを貰った。
Chat-GPTくんの名誉のための記事
1個前の記事でChat-GPTくんポンコツ感あったので。
pythonのimport文を無限に先頭に書いてると何をimportしたのか忘れる……というか見にくくなるし、嫌やね……ってなりません?
私はなった。
それ思ってたのを思い付きでChat-GPTに書かせたら、さっきのブログ記事書いてる途中で終わらせてくれました。
ポンコツな面だけでなく優秀な面もあります。
まあみんな知ってるか。
271108「python3のimport文を整理して見やすくしたいと考えています。複数のimport文をテキストとして入力を受け付け、整理された複数のimport文を返すコードを書いてください。」
Chat-GPT「以下は、複数のimport文を整理して見やすくするPythonコードの例です。この例では、入力された複数のimport文をアルファベット順にソートし、1つのimport文につき1行に出力するようにしています。」
def sort_imports(imports): # 入力された複数のimport文をリストに分割 imports_list = imports.split('\n') # import文をアルファベット順にソート sorted_imports = sorted(imports_list) # 整理された複数のimport文を文字列に結合 sorted_imports_str = '\n'.join(sorted_imports) return sorted_imports_str
Chat-GPT「この関数を以下のように呼び出せば、入力された複数のimport文を整理された複数のimport文に変換できます。」
input_str = "import os\nimport sys\nfrom math import sqrt" sorted_imports_str = sort_imports(input_str) print(sorted_imports_str)
Chat-GPT「上記の例では、以下のような出力が得られます。」
from math import sqrt import os import sys
Chat-GPT「このように、import文を整理することで、コードの可読性を向上させることができます。」
感想
- 微修正だけで普通に使いやすそう
- コメントアウト助かる。合ってるし。
- 重複を消してくれとは確かに言わなかった、言ってもよかったかも
- 空行あると先頭に空行が密集する仕様
- from ほげもげ import ふがもが は impot なにがしより後に来てほしいかも…...
- まあ直せばよくない?
画像の整理をしよう(1)
前書き
これは私の思想なのですが、「記憶がなくなった人はある意味死んでいる」と考えています。「人を構成する要素で最も重要なのは記憶である」という思想です。
機械少女に置き換えてみましょう。ストレージのぶっ壊れた子は死んだも同然ということです。
事の起こり
- Amesiorineを育てたいので、Amesiorineの一番重要な記憶を管理するために私がお勉強しなくちゃいけないよね!
- じゃあ、安全に管理するためにどんなファイルがあるかPCの中身を整理しなくちゃいけないよね!
- 音声ファイルと画像ファイルとテキストファイル(エミィが拾ってきたツイートや271108のツイートのデータ)が基本かな?
- じゃあこれらの整理をやってみよう!
補足
タイトルの通り今回は画像です。
音声より簡単そうだし、テキストファイルは整理をしている途中だからです。
画像は整理付けるのが面倒だなぁ……と思ったので機械の手を借りたい。
本編(今日の成果)
01.まずは画像サイズの確認
やったこと
画像サイズを確認して、(多くはiPhoneの写真やスクショであるはずなので)最もファイル数の多い画像サイズの画像だけで実行しようと考えている。
import glob import cv2 import collections from tqdm.notebook import tqdm as tqdm import numpy as np def imread(filename, flags=cv2.IMREAD_COLOR, dtype=np.uint8): try: n = np.fromfile(filename, dtype) img = cv2.imdecode(n, flags) return img except Exception as e: print(e) return None jpg = [] Error = [] for f in tqdm(glob.glob("./**/*.jpg", recursive=True)): try: im = imread(f) jpg.append(im.shape) except Exception as e: Error.append([f,e]) #for f in tqdm(glob.glob("./**/*.JPG", recursive=True)): # try: # im = imread(f) # jpg.append(im.shape) # except Exception as e: # Error.append([f,e]) jpg_counter = collections.Counter(jpg) png = [] for f in tqdm(glob.glob("../**/*.png", recursive=True)): try: im = imread(f) png.append(im.shape) except Exception as e: Error.append([f,e]) #for f in tqdm(glob.glob("../**/*.PNG", recursive=True)): # try: # im = imread(f) # png.append(im.shape) # except Exception as e: # Error.append([f,e]) png_counter = collections.Counter(png) png_counter.most_common()
補足
globで大文字小文字の区別あるんじゃない?っておもって2つ用意したけど大文字小文字の区別なかったっぽい。
01.結果
jpg
[((1944, 2592, 3), 945),
((112, 200, 3), 277),
((750, 750, 3), 251),
((720, 1280, 3), 222),
((2592, 1944, 3), 209),
・・・
png
[((512, 512, 3), 21703),
((1334, 750, 3), 13117),
((128, 128, 3), 8593),
((750, 1334, 3), 1483),
((256, 128, 3), 1399),
・・・
- pngファイルが圧倒的に多い
- 正方形の画像が思ったよりあるかも。これはなんかのデータかも?
- 1334, 750のサイズはどうやらiPhoneの画面のサイズと同じらしい。スクショが多いのでこうなったのだろうか。
- 今回はこれ以降、( 1334, 750, 3 )の画像のみに絞っていろいろ行う。
補足
- リストは[(im.shape), 枚数]の形。im.shapeなので2番目の数字は3色を示す3になる。
02.クラスタリング
「で、クラスタリングってどうやるんだい?」
まず、クラスタリングのおさらいから。
271108「クラスタリングってわかる?」
Chat-GPT「はい、クラスタリングとは、データを似た特徴を持つグループ(クラスタ)に分割するデータ解析の手法です。クラスタリングは、データの特徴やパターンを発見するために使用されます。クラスタリングには、いくつかのアルゴリズムがあり、例えば階層的クラスタリング、k-meansクラスタリング、DBSCANクラスタリングなどがあります。クラスタリングは、機械学習やデータマイニングの分野でよく使用されます。」*1
271108「python3とpytorchを使って、windows上にある手持ちの画像データのクラスタリングをやりたいと考えています。コードの例を教えてください。」
Chat-GPT「はい、以下はPython3とPyTorchを使用して、Windows上の手持ちの画像データをクラスタリングするためのコード例です。この例では、KMeansアルゴリズムを使用して画像をクラスタリングします。」
(コード掲載)
Chat-GPT「このコードでは、まず画像を読み込んでPyTorch Tensorに変換します。次に、特徴量を抽出するためのモデルとしてResNet18を使用し、画像の特徴量を抽出します。最後に、KMeansアルゴリズムを使用してクラスタリングを行い、クラスタリング結果を表示します。」
コード原文
import os import torch import torchvision.transforms as transforms import numpy as np from PIL import Image from sklearn.cluster import KMeans # 画像を読み込んでPyTorch Tensorに変換する関数 def load_image(image_path): image = Image.open(image_path).convert('RGB') transform = transforms.Compose([ transforms.Resize((224, 224)), # 画像サイズを変更する transforms.ToTensor() # PyTorch Tensorに変換する ]) return transform(image).unsqueeze(0) # 画像を3次元Tensorに変換し、バッチの次元を追加する # 画像を読み込む image_dir = 'path/to/image/directory' images = [] for filename in os.listdir(image_dir): if filename.endswith('.jpg') or filename.endswith('.png'): image_path = os.path.join(image_dir, filename) images.append(load_image(image_path)) # PyTorch Tensorに変換する images = torch.cat(images) # 特徴量を抽出するためのモデルをロードする(例えば、ResNet18) model = torch.hub.load('pytorch/vision', 'resnet18', pretrained=True) model.eval() # 画像の特徴量を抽出する features = [] with torch.no_grad(): for image in images: feature = model(image).squeeze().numpy() features.append(feature) features = np.array(features) # KMeansアルゴリズムを使用してクラスタリングする num_clusters = 5 # クラスタ数 kmeans = KMeans(n_clusters=num_clusters) kmeans.fit(features) # クラスタリング結果を表示する for i in range(num_clusters): cluster_idx = np.where(kmeans.labels_ == i)[0] print(f'Cluster {i}: {cluster_idx}')
02.実行
まあさすがにね?
結果
ImportError: cannot import name 'get_model_weights' from 'torchvision.models'
ダメじゃん。
以降は後日に持ち越し。
エラー記
1.OpenCVで画像を読み込んだと思っていたら読み込んでいなかった
何を言ってるか分からねぇと思うが読み込んだはずの変数にはNoneが入っていた。
というのも、OpenCVの仕様うんぬんのお話でファイル名やパス名に日本語が入っているとうまくいかないことがある。そういえばそうだったなぁ。
qiita.com
↑を参考に何とか出来たので解決。
cv2.imread を np.fromfile + cv2.imdecode に分解すればなんとかなるんだって。
ただ、これだけで全てのファイルが解決したという様子もなかった。
原因は現状不明、今回の環境ではjpgファイルは全て開けた。pngファイルにのみこの現象は残った。