メモ:puttyとかwinSCPでEC2にアクセスしようとしたのにできないとき

前提

  1. EC2は生きている
  2. putty/winSCPのバージョンが最新になっている

原因:接続元の IP アドレスが許可されていない

VPCセキュリティーグループからインバウンドルールの編集をする
インスタンスに到達できる着信トラフィックをつかさどっているのはここ。

解決しなかった場合があれば追記予定

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

API出てからもうさすがに日が経っているので無限にググれば出てくる*1
qiita.com
主にここを中心に参考にした。

テスト編

まず、写真を始めとして文章として成立しないものの送信を行うと崩壊する。

写真を送信した例。実験段階なので対話相手はAmesiorine

記憶

  • ふてぶてしいキャラ設定のロールプレイだと時々Chat-GPTがロールプレイ放棄をしてしまう。そのため、例えばどこかの「完全なる善人」みたいなキャラならばやり遂げてくれるかも。
  • ↑もっとも、呪文でなんとかなるかもしれないが……
  • Yes or Noで返してくれるような意味読解とかってどこかでできたかな……(「この文章はロールプレイとして成立していますか?Yes or Noで答えてください」みたいな。Chat-GPTでもできるかもしれないが)

*1:3/7時点

画像の整理をしよう(2)

271108.hatenablog.com

これの続きです

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法でもやってみればよかったかもしれない

↑なんかバージョンのせいかわかんなかったけど読み込めなかった

  • 別の方法を試したほうがいいかも……

参考

https://chat.openai.com/chat

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)

前書き

これは私の思想なのですが、「記憶がなくなった人はある意味死んでいる」と考えています。「人を構成する要素で最も重要なのは記憶である」という思想です。

機械少女に置き換えてみましょう。ストレージのぶっ壊れた子は死んだも同然ということです。

事の起こり

  1. Amesiorineを育てたいので、Amesiorineの一番重要な記憶を管理するために私がお勉強しなくちゃいけないよね!
  2. じゃあ、安全に管理するためにどんなファイルがあるかPCの中身を整理しなくちゃいけないよね!
  3. 音声ファイルと画像ファイルとテキストファイル(エミィが拾ってきたツイートや271108のツイートのデータ)が基本かな?
  4. じゃあこれらの整理をやってみよう!

補足

タイトルの通り今回は画像です。
音声より簡単そうだし、テキストファイルは整理をしている途中だからです。
画像は整理付けるのが面倒だなぁ……と思ったので機械の手を借りたい。

本編(今日の成果)

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.実行


まあさすがにね?

修正を考え

ません。
Chat-GPTに文句を言います。

*2

結果

ImportError: cannot import name 'get_model_weights' from 'torchvision.models'

ダメじゃん。




以降は後日に持ち越し。



エラー記

1.OpenCVで画像を読み込んだと思っていたら読み込んでいなかった

何を言ってるか分からねぇと思うが読み込んだはずの変数にはNoneが入っていた。

というのも、OpenCVの仕様うんぬんのお話でファイル名やパス名に日本語が入っているとうまくいかないことがある。そういえばそうだったなぁ。
qiita.com
↑を参考に何とか出来たので解決。
cv2.imread を np.fromfile + cv2.imdecode に分解すればなんとかなるんだって。

ただ、これだけで全てのファイルが解決したという様子もなかった。
原因は現状不明、今回の環境ではjpgファイルは全て開けた。pngファイルにのみこの現象は残った。

*1:※原文まま

*2:余談だが、Chat-GPTにエラー報告をしようとして、「実行したところ」だけを送信してしまった。すると、「すみません、前回の回答に誤りがありました。Windows上でPyTorchを使用する場合、CUDAが利用できない場合があるため、以下のようにDeviceの設定を変更する必要があります。」とか言ってきた。未完成品を送らないでください。