2024年5月31日金曜日

kakakikikeke を AI で大量生成してみました

kakakikikeke を AI で大量生成してみました

StableDiffusion の LoRA を作成して大量の kakakikikeke を作成してみました
これで永遠に自分が生成できます

環境

  • M2 Pro mac mini (macOS 14.5
  • Stable Diffusion WebUI 1.9.4
  • sd-scripts 0.8.7

学習させる画像

自分の昔の写真(15年くらい前の写真)を使いました
画像サイズはすべて 512x512 です

できれば 20-50 枚くらい準備したほうが精度が良いのですがとりあえずお試しなので 1 枚の画像から 4 枚の異なる背景の画像を用意しました
また少しだけ傾けけたりしています
こうすることで背景を変更させたりすることができます

画像のタグ情報を生成する

画像以外に画像のメタ情報を設定することでよりプロンプトで LoRA を強調することができます
タグ設定には https://github.com/toriato/stable-diffusion-webui-wd14-tagger を使っています

一応抽出できたタグ以外に個別のタグとして「kakakikikeke」を追加しました

LoRa の作成

LoRA の生成には有名な https://github.com/kohya-ss/sd-scripts を使いました
Apple Sillicon 上で動作させるには少し特殊な設定が必要になります

以下に学習時のパラメータを乗せておくので Apple Sillicon 上で動作させたい場合には参考にしてください

xformers を使わなかったり各種 precision の値、最適化関数を AdamW にするあたりが Apple Sillicon 上で動作させるポイントかなと思います
ちなみに画像の学習回数は15回です (ディレクトリに含める値なので以下では設定できない値)

ステップ数が 400 で画像が 4 枚で学習回数が 15 回でだいたい 1 時間くらいで完了します
もっと画像を増やしたりステップを増やしてもいいかもしれません


  "LoRA_type": "Standard",
  "LyCORIS_preset": "full",
  "adaptive_noise_scale": 0,
  "additional_parameters": "",
  "async_upload": false,
  "block_alphas": "",
  "block_dims": "",
  "block_lr_zero_threshold": "",
  "bucket_no_upscale": true,
  "bucket_reso_steps": 64,
  "bypass_mode": false,
  "cache_latents": true,
  "cache_latents_to_disk": false,
  "caption_dropout_every_n_epochs": 0,
  "caption_dropout_rate": 0,
  "caption_extension": ".txt",
  "clip_skip": 1,
  "color_aug": false,
  "constrain": 0,
  "conv_alpha": 1,
  "conv_block_alphas": "",
  "conv_block_dims": "",
  "conv_dim": 1,
  "dataset_config": "",
  "debiased_estimation_loss": false,
  "decompose_both": false,
  "dim_from_weights": false,
  "dora_wd": false,
  "down_lr_weight": "",
  "dynamo_backend": "no",
  "dynamo_mode": "default",
  "dynamo_use_dynamic": false,
  "dynamo_use_fullgraph": false,
  "enable_bucket": true,
  "epoch": 1,
  "extra_accelerate_launch_args": "",
  "factor": -1,
  "flip_aug": false,
  "fp8_base": false,
  "full_bf16": false,
  "full_fp16": false,
  "gpu_ids": "",
  "gradient_accumulation_steps": 1,
  "gradient_checkpointing": false,
  "huber_c": 0.1,
  "huber_schedule": "snr",
  "huggingface_path_in_repo": "",
  "huggingface_repo_id": "",
  "huggingface_repo_type": "",
  "huggingface_repo_visibility": "",
  "huggingface_token": "",
  "ip_noise_gamma": 0,
  "ip_noise_gamma_random_strength": false,
  "keep_tokens": 0,
  "learning_rate": 0.0001,
  "log_tracker_config": "",
  "log_tracker_name": "",
  "log_with": "",
  "logging_dir": "log",
  "loss_type": "l2",
  "lr_scheduler": "cosine",
  "lr_scheduler_args": "",
  "lr_scheduler_num_cycles": 1,
  "lr_scheduler_power": 1,
  "lr_warmup": 10,
  "main_process_port": 0,
  "masked_loss": false,
  "max_bucket_reso": 2048,
  "max_data_loader_n_workers": 0,
  "max_grad_norm": 1,
  "max_resolution": "512,512",
  "max_timestep": 1000,
  "max_token_length": 75,
  "max_train_epochs": 0,
  "max_train_steps": 400,
  "mem_eff_attn": false,
  "metadata_author": "",
  "metadata_description": "",
  "metadata_license": "",
  "metadata_tags": "",
  "metadata_title": "",
  "mid_lr_weight": "",
  "min_bucket_reso": 256,
  "min_snr_gamma": 0,
  "min_timestep": 0,
  "mixed_precision": "no",
  "model_list": "custom",
  "module_dropout": 0,
  "multi_gpu": false,
  "multires_noise_discount": 0.3,
  "multires_noise_iterations": 0,
  "network_alpha": 1,
  "network_dim": 8,
  "network_dropout": 0,
  "network_weights": "",
  "noise_offset": 0,
  "noise_offset_random_strength": false,
  "noise_offset_type": "Original",
  "num_cpu_threads_per_process": 2,
  "num_machines": 1,
  "num_processes": 1,
  "optimizer": "AdamW",
  "optimizer_args": "",
  "output_dir": "model",
  "output_name": "kakakikikeke",
  "persistent_data_loader_workers": false,
  "pretrained_model_name_or_path": "runwayml/stable-diffusion-v1-5",
  "prior_loss_weight": 1,
  "random_crop": false,
  "rank_dropout": 0,
  "rank_dropout_scale": false,
  "reg_data_dir": "",
  "rescaled": false,
  "resume": "",
  "resume_from_huggingface": "",
  "sample_every_n_epochs": 0,
  "sample_every_n_steps": 0,
  "sample_prompts": "",
  "sample_sampler": "euler_a",
  "save_as_bool": false,
  "save_every_n_epochs": 1,
  "save_every_n_steps": 0,
  "save_last_n_steps": 0,
  "save_last_n_steps_state": 0,
  "save_model_as": "safetensors",
  "save_precision": "float",
  "save_state": false,
  "save_state_on_train_end": false,
  "save_state_to_huggingface": false,
  "scale_v_pred_loss_like_noise_pred": false,
  "scale_weight_norms": 0,
  "sdxl": false,
  "sdxl_cache_text_encoder_outputs": false,
  "sdxl_no_half_vae": false,
  "seed": 0,
  "shuffle_caption": false,
  "stop_text_encoder_training": 0,
  "text_encoder_lr": 0.0001,
  "train_batch_size": 1,
  "train_data_dir": "/Users/kakakikikeke/Downloads/data",
  "train_norm": false,
  "train_on_input": true,
  "training_comment": "",
  "unet_lr": 0.0001,
  "unit": 1,
  "up_lr_weight": "",
  "use_cp": false,
  "use_scalar": false,
  "use_tucker": false,
  "v2": false,
  "v_parameterization": false,
  "v_pred_like_loss": 0,
  "vae": "",
  "vae_batch_size": 0,
  "wandb_api_key": "",
  "wandb_run_name": "",
  "weighted_captions": false,
  "xformers": "none"
}

Stable Diffusion WebUI で生成

あとは sd-webui で生成するだけです
sd-scripts で生成した LoRA を指定しプロンプトで生成します
プロンプトは以下です

realistic, 1boy, solo, male focus, day, teeth, blue eyes, black hair, polka dot shirt, upper body, shirt, smile, portrait, kakakikikeke, simple background	<lora:kakakikikeke:1>

また生成時のパラメータは以下だけいじっています

Sampling method -> Euler a
Sampling steps -> 30
Batch count -> 12

で、できあがった画像が以下

手が3本あったりします

考察

おそらくもっと学習データを増やせばもっと精度が良くなると思います
学習させたデータが同じ向きしかないのともともと画像がかなり荒いので生成される画像も少しかけ離れた感じになってしまいます
学習させたデータが上半身しかないのでそれも微妙だった気がします、できれば全身のいろいろな角度の写真が望ましかったかもしれません

また LoRA 学習時のタグ生成ももう少し工夫すればプロンプトにうまく反映できるようになるのかなと思います

あとはプロンプトでリアルな人間を生成する感じのプロンプトを付与すればもっとリアルな感じになるのかなと思います

(masterpiece,best quality:1.4),(8k,raw photo,photo realistic:1.2)

ベースのモデルをデフォルトのやつではなく日本人の顔に特化したモデルに変更してももっと良い結果になるかもしれません

最後に

たった一枚の写真でもここまで生成に反映できるとは思いませんでした
現在の年齢の写真や幼少期の写真も学習させれば生まれてから現在はたまた未来の自分までの画像が作成できるかもしれません

今回環境が M2 mac mini だったので学習させる画像の量に限界があるのがネックです
もし大量の画像を学習させていろんなバリデーションの自分を出力できるようにするのであればそれなりのスペックのマシンか Google Colab あたりで動作させる必要があるかもです

2024年5月10日金曜日

AI kakakikikeke に Tomorrow never knows を歌わせてみた

AI kakakikikeke に Tomorrow never knows を歌わせてみた

今流行りの AI による歌を自分で作成してみました

できたもの

うぉっおーの高音部分が出てないところがまたリアル

環境

  • macOS 14.4.1 (M2Pro Mac mini)
  • Python 3.9.18
  • RVC WebUI (updated1006v2)

作り方

流れは以下の感じです

  1. 自分の音声モデルの作成
  2. 音源のBGMと声の分割
  3. 分割した声のファイルと音声モデルを使って推論
  4. BGMと推論により作成された音源ファイルを合成

です
なお使用したツールは RVC と Audacity になります

自分の音声モデルの作成

自分の声はこれまで Podcast でしこたま録音しているのでそれを使いました
たくさんあったほうがいいのですが 20 分くらいあれば十分っぽいのでこれを使いました

これを使って RVC の Train 機能を使って音声モデルを作成するだけです
モデルを生成する際はいろいろとチューニング可能なのでそれによっても歌い方がだいぶ変わってきます

harvest は品質が良くなりますがかなり学習に時間がかかります

音源のBGMと声の分割

今回は Mr.Children さんの Tomorrow never knows を音源として使わせていただきます
特に理由はないですがただただ好きなだけです
あとは男性の音声モデルの場合は男性の音源を使うほうが精度が良いかなと思ったので男性ボーカルの歌を選択しました

分割した声のファイルと音声モデルを使って推論

音声モデルファイルは pytorch 形式で出力されます
このモデルを使って分割したボーカルのみのファイルに自分の声とボイスチェンジを行うのが推論になります

推論が完成するとボーカルが自分の声になったバージョンの Tommorrow never knows が完成します

ここでも harvest は品質が良くなりますがかなり推論に時間がかかります
今回は crape を使っています (一番良さそうだったので

また途中 BGM を歌っている部分があったのでそこもカットしています

合成する

あとは分割した BGM 部分と自分の声になったボーカルファイルを合成するだけです
これは RVC ではなく普通の DTM ソフトを使います
自分は Audacity を使いました

最後に

高音部分を学習させてあげれば更によくなるかもです

これで僕が死んでからも音声モデルさえ残しておけば僕の声を聞くことができるようになりました
M2 Mac mini を購入してから AI 関連の高負荷処理も簡単にさばけるようになったので AI 関連の作業が楽ちんです

参考サイト

2024年3月3日日曜日

iPhone14 デビュー

iPhone14 デビュー

前回の iPhoneXR から 1698 日 (4年と238日) 経過して iPhone14 に乗り換えました
久しぶりに良いかものだったかなと

料金

中古で 82980 円

  • ポイントで 16038 + 5,808 使用
  • 支払い金額は 61134 円

バッテリー残量

  • 100%

まさかの 100% でした (ラッキー
ちなみに iPhoneXR 時代はバッテリーを 1 回だけ換装しています
というか外観もほぼ傷なしで間違って新品を送ってしまったのではないかと勘違いする感じでした

スペック

  • iPhone14 Midnight 128GB
    • Model A2881
    • SIMフリー

付属品

当然全部なしです (箱、充電ケーブル、説明書

あとは個別にフィルムだけ購入しています

引き継ぎについて

  • 基本は iPhone の引き継ぎをすれば OK (モワモワを撮影するやつ
    • iCloud 経由ではなく直接転送
    • 設定は基本全部デフォルト
    • iOS も最新にアップデート
    • Apple Pay、エクスプレスカードやデフォルトの支払いが変わっている可能性がある
    • Apple ID
    • オートメーションやスイッチコントロール、Music 内の音楽も引き継いでくれる
  • 各種アプリのログインし直し
    • 引き継ぎが個別で必要なアプリは別途やる必要あり
    • また設定が引き継がれないアプリもあるので
  • SIM カード入れ替え
    • mineo の APN は引き継がれる模様
    • 引き継ぎ作業が終わってからでも OK
  • 引き継ぎ後の iPhoneXR は速攻ファクトリリセットした

ネットワークの関係もあるので全部含めて 1 時間くらいはかかりました
アプリのインストールは引き継ぎ後一気に行われるので Wifi 配下でやりましょう (モバイル通信だとあっという間に上限にいくはず

所感

  • XR より軽い
  • XR よりサクサク
  • 気分が上がる
  • A15 bionic は iPhone13 も使っているのでそっちの性能も気になる

最後に

やはり iPhone の寿命は 5 年なのだろうか

2024年2月19日月曜日

M2Pro mac mini お掃除

M2Pro mac mini お掃除

購入 から半年以上経過したのでお掃除しました

道具

  • トルクドライバー
  • プラスチックヘラ

ほこりはエアダスターで飛ばすか拭き取るか掃除機を使いましょう

底盤を開ける

ヘラを入れて一周するだけです

更にアルミの底盤を外す

ネジが六ヶ所あります
写真では掃除後ですがここだけでもかなり汚かったです

アルミの底盤を外すときの注意

Wifi モジュールのケーブルが繋がっているのでヘラとトルクネジを使って外しましょう
いきなり底盤を外そうとするとケーブルが切れる可能性があるので注意してください

アルミ盤の裏

こっちも汚れているのでお掃除しましょう

底盤開けた後

汚いです

ファンを外す

かなり汚れています
トルクドライバーで4箇所のネジを外します

ファンを外すときの注意

ファンの動力のケーブルが繋がっているのでヘラを使って外しましょう
引っ掛けて上にパキっと外す感じです
iPhone のコネクタっぽい感じです

エアダスターで掃除

もっと解体できますがエアダスターがあればここまででも十分かなと思います
エアダスターで万全なく掃除しましょう
ほこりが舞うので掃除機で吸うなり換気のいい場所でやるなりしてください

ファンは解体できなかった

ファンにもプラスネジがありこれを外せば蓋を外せるかなと思ったのですが固くて外せませんでした
これもエアダスターを吹きかけて掃除しましょう
かなりほこりが出てくるので注意してください

あとは戻すだけ

各種掃除したらファン -> アルミ -> 底盤で戻します
各種コネクタの取り忘れに注意しましょう

最後に

毎日 CPU フル回転だと半年ごとくらいにこれくらいの掃除はしないと大変なことになりそうな気がします

2024年2月15日木曜日

iOS 版スイカゲームプレイメモ

iOS 版スイカゲームプレイメモ

おもしろい

料金

  • 240円

最高点

  • 3117点

プレイできた端末

  • iPhoneXR (iOS 17.2.1)
  • iPhone6 (iOS 12.5.7)
  • iPad min 2 (iOS 12.5.7)

という感じでまだまだ古い端末でも全然プレイできました
これがスイカゲームの一番良いところかもしれない

ただなぜか iPad mini 2 だけゲーム終了時に確実にクラッシュするという現象が発生したのが残念な点

コツ

  • とにかくゴミを出さない
  • 大きいのは下
  • 段差を使った時間差落下を使う (あとに落としたフルーツが先に落下する技術?
  • 連鎖も少し考えるといいかも
  • あとはとにかくやるだけ楽しいから全然飽きない

よかった点

  • iOS12 のサポートがある
  • 一応オフライン状態でもできる
  • 子供も楽しめる
  • クセになる

最後に

スイカを 2 つ作るのはマジで無理ゲー

2024年2月4日日曜日

最近の LLM 界隈について感じたこと

最近の LLM 界隈について感じたこと

Stable diffusion などの画像生成系については触れてないです
個人的な意見です

LLM

  • すべての機械学習の中心に LLM がいる

Fine Tuning と LLM

  • 今は1から LLM を作る時代ではない
  • GPT2 なりを Fine Tuning して独自の LLM を構築するのが主流 (というかクソ簡単だから
  • ニューラルネットワーク、深層学習、keras、tensorflow、torch などを学ばなくても自作の LLM が作れる
  • それにより HuggingFace や GPTs などに大量に独自 LLM が発生している
  • そもそもベースとなる LLM を変えるだけでもいろいろと精度は変わりそう

Transformer

  • 公開されているさまざまな LLM をローカルで簡単に動かすことができるツール
  • これができたことにより Fine Tuning がより簡単にできるようになると理解
  • 簡単 LLM 作成時代に突入するきっかけになった基礎技術

LangChain

  • LLM に質問するだけだったものに質問の仕方を工夫することで Fine Turning しないでも独自の知識を持ったかのように LLM に回答されることができるようになるツール
  • 例えばローカルで文章の類似度検索した結果を元に LLM にコンテキスト付きの質問をすることができる (Retrieval Chain と呼ばれる手法
  • Retrieval Chain に限って言えば頑張るべきは類似度検索の精度/再現率になるので FAISS や ChromaDB のチューニング勝負になりそう
  • FAISS や ChromaDB を使いこなす必要があるということ
  • Fine Tuning とどっちがいい精度になるのかは不明
  • そもそもベースとなる LLM を変えるだけでもいろいろと精度は変わりそう (Fine Tuning 同様
  • Agent はあくまでも LLM を環境としてフィードバックループを繰り返す技術 (っぽい
  • これが LLM + 特定の環境 (ゲームなど) にもフィードバックできるようになると便利そう (もうあるかも、参考

Classical Machine Learning

  • すべて LLM で解決できるのかもしれない
  • 二値判定、多値判定、クラスタリング、分類器などは LLM に質問するだけで処理してくれる

強化学習

  • LLM と組み合わせて使うようになるのかもしれない (上記強化学習同様
  • サンプル効率問題、次の行動の判断を LLM に任せる場合に何回尋ねるべきか、その場合のラグはどうなるのか (一応解決策があるらしいが
  • 環境(主にゲーム)がすぐにフィードバックして画面で確認できるので楽しさはある
  • プログラミングの導入でマイクラを使うように機械学習の導入でカートポールを使うのはどうだろうか

検索との使い分け

  • 結局どっちを信じるかではある
  • どちらも間違っている想定で最終的には自分で検証するのが一番
  • どちらも問題を解決するためのアプローチでしかないと思うが LLM は Agent 化して解決までやってくれる可能性はある

何かあったら追記するかも

2024年1月19日金曜日

居住証明書を発行する方法

居住証明書を発行する方法

Adsense で必要になるので

申請書の作成

https://www.nta.go.jp/taxes/shiraberu/taxanswer/osirase/data/pdf/kyojyusya_shoumei_02_input.pdf

これを使って作成します
pdf ですが入力できるので入力したら保存して適当にプリントアウトします
1枚の居住証明書を取得するのに申請書はなぜか2枚必要なので同じものを2枚プリントしましょう

日本語表記と英語表記が必要な箇所があるので注意しましょう
記載方法は適当にググればできるので割愛します

Chrome で入力するとプリント時にうまく出力されないことがあったので Firefox で入力するのをおすすめします

とにかく同じ申請書を2枚用意しましょう

Adsense の場合アメリカ用ではなくシンガポール用が必要っぽい

アメリカ用に取得して Adsense のフォームから何度も居住証明書を提出したのですが絶対「要ご対応: AdSense お支払いアカウントをご確認ください」という連絡が来ました

詳細

いろいろ調べるとこちらのサイトにたどり着きました
どうもシンガポール用の居住証明書が必要ということが判明したのでシンガポール用にも居住証明書を申請したほうが良いかなと思います

その辺り何が間違っているのかを教えてくれないのがかなり不親切なところです

管轄の税務署に行く

住んでる地域によって税務署が変わるので注意しましょう
ここで郵便番号を入れるとわかります

提出する

作成した申請書2枚と身分証明書 (マイナンバーカード or 免許証) が必要になります
あとは窓口で提出するだけです

住民票の写しが必要かも

なぜか2回目の申請では住民票の写し or 源泉徴収のコピーが必要だと言われたのでコンビニでマイナンバーカードを使って住民票の写しを発行して申請しました

ちなみにコンビニで住民票の写しを発行した場合は 200 円必要です

すぐにはもらえない

だいたい一週間くらいかかるようです
完成すると申請書に記載の電話番号に電話が来るようなので待ちます
あとは電話がきたら受け取りにいくだけです

料金

  • 証明書の発行 -> たぶん無料
  • 申請書のプリント代 -> 20円 x 2 (自宅のプリンタなら無料、20円はネットプリント代
  • 交通費 -> 税務署行くまでにかかる料金
  • 住民票の写し -> 200円

Adsense に提出

発行された証明書を適当に電子化してアップロードすれば OK です
いつからかこんな面倒な感じになったようです

その他

  • 申請書は郵送でも受け付けてくれます
  • 居住証明書をアップロードしていない場合に Adsense は「AdSense お支払いアカウントをご確認ください」というエラーが出るようですがこのエラーが発生してる状態でもなぜか報酬が振り込まれました (もしかすると居住証明書は不要なのかも