機械学習するためのデータを作成するツールをJunieに作ってもらう
結局機械学習が必要だよねーってところに行きついた。
なので、先に必要な学習を行うためのツールをJunie作ってもらうことにする。
プロンプト履歴
$ gitの初期化
初期化と同時に.gitignoreも作ってくれたけど、Java向きの設定が多かったので不要な設定を手動で削除
$ 初期コミットを実行。コミットログは initial commit
$ READMEを作成。ガイドラインとして、コミットログは日本語で書くこと、ファイルの末尾に空行を追加すること、改行コードは\nであること、文字コードはUTF-8であることを追加。
$ ここまでの変更をコミット。コミットログは日本語で書く
手動でどんなプロジェクトかをREADMEに書いていく
どんなツールを作るかだけにとどめ、詳細までは書き込んでいない
$ README.mdに概要を追加したので、誤字脱字を修正し、読みやすいように見出しを付ける
$ ここまでの変更をコミット。コミットログは日本語で書く
$ pythonプロジェクトの初期化。このプロジェクトでは2つのツールを作成する予定で、実行するためのファイルを2つ用意し、共通で使えるプログラムは共通で使うことを想定している。ツールによってはGUIが必要になり、文字認識、物体検出などの機械学習を利用した画像処理を行なうことも想定している
最初に比べてどんどん命令が長くなってきてる気がする
言いたいこと全部詰め込んだ命令を投げてもいい感じに解釈してくれるのがJunieの良いところでありながら、人間相手でのコミュニケーションが下手になりそうで怖い笑
命令して放置して戻ってみたら、訓練データを作るdata_creater.pyと、訓練するtainer.pyが作られてた。この命令でそこまでやってくれるん?!
READMEに従って動かしてみる
$ pip install -r requirements.txt
$ pip install -e .
$ python data_creator.py
https://scrapbox.io/files/67ef68925f09d670e8dd9902.png
https://scrapbox.io/files/67ef68d88f20ecf9d60cfe93.png
動画は読み込めるけど、ここで学習データを作れる機能はなさそう
$ python trainer.py --help
設定などを読み込んで訓練してくれそう?中身は試せない
プロジェクトの初期化としては十分すぎる!
$ ここまでの変更をコミット。コミットログは日本語で書く
$ README含め、機械学習の学習を意味している単語を訓練に統一する
$ ここまでの変更をコミット。コミットログは日本語で書く
$ 訓練データ作成ツールでmkv形式の動画ファイルも受け入れられるよう修正
$ ここまでの変更をコミット。コミットログは日本語で書く
手動でサーモンランの情報を追加
$ READMEにサーモンランについての情報を追加。誤字脱字を修正し、読みやすいように見出しを付けて分類する
$ ここまでの変更をコミット。コミットログは日本語で書く
$ 訓練データ作成ツールでは動画の画像からどのシーンなのかを判定し、何の情報を集める必要があるかを判断する必要がある。そのためREADMEにシーンの一覧と、集める必要のある情報を明記した。誤字脱字を修正し、見やすいように位置の調整を行う。
$ ここまでの変更をコミット。コミットログを日本語で書く。
$ 訓練データ作成ツールに、シーン判定機能を実装する。シーンの判定は動画から抜き出した画像をニューラルネットワークに渡して分類判定を行う。ニューラルネットワークのモデルは問わない。誤った判定を行なった場合は訓練させたいため、正しいシーンを選択し、訓練データとして画像と正答を出力できるようにする。出力する訓練データの形は、採用するモデルで使用可能なフォーマットにする。
長々と書いたけど、シーンを判定するためにニューラルネットワークに画像を叩きこんで判定したいぜ、判定できなかった時のために訓練データを吐き出すための機能が欲しいぜ。って内容
$ 実行時にwarningが出る
$ シーンの種類はいまのまま、selectbox内は日本語で表示するよう変更
$ 訓練データ保存時のアラートウィンドウを表示しないよう変更
https://scrapbox.io/files/67eff181bbdf12cafb0e10e4.png
すごい!訓練データの出力まで出来てる
$ ここまでの変更をコミット。コミットログは日本語で書く
$ dataディレクトリに.gitkeepを追加。.gitignoreに、data配下の.gitkeep以外のファイルを除外する設定を追加。
$ ここまでの変更をコミット。コミットログは日本語で書く。
$ data_creator/main.pyのself.scene_classes_jaを元に、READMEのサーモンランの流れを書き直す。self.scene_classes_jaと合わせることで、各シーンでやることを明確にする。
$ ここまでの変更をコミット。コミットログを日本語で書く
$ 訓練データ作成ツールで、フレームを前後するボタンを下記フレーム数で作る。1, 5, 30, 100, 300, 1000。また、進むだけじゃなく戻るボタンも用意する。PreviousやNext、Framesという表現だと幅を取るので、←と→で表現する。
$ ここまでの変更をコミットする。コミットログは日本語で書く
$ 訓練データ作成ツールと訓練データで共通でニューラルネットワークのモデルを扱いたいので、dataの適切な位置に作成するようにする
$ ここまでの変更をコミット。コミットログは日本語で書く
訓練データ作成ツールでシーンの判定のための訓練データを作る
$ 訓練ツールの各パラメータとデフォルト値、省略可能かなどをREADMEに追加する。
$ ここまでの変更をコミット。コミットログは日本語で書く。
$ 訓練ツールにdata/sceneのデータを使ってニューラルネットワークの訓練を行う機能を追加する。すでにその機能があった場合は何もしない。
test runでモデルデータが作られたし、このままモデルを使って再度各シーンの判定を試す。
ある程度精度があがるまで何度か繰り返す。
一回使ったデータは消してもいいかも。ゲームのプレイデータが元になっているためデータはいくらでも作れるから。
$ ここまでの変更を反映。コミットログは日本語で書く
$ 訓練ツールが訓練で使用したデータは使用済みディレクトリに移し、再利用しないようにする。ただし再利用したい場合に再利用できるように、パラメータで変更できるようにする。
$ 訓練で使用したデータを使用済みディレクトリに移動するのはデフォルトでtrueにする
$ python trainer.py でエラーが発生。
$ 使用済みデータを訓練に含めるはデフォルトでfalse
$ python trainer.py を実行したが、訓練データが使用済みディレクトリに移動されなかった。パラメータを指定しなかった場合はデフォルト値が採用され、訓練データが使用済みディレクトリに移動するよう変更する
$ python trainer.py 実行時にエラーが発生。
$ python trainer.py を実行したところ、使用済みの訓練データが利用された。パラメータを付けなければ、デフォルトで使用済みの訓練データを使わないようにする。
$ data/used ディレクトリは入れ子にしない。使用済みデータを再度使用したとしても、data/used/usedには移動しない
$ data/models のデータは訓練データではないので使用済みでもdata/usedに移動しない。
$ python trainer.py 実行時にエラーが発生
$ data/modelsが誤って訓練データとして扱われることがあるので、modelsをプロジェクトディレクトリ直下に移動する。各プログラムはプロジェクトディレクトリ直下にあるmodelsディレクトリを参照するようにする。
$ python trainer.py を実行すると、used 配下の使用済み訓練データも参照しようとしている。使用済み訓練データはパラメータで指定されず、configでも設定されていない場合は、デフォルトで再利用しないようにする
何かを変更するとこれが再発する
$ 訓練ツールで、使用済みの訓練データを退避する処理と、使用済みの訓練データを再利用する処理をオミットする。何度も訓練済みデータの扱いでエラーが発生するので、訓練ツールから訓練済みのデータという扱いをやめる。
$ 訓練ツールから、configファイルの読み込み機能をオミットする。設定が複数個所から流れるため、設定の優先順位が分からなくなり、正しく動作しないケースがみられたため。
$ 訓練ツールのパラメータをREADMEに反映する。現在のREADMEにオミットされて不要になった情報が含まれているならその情報は削除する。
$ trainer.py を実行するとエラーが発生
$ モデルの読み込み先、作成先が./modelsに変わっているので、それに合わせて作成するかの判断処理も変更。シーン判定のモデルはシーン判定のモデルだと分かる名前に変更する
$ 訓練ツールのmodel_nameのパラメータを削除する。訓練ツールと訓練データ作成ツールで同じmodelファイルを読み書きできるよう固定化する
$ 訓練ツールで訓練データを使って訓練を始める際に、すでにモデルファイルが存在した場合はそのモデルファイルを使うようにする
$ python trainer.py で warning が発生
$ models/scene_judgment_model.pt を .gitignoreに追加
$ ここまでの変更をコミット。コミットログは日本語で書く
細かいシーンの追加
やられた
水没
WORKS OVER
評価の変動
$ READMEにいくつかのシーンを追加したので、READMEを整形。追加されたシーンを訓練データ作成ツールにも追加する
$ 訓練データ作成ツールで表示する動画のフレームを変更した際に、再度シーンの判定をするようにする
$ ここまでの変更をコミット。コミットログは日本語で書く
$ 訓練データ作成ツールにおいて、シーンの選択を動画の画像表示部分よりも上にもってくる
細かいシーンの調整
ステージ紹介を追加
メンバー紹介を追加
ジョブ開始を削除
$ READMEのシーンの一覧を修正したので、これを整形する。同時に、訓練データ作成ツールのシーンの一覧も修正する
$ ここまでの変更をコミット。コミットログは日本語で書く
$ 訓練データ作成ツールで、シーンをselectboxから選択して更新するのではなく、シーンのボタンを並べ、ボタンが押されたらそのシーンに更新するよう変更
$ シーンのボタンの幅を、一番大きなボタンの幅に統一する
$ ここまでの変更をコミット。コミットログは日本語で書く
$ 訓練データ作成ツールで、シーンボタンを押下すると同時に訓練データを出力するよう変更
$ 訓練データ作成ツールでシーン用の訓練データを保存する際に、シーンごとのディレクトリに保存するのではなく、シーンディレクトリ直下に保存するよう変更
$ 訓練データ作成ツールで、シーン用の訓練データを保存する際には、ファイル名を{開いている動画のファイル名}_{フレーム番号}の形式で作成する。
誤ったシーンを選択した後に正しいシーンを選択しても、別のファイル名で保存されているせいで上書きできず、誤ったデータが残り続けるのを回避する目的
$ ここまでの変更をコミット。コミットログは日本語で書く
$ 訓練データ作成ツールでフレーム移動ボタンを押した際に、1フレーム目より前にも行かず、最後のフレームより後にも行かないよう修正。最小より前に行こうとすると最小で止まり、最大より後に行こうとすると最大で止まるようにする
$ ここまでの変更をコミット。コミットログは日本語で書く
$ 訓練ツールで作成したモデルを使い、訓練データ作成ツールで動画の判定をしたところ、どの画像を読み込んでも「ロード中 Confidence: 91.7%」と表示される。現在選択中のフレームではなく、別の画像を与えている可能性があるので、選択中で表示されている画像が判定に使われているかを確認し、判定に使われていない場合は使われるように修正する。
結果変わらず
$ 変わらずどのフレームを読み込んでも「ロード中 Confidence: 91.7%」が表示されるので、この変更は正しくない。変更を戻す。
$ 訓練データ作成ツールでは現在のフレームをノーマライズなど通さずにそのまま出力しており、訓練ツールではその画像を使って訓練を行なっている。訓練データ作成ツールで訓練ツールが作ったモデルを利用する場合、ノーマライズなどをしていない画像で判定を行う必要があるのではないか?判定前に行なっている画像自体への変更をやめる
$ この変更を行うと、どのフレームもロード中 100%になったので正しく判定できていない。この変更を戻す
これでも正しくないとなると、訓練時と利用時で違うことをしているとしか思えない。
$ scene_judgment_model.pt を使ったシーンの判定について、訓練時と判定時で違うロジックを使っている可能性がある。訓練ツールで訓練したモデルを作成した後、訓練作成ツールでscene_judgment_model.ptを利用してシーンを判定しても、全てのフレームでロード中が選択される。訓練データ作成ツールと訓練ツールは同じモデルを使って同じ画像を読み込めば同じ結果が得られるように作る
どこに問題があるか分からないので、とりあえず処理を揃えてねーって命令を投げてみる
何らかの修正が入ったので、出力されていたモデルファイルを削除し、再度訓練を実行
訓練データ作成ツールを起動して動画を読み込んだらエラー発生
$ 訓練データ作成ツールで動画を読み込んだらエラーが発生した
再度訓練データ作成ツールで試したけど、ロード中が100%にしかならず、判定が正しく動作しない
$ 訓練データ作成ツールのscene_classesは訓練ツールでも使うため、共通のファイルにだす。訓練ツールでシーン判定の訓練を行う際には、scene_classesのどれに当てはまるかを訓練する
$ ここまでの変更をコミット。コミットログは日本語で書く。
$ シーンの判定はscene_classesのどれが何%の確率かで行なう。訓練ツールでは、各シーンの確率が何%かを訓練し、訓練データ作成ツールでは一番確率が高いシーンが判定されるようにする
訓練データ作成ツールで結果を確認すると、クラス判定を返すような内容になっていなかった
訓練ツールでクラス判定ができるモデルを作るよう修正を加えていく
$ 訓練ツールでシーン判定を訓練する際には、scene_classesにクラス分類できるようにする。data/scenes/*.jsonのscene_classが同名画像ファイルの正答になる。シーン判定のモデルで判定を行なえば、scene_classesの各シーンに何%で合致するかが返されるよう実装する。
データ作成ツールではできてるので、訓練ツールでできてない。
モデルが数値だけを返す作りになっている
$ 訓練ツールでも訓練データ作成ツールと同じように、シーン判定モデルを作る際にはscene_classesの各シーンが何%かを判定するよう訓練させられる実装にする。
$ git reset --hard HEAD
あれこれ修正が重なって修正ループに入ったので、一回reset
雑に命令を投げるのではなく、こうなってほしいってのをまとめてから順番に命令を投げることにする
シーンの一覧を共通化
訓練ツールでは、シーンの判定において入力は画像で出力は各シーンの合致率であることを明記
訓練データ作成ツールでは、画像ファイル名と各シーンの確率 = 目的のシーンが100%でそれ以外が0%のデータを作る
訓練データ作成ツールが作ったシーン訓練データで訓練するようにする
以上のことを満たせば、訓練ツールが作ったモデルを訓練データ作成ツールで使える気がする
$ 訓練データ作成ツールは、シーンを判定するためのモデルを訓練させるデータを作成できる必要がある。訓練データを保存する際には、表示してる画像と正答の情報を含んだjsonファイルを同時に出力する。正答はscene_classesのシーンに合致するかどうかを出力する。キーはscene_class名で、値は保存時に選択されたシーンが1で、それ以外のシーンは0で出力する。
訓練データをどういうフォーマットで出せばいいか分からなかったのでJunieにまかせっきりにしてたけど、それだと正しく認識されないことが分かったので、人間もJunieも理解しやすいフォーマットを定義することにする。
他の訓練システムに流用することは出来ないと思うが、自ツール間で整合性が取れていればOK
$ ここまでの変更をコミットする。コミットログは日本語で書く。
$ 訓練ツールが出力するシーン判定モデルは、入力は画像、出力はscene_classesのどのシーンがどの程度合致するかを0から1の数値で出力する。0番目の出力はscene_classesの0番目の要素にどの程度合致するかということ。つまり、出力層から出力される数値の数はscene_classesの数と一致するようにする。訓練データの詳細はdata/scenes内のjsonファイルにあり、scene_classesが正答となる。
訓練ツールが作るモデルの入力と出力の形式を定義して、学習時に訓練データの読み方を定義
訓練データを作って、訓練をするけど、出力が1つになっている。周辺の知識を集める
どうしても訓練データ作成と訓練で同じモデルが作られないようなので、シーン判定関連の処理や設定をひとつのファイルでまとめ、共通プログラムを使うことで仕様の齟齬が起きないようにしたいってことで、プログラムの整理からやり直す
$ シーン判定とそのニューラルネットワークに関連する処理をまとめたプログラムを作る。scene_classesなどのシーンの情報、訓練データ作成ツールの出力するシーンの訓練データの情報、シーン判定ニューラルネットワークの入力層の数や出力層の数などの設定といった、シーン判定とそのニューラルネットワークに関連するものをまとめる。
$ ここまでの変更をコミット。コミットログを日本語で書く。
$ commonディレクトリ内の使われていない関数を削除してリファクタリング
モデルの読み込みや初期化が一か所でされているかをIDEで辿りやすくなる
$ ここまでの変更をコミット。コミットログを日本語で書く。
$ 訓練データ作成ツール、訓練ツールにおいて、シーン判定モデルの読み込み・書き込みを行なっている処理は、scene_utils.pyのシーン判定モデルの読み込み・書き込みを行なっている処理を利用するようにする。また、シーン判定モデルの初期化処理もscene_utils.pyのシーン判定モデルの初期化処理を利用するようにする
$ 訓練ツールのシーン判定モデルのTrainer classにある_create_modelで独自のデフォルトモデルを作っているが、scene_utils.pyの関数を使ってモデルを作るようにする
$ 訓練ツールでモデルを作成する際に、条件によっては出力が1つになっているが、シーンのクラス分類が必要なので、出力はシーン数になるようにする。
これが原因だあああああああ
https://scrapbox.io/files/67f15c08a6107075fb0b5706.png
9割以上の判定ができるようになった!ここまで長かったー!
$ ここまでの変更をコミット。コミットログは日本語で書く
まだまだ訓練データを作らないとシーンの判定は不確定なところもあるものの、機能としてはできた
ここから各シーンで取得できる情報の訓練データを作り、訓練していくことになる
$ READMEにサーモンランのステージを追加したので、読みやすく整形する
$ シーン用のutilプログラム同様に、ステージ判定用のutilプログラムを作る。分類はREADMEに書いてあるステージを参考に、通常ステージとビッグランステージを分けずに分類クラスとして扱う
$ ここまでの変更をコミットする。コミットログは日本語で書く
$ data_utilsのcreate_scene_annotationはscene_utilsへ、create_stage_annotationはstage_utilsへ移す
$ data_utils.py で使われていない関数を削除し、整理する
$ ここまでの変更をコミットする。コミットログは日本語で書く
$ 訓練データ作成ツールに、ステージ判定用の訓練データを作成する機能を追加する。現在のシーンの判定、動画の画面、フレームの変更UIは全体の左側によせ、シーン毎に表示するかが変わるものは右側に表示する。ステージ判定のUIはステージ紹介のシーンでのみ表示するので、全体の右側に追加する。ステージの一覧はシーンの一覧と同じくボタンで表示する。
ステージ紹介のシーンでのみ行なう、ステージ判定の訓練データ作成UIを追加する
全体の右側はシーンと動画の情報にし、それ以外の情報は画面の右側に集めるようなUIにする
判定する項目がおおいなら、右側にタブのような仕組みを追加する必要がありそうだが、それは項目が増えてから考える
$ 訓練データ作成ツールの左半分の項目を全体の6割の横幅になるように設定し、右側に残りの項目を表示するようにする
$ 訓練データ作成ツールで、Save as Traning Dataは必要ないので削除
$ 訓練データ作成ツールで、シーンの各ボタンにそのシーンの確率を表示するようにする
$ 訓練データ作成ツールで、最大の確率のシーンを上部に表示されているのを消し、Correct Sceneの見出しを削除。各シーンのボタンと確率は中央寄せにし、各ボタンの大きさを少し小さくする
$ ここまでの変更をコミット。コミットログは日本語で書く
$ 訓練データ作成ツールで、ステージ判定用のボタンや表示について、シーン判定用のボタンや表示にそろえる。各ステージの確率を表示し、一番確率の高い表示を非表示にし、Correct Stageの表示を非表示にする
$ ここまでの変更をコミット。コミットログを日本語で書く。
$ 訓練データ作成ツール起動時に判定モデルの読み込みを行なうが、対象となる判定モデルのファイルが見つからなかった場合、初期化と同時にモデルファイルを作り、保存するようにする
$ ここまでの変更をコミット。コミットログは日本語で書く
$ 訓練ツールでステージ判定の訓練をできるようにする。stage_utilsをなるべく使い、訓練機能を実装する。
$ READMEの訓練ツールのパラメータに現在のプログラムの設定を反映する
$ 訓練ツールのtraining_typeはデフォルトでallにし、allならsceneとstageの両方の訓練を行なうようにする。またtraining_typeをscene,stageのように複数指定することで、該当の訓練をできるようにする。
$ ここまでの変更をコミット。コミットログを日本語で書く
$ シーンに移動を追加したので、シーン判定のクラスに追加する
$ シーンを追加する際にインデックスがずれるので、シーンのクラスとニューラルネットワークでの出力順番インデックスを管理するためのディクショナリを追加する
$ ここまでの変更をコミット。コミットは日本語で書く
$ シーン分類に追加したようにステージ分類でもクラスとインデックスのマッピングを追加する
$ ここまでの変更をコミット。コミットログは日本語で書く
$ 訓練データ作成ツールでシーンやステージの分類を行なう際に、インデックスのマッピングを利用すべき場所があれば利用する。利用すべき場所がなければ今のまま変更しない
場合によっては変更しないという命令を投げてみるテスト
これで期待通り動くなら、問題あるか分からないけどこうしてほしいって命令が投げれてめっちゃ楽になる
$ ここまでの変更をコミット。コミットログは日本語で書く
$ scene_utilsを参考に、オカシラ判定utilsを実装する。訓練データ作成ツールでは、オカシラ判定はボス登場シーンで行なう
$ オカシラの判定では、シーンの中でも判定できるだけの情報が集まるまで少し時間がかかることから、判定結果に不明を追加する。
$ 訓練データ作成ツールのオカシラ判定の選択肢に不明を追加する。特定の数値以下なら不明にすると、明示的に不明であることを選択できない。
$ 訓練データ作成ツールで、オカシラ判定のボタンに確率が表示されていないのを修正する。
$ 訓練データ作成ツールの右側のボタンが小さくて操作しづらいので、右側のボタンも押しやすい最低限のボタン幅を確保するように修正する。
$ ここまでの変更をコミットする。コミットログは日本語で書く
$ シーンの判定クラス、ステージの判定クラス、オカシラの判定クラスについて、特定のシーンが削除された場合でも動作するようにインデックスを付けたが、これによって総クラス数とインデックスが一致しなくなり、後半のクラスに確率が表示されなくなった。クラス数は最大のインデックスを参考にするか、別の変数に値を持つように修正する。
$ ここまでの変更をコミット。コミットログは日本語で書く
$ READMEのシーンの一覧に"エモート"を追加したので、訓練データ作成ツールで追加したシーンを選択可能にする。
$ scene_class_to_indexに "emote" を追加する際にindexの番号をずらすと、これまでのシーンの判定の結果がずれることになるので、新しいシーンはindexの末尾に着けるようにする
$ ここまでの変更をコミット。コミットログは日本語で書く
$ シーンを追加したら結局モデルを作り直す必要があるため、indexを管理する必要がないことが分かった。各utilsのindexのマッピングを削除し、indexに依存している処理を全てclassesに依存するように修正する
$ ここまでの変更をコミットする。コミットログは日本語で書く
$ 訓練データ作成ツールで画像ファイルを保存する際に、ファイル名のマルチバイト文字列が文字化けするのを修正する。
$ cv2.imwrite に日本語をいれるとUTF-8でファイル名の保存ができないので、pythonのファイル操作でファイルを保存するようにする
$ ここまでの変更をコミットする。コミットログは日本語で書く
$ 訓練データ作成ツールで、WASDのキー入力でフレームを切り替える機能を実装する。フレームのスキップ量はボタンの数値と同じ種類で、Wでより多い移動量、Sでより少ない移動量に変更でき、Aで選択している移動量だけ前のフレームに、Dで選択している移動量だけ後のフレームに移動する。現在の移動量はフレーム移動ボタンの上か下かに表示を追加する
マウス操作だけで大量のフレームを処理するのは大変だったので、キーボード操作でもフレームの移動ができるようにしたい
$ 訓練ツールにオカシラ判定のロジックを追加する。シーン判定や、ステージ判定と同様のつくりにし、training_typeでの動作設定も可能にする。
$ ここまでの変更をコミット。コミットログは日本語で書く
$ 訓練データ作成ツールで、オカシラ判定の確率がボタンに正しく表示されていないのを修正する。シーンでボス登場が選択された場合に、その時表示されているフレームでオカシラ判定処理を行ない、その結果をオカシラ判定のボタンに反映する。
$ ここまでの変更をコミット。コミットログは日本語で書く
$ 訓練データ作成ツールのフレーム選択ボタンを削除し、移動するフレーム数をselectboxで選択できるようにし、selectboxの左に←ボタン、右に→ボタンを配置し、←ボタンを押されたらselectboxで選択されたフレーム数分前に戻り、→ボタンを押されたらselectboxで選択されたフレーム数分先に進む。Wキーでselectboxの上の選択肢に移り、Sキーでselectboxの下の選択肢に移る。Randomボタンは削除せずに残す。
$ ここまでの変更をコミット。コミットログは日本語で書く
$ シーン判定を参考に、ブキ判定のためのutilファイルを作る。
$ 訓練データ作成ツールにブキ判定の機能を追加する。ステージ判定のように、特定のシーンでのみ表示するようにする。ブキ判定はWAVE開始シーンでのみ表示する。
$ ブキ判定ボタンのうち、不明のボタンに確率が表示されていないのを修正する。
$ weapon_utilsのweapon_classesとweapon_classes_jaをREADMEのブキの一覧から作り直す。また、weapon_typesにotherを追加し、unknownはotherに含めるようにする。モデルの出力層の数が合わない気がしているので、正確に各要素を作る。
これにより、READMEから1つ読み取られていなかったことが分かった
ひとつずつ目で見てやるのは大変やから助かったけど、最初から全部やっといてくれよな感じはした……
$ ここまでの変更をコミット。コミットログは日本語で書く
$ 訓練データ作成ツールで、右側に配置される判定用ボタンのwidthを固定化する変数を追加する。左側のシーン判定ではscene_button_widthを使っているが、右側は150pxの固定で変数を作り、右側の各ボタンはこのwidthを設定するようにする。
UI系の変更は期待しない結果になることが多いから、直前でコミットを入れて戻せるようにする…
実際は150pxという設定はできないみたいで、150文字分くらいの場所をとられたので、手動で値を変更して微調整した
$ ここまでの変更をコミット。コミットログは日本語で書く
$ 潮位判定用のutilsを作成。ブキ判定と同じく、WAVE開始のシーンでのみ判定を行う。潮位の種類はREADMEを参照のこと。判定時の選択肢には不明を追加する。
$ 訓練データ作成ツールで、シーンがWAVE開始なら、ブキ判定と潮位判定の両方を表示する必要があるが、潮位判定しか表示されていない。ブキ判定の枠の下に潮位判定の枠が続くように配置する
$ ここまでの変更をコミット。コミットログをは日本語で書く
$ 潮位と書いていたが、水位が正しい言葉だった。READMEや各プログラムで潮位と記述していた箇所を水位で統一する。
$ ここまでの変更をコミット。コミットログは日本語で書く。
$ 特殊イベント判定用のutilsを作成。ブキ判定や水位判定と同じく、WAVE開始のシーンでのみ判定を行う。特殊イベントの種類はREADMEを参照のこと。判定時の選択肢には不明を追加する。
$ ここまでの変更をコミット。コミットログは日本語で書く
$ 訓練データ作成ツールで、シーンによっては右側に複数の判定用のボタン群を表示する必要があり、画面に収まらないことが起きうる。そのため、判定用ボタン群を表示したり非表示にしたりするための仕組みを作る。判定ボタン群に見出しを付け、見出しの選択によってボタン群の表示非表示を切り替える。
タブの仕組みの代わりになるかはわからないけど、必要な部分だけを開く方針にしてみる
この説明て _create_collapsible_frame って関数が作られてて、意図が伝わってることに驚く
$ 見出しに判定された結果とその確率も表示するように修正する。
$ ここまでの変更をコミット。コミットログは日本語で書く
$ 訓練データ作成ツールで、操作するたびにリサイズが行なわれ、画面下部のステータスバーが画面から追い出される。ステータスバーが画面から追い出されないように修正する
$ ここまでの変更をコミット。コミットログは日本語で書く
$ 訓練データ作成ツールで右側に表示される判定ボタン群の見出しについて、シーンの判定が行なわれるたびに全ての見出しを閉じた状態にする
$ いずれかの見出しを開いた場合、他に見出しはすべて閉じるようにする
$ ここまでの変更をコミットする。コミットログは日本語で書く
$ 訓練デー差作成ツールで、ジョブ結果シーンとエモートシーンで行なう、成功失敗判定のutilファイルを作成する。ステージ判定utilを参考にする。成功・失敗以外に、不明も選択肢に追加する。
$ ここまでの変更をコミット。コミットログを日本語で書く
$ 訓練データ作成ツールで、右側に複数の判定見出しがある場合に、キーボードショートカットで開く見出しを切り替えられるようにする。Qキーで開いている見出しの前の見出しを開くようにし、Eキーで開いている見出しの次の見出しを開くようにする。一番上の見出しが開いている状態でQキーを押されたらすべて閉じた状態に、一番下の見出しが開いている状態でEキーを押されたらすべて閉じた状態に、全ての見出しが閉じられている状態でQキーを押したら一番下の見出しを開き、全ての見出しが閉じられている状態でEキーを押したら一番上の見出しを開くようにする。
$ QキーとEキーでの動きは、そのとき表示されている判定見出しだけを対象にする。WAVE開始シーンでは、ブキ判定・水位判定・特殊イベント判定の3つがあるので、この3つだけを対象に切り替えが動くようにする
$ ここまでの変更をコミット。コミットログは日本語で書く
$ 訓練データ作成ツールで、シーンを変更した直後は全てのシーン別の見出しが閉じられている状態ではじまるところを、そのシーンのシーン別選択肢の一番上に表示される選択肢を開いた状態で始めるよう変更。ステージ紹介はステージ判定を、WAVE開始はブキ判定を、ジョブ結果は成功・失敗判定を開いた状態にする。
UI周りのいくつかは命令だけじゃ上手くできないことがあるので、手動で修正してしまう
シーンとシーン別の項目のマッピングを変数にいれておく
シーン別の判定項目のフレームを辞書型の変数に詰め込む
_create_collapsible_frame では LabelFrame を使わず、通常のFrameにborderで描画するよう変更
開いている見出しのindexを管理するための変数をもつ
色々修正しながら試して、結局4時間くらい手動でリファクタリングした
それでも期待したようなリファクタリングが十分にできなかったのでいったん中止
実行予定のプロンプト
$ READMEの記述とプログラムで一致していない部分が出始めているので、READMEとプログラムとで一致していない箇所を、実際のプログラムに沿うようにREADMEを修正する。
$ 訓練ツールのtraining_typeの説明の訓練の種類が増えてきたので、各種類の日本語名をまとめた表をつくるようにする
$ やられたと水没は他のシーンと共存するため、シーンとして扱うことが難しい。
$ utilsとモデルで出力数が一致しない場合、モデルファイルをリネームしてモデルファイルを新たに作る。読み込んでいたモデルも初期化モデルで上書きする
新しいブキなどが増えたときに、それまでのモデルを捨てるしかないのかどうか
出力層の数だけ増やすことができるなら、訓練ツールの機能として追加することで、モデルを使い捨てなくて済む
$ タブ機能にすることで、すべてのタブを辿りながら訓練データを出力するのに手間がかかるようになる。この手間を回避するために、現時点で選択されているシーンと、そのシーンで判定されているものをまとめて訓練データとして出力するボタンを追加する。またショートカットキーとして、Ctrl + Sで全項目出力ボタンと同じ動作をするようにする。
$ 訓練データ作成ツールで、動画の表示しているフレームの変更後は右側のシーン別の判定項目はすべて畳まれている状態になっているが、一番上の判定項目だけ開いた状態にするよう変更。
詰まったところ
ニューラルネットワークのモデルを2つのツールで連携できない
訓練データ作成ツールでは訓練ツールが作ったモデルを利用して訓練データを作り、
訓練ツールでは訓練データ作成ツールが作った訓練データを使って訓練を行なう。
しかし訓練データ作成ツールが初期化したモデルと、訓練ツールが初期化して訓練したモデルで、
出力の形式が一致しないことで正しく分類ができなかった。
これはそれぞれ違うモデルの作成ロジックが出来上がっていたから。
最初にどんな判定を行うのかがはっきりしたところで、そのためのプログラムを一つにまとめ、各ツールは共通の関数を使って動くようにしなくてはいけない
UIについてはどれだけ言葉を尽くしても伝わらない
GUIを必要とする場合、何が表示されない、何の幅を変更するなど命令しても、
そのことが上手く伝わらず、問題が解決されないことが多い。
仕方がないので期待したいUIのまま命令を行ない開発を続けていると、
関係ない命令で期待する変更が行われることもあったりと、
本当に狙った変更をさせることができない。
途中から人が手をいれようとしても、冗長すぎてリファクタリングから始まる
命令でジェンガ開発されていくプログラムを後から人が手を入れようとしても大変。
重複しているコードの整理から始まるし、あちこちに同じ値を持った変数があるし、
読むのも書き換えるのもまー大変。
リファクタリングを上手く命令できるようにならないといけなさそう。
ファイルサイズが肥大化しがち
ひとつのファイルに全て詰め込まれるため、気付いたら2000行を越えるようなファイルになっている
結局これもリファクタリングが必要になる
ファイルサイズが大きくなりすぎると、AIアシスタントに投げようにもサイズの最大にひっかかってエラーになる
修正にかかるコストが高くなってきたのでいったんここまで
何も知らないところから作り始めて、こんな簡単に機械学習できるのか!という驚きがあった
ただ何も知らない分野に突っ込んだがゆえに、こういう実装じゃなかったらよかったのに!という形になり、
それを修正するのに大きなコストがひつようになってきたので、
リファクタリングするのではなく、新しい設計で新しく作り直す方針に変更
作り始める前にある程度の方針を決めておかないといけないなーと再確認。
そしてどうしようもなくなったらいったん資産を捨てて、改めて命令しなおした方が早く作れてしまうという現状
更新履歴
2025/04/09 いったん終了
2025/04/04 かきはじめ