I am Charmie

メモとログ

研究のスタートアップ

スタートアップ

すごく大事なこと

  1. Qiitaの記事: 15分ルール
  2. 暦本先生: 私の研究法(動画)
  3. 石原先生@阪大: 研究室で成長して卒業するために守ってほしい10のこと
  4. 渡辺先生@慶應: 卒論の書き方
  5. Qiitaの記事: 質問は恥ではないし役に立つ
  6. 鳥井さん@万葉: 質問を"聴く"技術

プログラミング

Pythonの勉強より前に試してみよう

  1. マンガと学ぶデータビジュアライゼーション
  2. 東工大機械学習帳
    • 古典的な機械学習アルゴリズムについて
    • 式とプログラムが併記されており,理論とプログラミングを一緒に学べる
  3. 東工大Python早見帳
    • Pythonの言語について解説とプログラムが併記されており,わかりやすく学べる
  4. 藤吉先生(中部大学): 深層学習体験
    • Google colaboratoryで実行できる

プログラミングのルールや原則

  1. 森さん@CyberZ: 良いコードとは何か
  2. Google Python Style Guide
    • GoogleにおけるPythonでプログラミングするときのルール
    • 小山田の和訳
  3. 命名規則: Qiitaの記事
  4. Qiitaの記事: イラストで理解するSOLID原則
  5. asumikam: 読みやすいテストコードへの一歩、適切なAssertionを使う
  6. Qiitan記事: リーダブルコードの要点整理と活用法をまとめた

Python(言語)

  1. 三谷先生@筑波大: Python 学習教材
  2. 京大: プログラミング演習 Python 2021
  3. 千葉大: Pythonで学ぶプログラミング入門

Computer Vision, Machine Learning, Deep Learning

講義

  1. 松島先生@東大: 情報数理科学VII
  2. 九大 数理・データサイエンス教育研究センター: 講義資料
  3. Johnson先生@ミシガン大: Deep Learning for Computer Vision

スライド・動画

  1. 米田さん: 中学生でもわかる深層学習
  2. 鈴木 大慈先生@東大・理研AIP: 機械学習の数学
  3. 渡辺さん@ペポパ研究所: 機械学習イントロダクション
  4. 今泉先生@統数研: 深層学習の原理を明らかにする理論の試み

論文(読んだり書いたり)

  1. 松井先生@東大: 工学系の卒論生のための数式記述入門
  2. 品川先生@NAIST: 論文の読み方・書き方
  3. 渡辺先生@慶應: 論文の読み方
  4. 伊藤先生@お茶女: 研究分野をサーベイする
  5. 論文(pdf)をフォーマットを崩さずに翻訳
  6. 柳瀬先生@: AIを活用して英語論文を作成する日本語話者にとっての課題とその対策
  7. 仲田さん@cybozu: テクニカルライティングの基本

その他

  1. cvpaper.challenge: 研究効率化Tips 2024
  2. 松井先生@東大: 情報科学研究補助技法
  3. これだけ守れば見やすくなるデザインの基礎
    • スライドに限定しない,見やすい提示方法を解説
    • 正例・負例を比較しやすく掲載しているから参考になる
  4. パワーポイントのデザインパターン大全
  5. 畠山さん@Microsoft: ChatGPTを何も考えずに使えるようにしましょう
  6. 米田さん: わかりやすい説明のための10の鉄則
  7. デジタル庁: ChatGPTを業務に組み込むためのハンズオン
  8. ほげさん: 初心者が絵で理解するDocker
  9. 杉浦先生@慶應: ChatGPTを使ってプログラミング
  10. 飯沼さん@日本マクドナルド: Noを伝える技術

plotlyで作成するhtmlファイルのサイズ圧縮

plotlyを使って作成したhtmlファイルのファイルサイズが巨大になる問題の解決策がstakoverflowに投稿されていた.

  • ファイル出力する際に,plotlyjsのソースコードを出力ファイルに含めるためファイルサイズが巨大になってしまう
  • include_plotlyjsオプションの設定次第で3MB程度圧縮できる
filename = 'my_plotly.html'
# fig.write_html(filename)
with open(filename, 'w') as file:
    file.write(fig.to_html(full_html=False, include_plotlyjs='cdn'))

pip install datumaro on Mac

タイトル通り,datumaroMacにインストールするときのエラーの対処

brew install rustup
rustup-init
source "$HOME/.cargo/env"
pip install datumaro
# datumaro をimportするときに openvino, tbb関係のエラーが出る場合
brew install tbb

yolov8 with anaconda

YOLOv8をAnacondaの仮想環境で使う

conda create -n yolov8 python=3.11
conda activate yolov8
mkdir yolov8
cd yolov8
git clone https://github.com/ultralytics/ultralytics.git
cd ultralytics/
pip install -r requirements.txt
pip install ultralytics
cd ..

sample code

import numpy as np

import plotly.express as px
import plotly.graph_objects as go

from ultralytics import YOLO


# モデルの読み込み
model = YOLO('yolov8n-seg.pt')
number_of_classes = len(model.names)
colors = px.colors.sample_colorscale("hsv", [n/(number_of_classes-1) for n in range(number_of_classes)])

# テスト
filename = 'https://ultralytics.com/images/bus.jpg'
results = model(
    filename,
    save=True,
    save_txt=True,
    save_conf=True
)
# テスト結果の描画
for i, result in enumerate(results):
    image = result.orig_img[..., ::-1]
    fig = px.imshow(image, color_continuous_scale='gray')
    fig.update_layout(coloraxis_showscale=False)

    # 検出結果の取得
    number_of_objects = len(result.masks.xy)
    print(f'検出した物体の総数: {number_of_objects}')
    object_classes = result.boxes.cls.int().tolist()
    object_confidences = result.boxes.conf.tolist()

    # 検出した物体一つ一つをプロット
    for j, mask in enumerate(result.masks.xy):
        print(f'  {j}番目の検出物体')
        print(f'    クラス: {model.names[object_classes[j]]}')
        print(f'    信頼度: {object_confidences[j]}')
        fig.add_trace(
            go.Scatter(
                x=mask[:, 0],
                y=mask[:, 1],
                marker=dict(
                    color=colors[object_classes[j]],
                ),
                name=f'{model.names[object_classes[j]]}: {object_confidences[j]}',
                mode='lines',
            )
        )
    fig.show()

PyTorch Lightning + Hydra

PyTorch LightningとHydraを組み合わせるという流れに乗ろうと思った.

  • このレポジトリで公開しているテンプレートが便利
  • WanDBを使ったダッシュボードは面白かった
  • 以下がパッと分からなかったので導入は新年度からにする
    • WanDB
      • 各グラフを画像として取得する方法
      • 具体的な数値データを取得する
    • Hydra
      • ログに残すデータの設定(単に全configを読むのがめんどくさかった)

PyTorch Lightning

PyTorch Lightningを使ってみた.

https://pytorch-lightning.readthedocs.io/en/0.7.1/_images/pt_to_pl.jpg

  • この解説がわかりやすかった
  • PyTorchにおけるBoilerplate codeを減らすための工夫が施されている
  • 学習の処理(一バッチ分)をモデルクラスの関数に書くことで,学習の二重ループを書かなくて済む
    • lossfun: ロス関数の定義
    • configure_optimizers: optimizerの定義
    • train_dataloader: 学習データのデータローダの設定(@pl.data_loadeで修飾する必要あり)
    • val_dataloader: 検証データのデータローダの設定(@pl.data_loadeで修飾する必要あり)
    • training_step: 一バッチ分の学習ステップを定義
    • validation_step: 一バッチ分の検証ステップを定義
    • validation_end: 一エポック分の検証ステップ終了時の計算を定義
  • optimizer,データローダについてもモデルクラスの関数に書けるんだけど気持ち悪い.何か思想的な部分で理解が足りないんだと思う
  • 色々なレシピを公開してくれているのもありがたい
  • optimizerの説明を見たけど,optimizerを途中で切り替える方法が分からなかった.
    • やりたいこと: 学習の途中で更新するパラメータ,学習率を切り替えたい
    • この方法on_train_epoch_startでエポック数に応じて切り替える)が一番わかり易い

サンプルプログラムは以下の通りで,学習のプログラムが簡潔に書ける.

# main.py
# ! pip install torchvision
import torch, torch.nn as nn, torch.utils.data as data, torchvision as tv, torch.nn.functional as F
import lightning as L

# --------------------------------
# Step 1: Define a LightningModule
# --------------------------------
# A LightningModule (nn.Module subclass) defines a full *system*
# (ie: an LLM, diffusion model, autoencoder, or simple image classifier).


class LitAutoEncoder(L.LightningModule):
    def __init__(self):
        super().__init__()
        self.encoder = nn.Sequential(nn.Linear(28 * 28, 128), nn.ReLU(), nn.Linear(128, 3))
        self.decoder = nn.Sequential(nn.Linear(3, 128), nn.ReLU(), nn.Linear(128, 28 * 28))

    def forward(self, x):
        # in lightning, forward defines the prediction/inference actions
        embedding = self.encoder(x)
        return embedding

    def training_step(self, batch, batch_idx):
        # training_step defines the train loop. It is independent of forward
        x, y = batch
        x = x.view(x.size(0), -1)
        z = self.encoder(x)
        x_hat = self.decoder(z)
        loss = F.mse_loss(x_hat, x)
        self.log("train_loss", loss)
        return loss

    def configure_optimizers(self):
        optimizer = torch.optim.Adam(self.parameters(), lr=1e-3)
        return optimizer


# -------------------
# Step 2: Define data
# -------------------
dataset = tv.datasets.MNIST(".", download=True, transform=tv.transforms.ToTensor())
train, val = data.random_split(dataset, [55000, 5000])

# -------------------
# Step 3: Train
# -------------------
autoencoder = LitAutoEncoder()
trainer = L.Trainer()
trainer.fit(autoencoder, data.DataLoader(train), data.DataLoader(val))