チャレンジしたことの概要
2024年は、大きく4つのチャレンジに取り組めたと思っています。
- 初めてのPythonで初めてのDiscord BOTを作成。GAEで初めてのクラウドへのデプロイ
- 初めてQiitaに投稿
- microCMS、Astro、github action、Azure StaticWebApps、お名前.comで独自ドメインのブログ公開
- 遊んでいるFF14のプレイ動画から、プレイヤー名を黒塗りするWindowsアプリの作成、公開
このうち今も改善に取り組んでいるWindowsアプリ開発の過程や、そこから得られた結果、気づきなどをご紹介させていただきます。
チャレンジにおける過程(課題や、それに対するアプローチなど)
1.どうやって画像からプレイヤー名を検出するか
動画を1フレームずつ切り出して、画像にあるプレイヤー名を処理すればいいと漠然と考えていましたが、どのようにプレイヤー名を検出するかが最初のハードルでした。
- 画像をOCRしてプレイヤー名を文字認識する案
- プレイヤー名の前に付くアイコンでテンプレートマッチングを行い、位置を特定する案
- プレイヤー名を物体検出し、位置を特定する案
できるだけ開発のハードルが低いものから実際に簡単なコードを作成し、テストを行いました。
テストを行った結果、
- OCR
→ 5/100点。全然ダメ。文字部分を文字と認識できない箇所が多すぎた - テンプレートマッチング
→ 55/100点。アイコンが見えている時はマッチングが成功するが、アイコンが少しでも隠れるとスコアが大きく下がりました。部分的に隠れたアイコンもマッチングできるようにテンプレートを分割し複数回マッチングを行うことで改善を行いましたが、マッチングを行う回数分だけ処理回数も必要となり処理性能の悪化を招きました。またモンスターの背面などにプレイヤーが移動するとアイコンが完全に隠れてしまい、全くマッチングできない点は工夫で改善しにくい問題でした。 - 物体検出
→ 80/100点。アノテーション、学習、コーディング、テスト、とかなり手間がかかったが、プレイヤー名の検出精度が最も良かった。テンプレートマッチングのようにアイコンがない場合でも検出できたところも理想的
当初はOCRやテンプレートマッチングで簡単に実現できるだろうと考えていたものの、実際にテストを行い試してみると思っていたようには動作せず、またアイコンが隠れる状況など想定していたものの実際に動作させてみると力不足をはっきりと認識することができました。
"動画からプレイヤー名を消す"という目的を考えると、少しでもプレイヤー名を検出できない時間帯があるものは採用できず、開発コストがかかりそうですが物体検出によるプレイヤー名の検出を行うこととしました。
2.アプリの処理速度が遅い!
Pythonで開発を行っていました。物体検出はMMDETECTIONを使用し、アプリを公開しました。
プレイヤー名の検出自体はまずまずでしたが、あまりに処理が遅く、実際の15分程度のプレイ動画の処理に何時間もかかるような状態でした。
検出精度に重きを置きすぎ、テストでは短い動画でしか確認していなかったため、実際にユーザーが使うような動画での使用感からは大きく外れた状態になってしまっていました。
これ以降、性能改善のためにいろいろな手を尽くしたのですが、それ以外に実際に自分でもアプリを積極的に利用して常に使用感を確かめるようになりました。
それまでいろいろなやり方を試し最終的に良いものを作ったという自負があり、また物体検出という比較的新しい技術を利用しているということにうぬぼれていたような面もありました。
しかしながら実際には技術や過程よりもユーザーのアプリの使用感や体験が大切で、この点は取り組み方を大きく間違っていたと思います。
自分でアプリを利用することで大まかなユーザーの使用感も体験でき、また使用してアプリの挙動を見ることで新たな問題点や改善案、機能追加なども実装できたと思っています。
3.更なる処理速度の改善と精度向上を目指して
当初はMMDETECTIONを利用していましたが、処理速度の改善のためUltralytics YoloV8に切り替えを行いました。ApacheライセンスからAGPLライセンスの受け入れが必要でしたが、学習時間、処理速度、処理精度など全てが大幅に向上し、アプリとしてより完成度が高いものになりました。
ある日、ユーザより検出精度について指摘され、Yoloのパラメータをテストしていたのですが想像していたような挙動にならず、よくわからなかったためUltralyticsの公式Discordで質問を行いました。
質問したところ、結果的には若干の処理速度と精度の向上が行えたのですが、その際、YOLOの使い方を根本的に間違っていることを指摘されました。
私は、QiitaやZennなど技術サイトの投稿記事を探し、それをトレースすることで開発を進めることが多いのですが、そのどこかで見た記事に誤りがあったか私の認識の間違いがあったのだと思われます。
ユーザの記事は、一度何がしか成功したもので公式のドキュメントではわかりずらいところをいい感じに端折って最短ルートを示してあることが多く、新しい分野にチャレンジする時にはとても重宝するのですが、少し時間が経った記事ではバージョンアップなどで今では正しく動作しなかったり、そもそも正しい使い方ではなかったりすることもあります。ブログ作成時にもいろいろ記事も見ましたが、結局公式のドキュメントが一番役に立った、ということもありました。
とっかかりにはユーザー投稿の記事はとても役に立つのですが、公式のドキュメントをちゃんと確認することが大切だと感じました。
チャレンジの結果
Windowsアプリとして公開することができました。
ただそもそもニーズがあまりなかったのか、ダウンロード数や認知度はあまり伸びていない印象です。
ゲーム動画は60FPSが多いですが、私の環境で処理速度は20FPS程度と、まだかなり低速だと感じています。
またpyinstallerでのEXE化の影響でファイルサイズも巨大なため、Windowsアプリの開発言語となるVC++やC#などでの再実装ができないか検討しています。
チャレンジから得た気づき・学び
- まずは簡単なコードでいろんな案を試して評価すること
- 技術や苦労におぼれず、ユーザと同じく実際に使用してみて使用感を確認すること
- 公式のドキュメントを第一にしっかりと読むこと
ご参考
既に記事投稿しているものもありますのでご参考までにリンクしておきます。