このページでは、「あったらいいので作りました。」で実際に使っている開発技術や、アプリ・システムを作る中で学んだことをまとめています。
単なる技術解説ではなく、麻雀CPUなどの自作アプリを実際に開発する中で使った方法や、うまくいかなかったこと、改善したことを中心に紹介しています。
Python・設計
アプリやシステムを作っていくと、機能が増えるにつれてコードも複雑になっていきます。
このブログでは、Pythonで実際にアプリを作る中で考えたクラス設計やファイル構成、役割分担などについて紹介しています。
主な内容
- Pythonでクラスを分ける考え方
- GUI・ロジック・AIの分離
- ゲーム開発のディレクトリ構成
- 機能追加しやすい設計
- 大きくなったコードの整理
- 実際のアプリを使った設計例
麻雀CPUの開発では、GUI、ゲーム進行、CPU判断、カメラ処理、画像認識などを分離し、それぞれの役割を明確にしながら開発しています。
YOLO
YOLO関連の記事では、モデルを学習するところだけではなく、学習データを準備するところから紹介しています。
YOLOモデル作成の流れ
画像を撮影
↓
牌の位置をアノテーション
↓
牌画像を切り出す
↓
貼り付け先を指定
↓
牌画像を射影変換して合成
↓
YOLOラベルを自動生成
↓
データ拡張
↓
YOLOで学習
実際の開発では、大量の画像をすべて手作業で用意するのではなく、一部の画像から学習データを自動生成する仕組みも作っています。
主な記事
- YOLOモデル作成の全体像
- OpenCVで学習画像を撮影する
- アノテーションツールを作る
- YOLOラベルから画像を切り出す
- 4点アノテーション
- 射影変換
- 学習データの自動生成
- Ultralytics YOLOで学習する
EfficientNet・画像分類
YOLOで検出した牌画像は、EfficientNetを使って分類しています。
画像分類では、いきなりすべての牌を判定するのではなく、
萬子・筒子・索子・字牌
を判定
↓
それぞれの牌の数字や種類を判定
という2段階の分類方法を採用しています。
主な内容
- EfficientNetの基本
- YOLOと画像分類を分ける理由
- 画像分類用データセット作成
- 誤認識画像の仕分け
- データ拡張
- Dataset設計
- timmを使った学習
- 評価
- YOLOとの統合
モデルを作るだけでなく、実際にCPUへ組み込み、間違えた画像を保存して再学習するところまで扱っていく予定です。
実際に作ったものから学ぶ
このブログでは、技術そのものを説明するだけではなく、
麻雀CPU
など、実際に作ったものを題材にしています。
技術だけを先に勉強するのではなく、
「これを作りたい」
↓
必要な技術を調べる
↓
実装する
↓
問題が起きる
↓
改善する
という流れで開発しています。
そのため、記事の中では成功した方法だけでなく、うまくいかなかった方法や、なぜ別の方法へ変更したのかについてもできるだけ残していきます。
実際に完成したアプリやシステムについては、「作ったもの」にまとめています。
→ 作ったもの
